贝壳尾巴| grep -q总是返回true
发布时间:2020-12-15 21:02:06 所属栏目:安全 来源:网络整理
导读:当我执行这段代码时,循环总是在第一次结束(即使最后两行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 DONE 你知道为什么c = $(tail
当我执行这段代码时,循环总是在第一次结束(即使最后两行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 DONE 你知道为什么c = $(tail -2 /var/log/auth.log | grep -q“exit”)总是得到某种字符串吗?我认为这是因为尾巴. 我可以使用-o选项然后比较字符串,但我更喜欢在if条件中使用布尔值. 解决方法
grep -q by design不返回任何输出,只是通过退出代码发出是否找到匹配的信号.
因此,您可以直接使用您的管道作为条件: 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条件总是求值为true. 要明确:$c,因为它没有在条件中使用(如果$c; …而不是if [“$c”]; …),被解释为执行而不是作为执行的命令用于测试空虚的字符串. 如果在$c中捕获其输出的命令是生成stdout输出,则必须使用条件测试:if [-n“$c”];那么……(或者,更简洁,如果[“$c”];那么……). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |