以下if / then测试(在bash中):
if [ 1 ]; then ls /undef_dummy > /dev/null 2>&1; else echo "else stmt"; fi
似乎不等同于它的三元版本:
(test 1) && ls /undef_dummy > /dev/null 2>&1 || echo "else stmt"
第一个将打印除了第二个将打印“else stmt”。
这是因为||三元版本中的运算符与测试通过时执行的测试或的返回状态有关。但通常,我们想要的 else语句只与测试有关,因此在这里使用三元版本是不安全的。
我是对的吗?
答案 0 :(得分:4)
此命令:
(test 1) && ls /undef_dummy > /dev/null 2>&1 || echo "else stmt"
正在评估 ||
,因为ls
正在向shell返回非零返回码
如果您使用此命令:
test 1 && date || echo "else stmt"
然后它将打印日期值而不是else stmt
通过适当的分组命令:
test 1 && { ls /undef_dummy > /dev/null 2>&1 || true; } || echo "else stmt"
不会打印任何内容
答案 1 :(得分:1)
您所指的三元版实际上等同于:
if (test 1); then
if ! ls /undef_dummy > /dev/null 2>&1; then
echo "else stmt"
fi
fi
与说法完全不同:
if [ 1 ]; then ls /undef_dummy > /dev/null 2>&1; else echo "else stmt"; fi