我发现
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
在/etc/default/lxc
Ubuntu 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 -e
、trap
和的可能含义set -o pipefail
。
答案2
[ -f file ]
file
存在时为 true和是一个plain file
.
[ ! -f file ]
file
不存在时为 true或者是另一种文件类型。
因此,除了可读性之外,没有真正的区别。