gpt4 book ai didi

shell - 尾部 | grep -q 总是返回真

转载 作者:行者123 更新时间:2023-12-01 02:01:37 29 4
gpt4 key购买 nike

当我执行这段代码时,循环总是在第一次结束(即使 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 中使用 bool 值健康)状况。

最佳答案

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按设计从不返回标准输出 - if条件总是评估为真。

要清楚: $c ,因为它没有在条件( if $c; ... 而不是 if [ "$c" ]; ... )中使用,被解释为要执行的命令,而不是用于测试是否为空的字符串。

如果在 $c 中捕获其输出的命令要生成标准输出,您必须使用条件进行测试: if [ -n "$c" ]; then ... (或者,更简洁地说, if [ "$c" ]; then ... )。

关于shell - 尾部 | grep -q 总是返回真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35966500/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com