尾巴| grep -q总是返回true

时间:2016-03-13 04:31:45

标签: shell

当我执行此代码时,循环总是在第一次结束(即使auth.log的最后两行不包含“exit”),这意味着$c总是得到一些字符串:

while true;
do
    c=$(tail -2 /var/log/auth.log | grep -q "exit")
    if $c ;
    then
            echo "true"
            unset c
            break
    fi

完成

你知道为什么c=$(tail -2 /var/log/auth.log | grep -q "exit")总会得到某种字符串吗?我认为这是tail的原因。

我可以使用-o选项然后比较字符串,但我更喜欢在if条件中使用布尔值。

1 个答案:

答案 0 :(得分:3)

设计

grep -q不返回输出,只是通过退出代码发出是否找到匹配的信号。

因此,您可以直接使用管道 作为条件:

while true;
do
    if tail -2 /var/log/auth.log | grep -q "exit";
    then
            echo "true"
            break
    fi
done

至于你的尝试:

正如Benjamin W.暗示在问题的评论中,执行命令扩展到空字符串始终被视为成功命令。

注意:命令是否实际为空,因为有问题的变量是未设置,或者在本例中,显式分配了一个空(空)字符串,这无关紧要。功能

因此,假设$c总是空的 - 因为设计grep -q永远不会返回stdout输出 - if条件总是计算为真。

要明确:$c,因为在条件if $c; ...而不是if [ "$c" ]; ...)中使用 ,被解释为执行的命令,而不是作为字符串来测试空虚

如果$c中捕获其输出的命令是生成标准输出,则必须使用条件测试该输出:{{ 1}}(或者,更简洁,if [ -n "$c" ]; then ...)。