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

时间:2016-01-28 14:41:55

标签: bash

之间是否存在差异:

[ -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
}

1 个答案:

答案 0 :(得分:5)

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

如果FIRST评估为真,则没有区别。

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

因此,如果我负担不起失败状态,我有时会写更详细的if FIRST; then SECOND; fi。这可能很重要,例如,在撰写Makefile时,或者如果您习惯使用-e来运行脚本。