1

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

我对吗?

4

2 回答 2

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"

不会打印任何东西

于 2013-11-08T11:26:20.253 回答
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
于 2013-11-08T11:31:39.647 回答