什么时候是" [$(命令)]"相当于" if命令;然后...&#34 ;?

时间:2016-05-05 11:52:44

标签: bash if-statement

answering a question并假设

if [ $(command) ]; then ...

总是等同于

if command; then ...

但是,我得到了a couple of counter examples

$ [ $(true) ] && echo "yes" || echo "no"
no
$ if true; then echo "yes"; else echo "no"; fi
yes

$ if echo "$xxxx"; then echo "yes"; else echo "no"; fi

yes
$ [ $(echo "$xxx") ] && echo "yes" || echo "no"
no

在这两种情况下,问题在于trueecho $xxxx(未设置变量)不返回任何内容,因此[ ]的计算结果为False(by definition in man test),而{{{} 1}}成功,因此其返回码为0,因此echo $xxxx条件的计算结果为True。

但是,我想知道:我们什么时候可以假设这两项检查都是等价的?在大多数情况下,这是假设的还是可靠的?

2 个答案:

答案 0 :(得分:4)

我会说,它们等于非等同于很少if检查执行的命令的返回码(0表示成功/ true,其他任何失败/ false),并且在stdout上生成的输出之间不一定存在任何关联(这是{{ 1}}查找)和0返回代码。

答案 1 :(得分:4)

这两个陈述完全不同。当你写

if command; then ...

您正在测试命令的退出代码。如果为零,则执行该块。另一方面,当你写

if [ $(command) ]; then ...

您实际上是在测试命令的输出,而不是退出代码。

您链接的示例有效的原因是因为grep只有在找到匹配项时才会打印到标准输出。