好的,所以我正在学习Bash,还有那个练习;
“编写一个脚本,如果用户'user000'已登录,则每十秒检查一次。”
我的想法是grep
一个who
,但我不知道如何将其合并到一个脚本中。我试过像
if [ `who | grep "user000"` ] then things
但它返回匹配的行与grep,而不是true / false。
答案 0 :(得分:7)
你想要grep -q
。这是“安静的模式”;只根据是否有任何匹配设置状态,不输出任何内容。所以:
if who | grep -q "user000"; then things; fi
答案 1 :(得分:3)
你可以做到
who | grep "user000" > /dev/null 2>&1
# You can use "-q" option of grep instead of redirecting to /dev/null
# if your grep support it. Mine does not.
if [ "$?" -eq "0" ]
then ...
这使用$? - 一个Shell变量,用于存储已执行的最后一个命令的返回/退出代码。 grep
在成功时退出,返回代码为“0”,在失败时退出非零(例如,找不到行返回“1”) - 顺便说一句,这是Unix命令的典型安排。
答案 2 :(得分:2)
如果您正在if
或while
中测试管道或命令的退出代码,则可以不使用方括号和反引号(您应该使用$()
代替无论如何反对):
if who | grep "user000" > /dev/null 2>&1
then
things-to-do
fi
答案 3 :(得分:1)
大多数答案都有正确的想法,但实际上你想要从grep中删除所有输出,包括错误。另外,对于if:
,在]之后需要分号if who | grep 'user000' >/dev/null 2>&1; then
do things
fi
如果您使用的是GNU grep,则可以使用-s
和-q
选项代替:
if who | grep -sq 'user000'; then
do things
fi
编辑:删掉括号;如果只需要括号进行比较操作
答案 4 :(得分:0)
这可能不是最优雅的咒语,但我倾向于使用:
if [ `who | grep "user000" | wc -l` = "1" ]; then ....