链接`test`和使用`if`语句之间的区别

Xop*_*ter 1 bash

是否有区别:

[ -f $FOO ] && do_something
Run Code Online (Sandbox Code Playgroud)

...和:

if [ -f $FOO ]; then
  do_something
fi
Run Code Online (Sandbox Code Playgroud)

我认为它们是等价的,因为[它只是一个别名test,当条件通过时它会退出0.但是,在我编写的脚本中,我正在检查是否设置了一些环境变量,如果不设置,则要进行纾困.在这种情况下:

[ -z "${MY_ENV1+x}" -a -z "${MY_ENV2+x}" ] && fail "Oh no!"
Run Code Online (Sandbox Code Playgroud)

...似乎总是纾困; 即使$MY_ENV1$MY_ENV2 设定.但是,if版本正常工作:

if [ -z "${MY_ENV1+x}" -a -z "${MY_ENV2+x}" ]; then
  fail "Oh no!"
fi
Run Code Online (Sandbox Code Playgroud)

......其中fail定义为:

fail() {
  >&2 echo "$@"
  exit 1
}
Run Code Online (Sandbox Code Playgroud)

5go*_*der 5

我无法诊断您的问题的根源,但回答这个问题在您的标题,这之间的唯一区别FIRST && SECONDif FIRST; then SECOND; fi我知道.

如果FIRST评估为true,则没有区别.

如果FIRST计算结果为false,则整个表达式的结果FIRST && SECOND为false.如果你的shell -e设置了标志,这将导致它中止.if另一方面,使用该语句的版本如果FIRST求值为false 则永远不会产生任何结果,因此即使-e设置了shell,shell也会继续愉快.

因此,if FIRST; then SECOND; fi如果我负担不起失败状态,我有时会写得更详细.这可能很重要,例如,在编写Makefiles时,或者如果你习惯于运行脚本-e.