我想在cat /etc/passwd | grep“sysa”不为真时执行echo命令。

我做错了什么?

if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi

当前回答

在支持它的Unix系统上(似乎不是macOS):

if getent passwd "$username" >/dev/null; then
    printf 'User %s exists\n' "$username"
else
    printf 'User %s does not exist\n' "$username"
fi 

这样做的好处是,它将查询可能正在使用的任何目录服务(YP/NIS或LDAP等)和本地密码数据库文件。


grep -q "$username" /etc/passwd的问题是,当没有这样的用户时,它会给出一个错误的阳性结果,但其他用户与模式匹配。如果文件中的其他地方有部分或完全匹配,就会发生这种情况。

例如,在我的passwd文件中,有一行写着

build:*:21:21:base and xenocara build:/var/empty:/bin/ksh

这将在cara和enoc等上引发有效的匹配,即使我的系统上没有这样的用户。

要正确使用grep解决方案,您需要正确解析/etc/passwd文件:

if cut -d ':' -f 1 /etc/passwd | grep -qxF "$username"; then
    # found
else
    # not found
fi

... 或针对:分隔字段的第一个字段的任何其他类似测试。

其他回答

简单:

if ! examplecommand arg1 arg2 ...; then
    #code block
fi

没有括号。

我认为可以简化为:

grep sysa /etc/passwd || {
    echo "ERROR - The user sysa could not be looked up"
    exit 2
}

或者在单个命令行中

$ grep sysa /etc/passwd || {echo "ERROR - The user sysa could not be lookup ";出口2;}

try

if ! grep -q sysa /etc/passwd ; then

如果Grep找到了搜索目标,则返回true,如果没有找到,则返回false。

所以不是假的(!False) == true。

如果shell中的求值被设计得非常灵活,并且很多时候不需要命令链(正如您所写的那样)。

此外,查看您的代码,您使用$(…)cmd替代的形式是值得赞扬的,但是考虑一下这个过程会带来什么。试试echo $(cat /etc/passwd | grep "sysa")看看我的意思。您可以进一步使用-c (count)选项grep,然后执行if ![$(grep -c "sysa" /etc/passwd) -eq 0];那么这是一个相当老派的方法。

但是,您可以使用最新的shell特性(算术计算),例如

if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`

这也使您可以使用基于c-lang的比较操作符,==,<,>,>=,<=,%以及其他一些操作符。

在这种情况下,根据orwelloile的评论,算术计算可以进一步削减,比如

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

OR

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

最后,还有一个叫做无用猫奖(uoc)的奖项。:-)有些人会上蹿下跳地喊gothca!我只想说,grep可以在它的cmd行上使用文件名,那么为什么要调用不必要的额外进程和管道结构呢?: -)

我希望这能有所帮助。

我希望在答案中看到直接使用grep和-q选项(因为我们不关心结果,但只需要返回代码)。

if ! grep -qs "sysa" /etc/passwd; then
        echo "ERROR - The user sysa could not be looked up" >&2
        exit 2
fi

或(在失败时使用链式执行)

grep -qs "sysa" /etc/passwd || {
        echo "ERROR - The user sysa could not be looked up" >&2
        exit 2
}

更好的是,因为需要相反的东西,所以有选项-v

if grep -qsv "sysa" /etc/passwd; then
        echo "ERROR - The user sysa could not be looked up" >&2
        exit 2
fi

或者(在成功时使用链式执行)

grep -qsv "sysa" /etc/passwd && {
        echo "ERROR - The user sysa could not be looked up" >&2
        exit 2
}

笔记

我喜欢将错误消息重定向到stderr,但回显输出到stdout,因此>&2 泰勒搜索模式,例如'^sysa:'如果它是完全登录。

这一个

if [[ !  $(cat /etc/passwd | grep "sysa") ]]; then
  echo " something"
  exit 2
fi