如何检查grep是否没有输出?

时间:2014-12-10 02:31:55

标签: bash if-statement null grep

所以我需要检查收件人用户名是否在/ etc / passwd中,其中包含我班级中的所有用户,但是我尝试了一些if语句和grep的不同组合但没有成功。我能想到的最好的是下面的,但我认为它不能正常工作。 我背后的逻辑是,如果grep为null,则用户无效。

send_email()
{
  message=
  address=
  attachment=
  validuser=1
  until [ "$validuser" = "0" ]
    do
    echo "Enter the email address: "
    read address
    if [ -z grep $address /etc/passwd ]
      then
    validuser=0
    else
        validuser=1
    fi
    echo -n "Enter the subject of the message: "
    read message
    echo ""
    echo "Enter the file you want to attach: "
    read attachment
    mail -s "$message" "$address"<"$attachment"
    done
    press_enter 
}

5 个答案:

答案 0 :(得分:42)

如果是这样的话就做一个简单的事情:

if grep -q $address  /etc/passwd
then 
   echo "OK";
else
   echo "NOT OK";
fi

此处使用-q选项只是为了使grep 安静(不输出...)

答案 1 :(得分:15)

使用getent并检查grep的退出代码。避免使用/ etc / passwd。在shell中等价:

> getent passwd | grep -q valid_user
> echo $?
0

> getent passwd | grep -q invalid_user
> echo $?
1

答案 2 :(得分:3)

你的代码

if [ -z grep $address /etc/passwd ]

您尚未将grep $address /etc/passwd的结果保存在变量中。在将它放入if语句之前,然后测试变量以查看它是否为空。

你可以这样试试

    check_address=`grep $address /etc/passwd`
    if [ -z "$check_address" ]
      then
    validuser=0
    else
        validuser=1
    fi

答案 3 :(得分:2)

-z检查用于变量字符串,grep没有给出。要从grep命令中提供值,请将其括在$():

if [ -z $(grep $address /etc/passwd) ]

答案 4 :(得分:2)

最简单的一个是这个

$ cat test123
12345678

$ cat test123 | grep 123 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist"
grep result exist

$ cat test123 | grep 999 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist"
grep result doesn't exist