为什么使用 if 和 grep 的 bash 脚本每隔一次调用一次?

Mas*_*ter 1 linux bash grep if-statement

root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
root@xxx:/#  [ "`date | grep 20 | echo $?`" -gt "0" ] && echo 12
12
Run Code Online (Sandbox Code Playgroud)

它应该在每一行上回显 12,但只在奇数行上这样做。为什么?怎么修?

tha*_*guy 5

您假设foo | echo $?将显示 的退出状态foo。不是这种情况。相反,它显示前一个命令或管道的退出状态:

$ bash -c 'exit 42'
$ true | echo $?
42
Run Code Online (Sandbox Code Playgroud)

因此,您的命令会像这样翻转:

$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop
$ [ $? = 1 ] && echo "Boop"
$ [ $? = 1 ] && echo "Boop"
Boop
Run Code Online (Sandbox Code Playgroud)

您的目的是抑制grep输出(此处使用 完成-q),然后添加第二个命令(在 a 之后;)可以写出值:

# Check for success when running a command and writing out
# the exit status and capturing it and comparing it to success
[ "`date | grep -q 20; echo $?`" -gt "0" ] && echo 12
Run Code Online (Sandbox Code Playgroud)

但是,您可以删除所有冗余并执行以下操作:

# Check for success when running a command
date | grep -q 20 && echo 12
Run Code Online (Sandbox Code Playgroud)