当我执行此代码时,循环总是在第一次结束(即使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
条件中使用布尔值。
答案 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 ...
)。