是否有理由使用“[ ! -f file ] || command”而不是“[ -f file ] && command”?

Kar*_*ter 4 bash shell-script

我发现

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)

/etc/default/lxcUbuntu 16.04 上,它似乎正在替换(我自己的或包维护者代码)

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net
Run Code Online (Sandbox Code Playgroud)

由于测试是违反直觉的(如果关于文件不存在的测试失败,请运行命令)我想知道它是否比&&-version有任何优势。

mmo*_*oya 5

是的,如果您关心复合语句退出代码。请尝试以下操作:

#/bin/sh

! $1 || true
echo $?

$1 && true
echo $?
Run Code Online (Sandbox Code Playgroud)

然后使用truefalse作为参数运行它。

./script true
0
0

./script false
0
1
Run Code Online (Sandbox Code Playgroud)

这是因为布尔表达式的短路评估

在 OP 的示例中,假设文件不存在

  • 在第一种情况下,第一个条件返回 TRUE,无需评估第二个操作 ( TRUE OR x = TRUE)。您得到复合语句的 TRUE。
  • 在第二种情况下,第一个条件返回 FALSE,无需评估第二个操作 ( FALSE AND x = FALSE)。您得到复合语句的 FALSE。

退出代码非常重要。检查此 SO答案以查看set -e,trap和 的可能含义set -o pipefail

  • 您可能希望将 `-e` 选项作为人们可能非常关心退出代码的原因之一。 (3认同)