所以我需要检查收件人用户名是否在/ 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
}
答案 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