Bash脚本 - 脚本中的execute和grep命令

时间:2009-10-28 16:43:35

标签: bash

好的,所以我正在学习Bash,还有那个练习;

“编写一个脚本,如果用户'user000'已登录,则每十秒检查一次。”

我的想法是grep一个who,但我不知道如何将其合并到一个脚本中。我试过像

这样的东西
if [ `who | grep "user000"` ] then things

但它返回匹配的行与grep,而不是true / false。

5 个答案:

答案 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)

如果您正在ifwhile中测试管道或命令的退出代码,则可以不使用方括号和反引号(您应该使用$()代替无论如何反对):

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 ....