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,但只在奇数行上这样做。为什么?怎么修?
您假设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)