使用嵌套的管道命令编写bash条件



以下bash命令:

aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l

打印:

0

我想要的是,当结果确实为0时,将FAILURE打印到终端。

这就是我尝试过的:

if [ aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l = 0]; then echo FAILURE; fi

但是什么都没有打印出来。看起来它正在等待更多的输入。

您根本不需要wc。如果行计数为零,则意味着grep没有产生输出,在这种情况下,它将具有非零退出状态。无论如何,if语句只关心退出状态。

if ! aws ls s3://bucket/dir | grep -q _SUCCESS; then
echo FAILURE
fi

!否定管道的退出状态(这是最左边故障的存在状态,否则为0(,这样您就不必编写类似的东西

if aws ls s3://bucket/dir | grep -q _SUCCESS; then
:  # Do nothing
else
echo FAILURE
fi

grep -q抑制其输出,因为您只关心退出状态,而不关心实际输出。


严格来说,如果不匹配,grep的退出状态为1,如果实际存在错误,则为不同的非零值,通常为2。如果需要,则需要在运行命令后明确检查$?的值。

aws ls s3://bucket/dir | grep -q _SUCCESS
case $? in
0) : ;;
1) echo FAILURE ;;
*) echo "Some other error" ;;
esac

怎么样:

if [ "$(aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l)" -eq 0 ]; then echo FAILURE; fi

最新更新