三元构造不等于if else else

时间:2013-11-08 11:18:15

标签: bash shell unix if-statement

以下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语句只与测试有关,因此在这里使用三元版本是不安全的。

我是对的吗?

2 个答案:

答案 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