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

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

我发现

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

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

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

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

答案1

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

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

true然后使用和false作为参数运行它。

./script true
0
0

./script false
0
1

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

在OP的例子中,我们假设该文件不存在:

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

退出代码非常重要。查看set -e 在 bash 脚本中意味着什么?查看set -etrap和的可能含义set -o pipefail

答案2

[ -f file ]file存在时为 true是一个plain file.

[ ! -f file ]file不存在时为 true或者是另一种文件类型。

因此,除了可读性之外,没有真正的区别。

相关内容