我不太理解 bash 测试操作员的这种行为。我用这一行来确定是否安装了 vagrant。
if [ $(vagrant --version > /dev/null) ]; then echo "HELLO"; fi
我现在知道这会返回 false (1) 并且您应该只输入
if vagrant --version > /dev/null; then echo "HELLO"; fi
以获得预期的结果。但我仍然不明白为什么 [ $(vagrant --version > /dev/null) ] 返回 false (1)。它不应该返回 true (0) 因为
$(vagrant --version > /dev/null)
返回 true,这是一个表达式(不是吗?)。
从测试手册页:
测试实用程序计算表达式,如果计算结果为 true,则返回零 (true) 退出状态;否则返回 1(假)。如果没有表达式,test 也返回 1 (false)。
答案1
所有这些都是等价的:
[ $(vagrant --version > /dev/null) ]
[ ]
test
shell 与其他编程语言不同。它们有 2 个输出:返回值和标准输出。您将 stdout 传递给test
,但 stdout 是空字符串,因为它已被重定向。
你正在寻找的是。
[ $(vagrant --version > /dev/null; echo $? ) ]
然而[ 0 ]
等都[ 1 ]
返回 true,因为[ … ]
里面有一个单词测试该单词是否非空。所以你需要
[ $(vagrant --version > /dev/null; echo $? ) = 0 ]
或者更简单地说
vagrant --version > /dev/null