之间是否存在差异:
[ -f $FOO ] && do_something
...和
if [ -f $FOO ]; then
do_something
fi
我认为它们是等价的,因为[
只是test
的别名,当条件通过时会退出0。但是,在我编写的脚本中,我正在检查是否设置了一些环境变量,如果不设置,则要进行纾困。在这种情况下:
[ -z "${MY_ENV1+x}" -a -z "${MY_ENV2+x}" ] && fail "Oh no!"
...似乎总是拯救;即使设置了$MY_ENV1
和$MY_ENV2
,也是如此。但是,if
版本可以正常运行:
if [ -z "${MY_ENV1+x}" -a -z "${MY_ENV2+x}" ]; then
fail "Oh no!"
fi
...其中fail
定义为:
fail() {
>&2 echo "$@"
exit 1
}
答案 0 :(得分:5)
我无法诊断您问题的根源但回答标题中的问题,这是我所知道的FIRST && SECOND
和if FIRST; then SECOND; fi
之间的唯一区别。
如果FIRST
评估为真,则没有区别。
如果FIRST
的计算结果为false,则整个表达式FIRST && SECOND
的结果为false。如果你的shell设置了-e
标志,这将导致它中止。另一方面,如果if
的计算结果为false,则使用FIRST
语句的版本将永远不会产生任何结果,因此即使设置了-e
,shell也会继续愉快。
因此,如果我负担不起失败状态,我有时会写更详细的if FIRST; then SECOND; fi
。这可能很重要,例如,在撰写Makefile
时,或者如果您习惯使用-e
来运行脚本。