是否有区别:
[ -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)
我无法诊断您的问题的根源,但回答这个问题在您的标题,这之间的唯一区别FIRST && SECOND和if 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.