【发布时间】:2016-03-13 04:31:44
【问题描述】:
当我执行这段代码时,循环总是在第一次结束(即使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 条件内使用布尔值。
【问题讨论】:
-
我的意思是 grep -q 的输出可以只是“真”(0)(如果有一些字符串匹配“退出”)或(假)(1)如果它是空的,但似乎如果 auth.log 在最后 2 行中没有“exit”,则 $c 有一些字符串
-
试试这个就明白了:
unset c; if $c; then echo "Evaluated to true"; fi -
如果我尝试这个,它会跳转到循环
-
关键是如果你使用一个未设置的参数作为条件,它总是评估为真。查看参数是否等于空字符串的测试将是
[ -z "$c" ](或[ -n "$c" ]以测试它是否不是空字符串),但主要问题已在 mklement0 的答案中得到解答。 -
谢谢家伙,现在它就像一个魅力
标签: shell