Shell:为什么 [ -n "${VAR-}" ] 而不是 [ -n "$VAR" ]?

Shell:为什么 [ -n "${VAR-}" ] 而不是 [ -n "$VAR" ]?

我看到很多 shell 脚本(例如,这个) 检查变量是否存在,例如:

[ -n "${VAR-}" ]

据我所知,在检查变量存在/不存在(或)时,使用${VAR-fallback}不提供 a 的表单没有任何意义。也同样如此。例如,对于未设置的变量,fallback-n-z${VAR:-fallback}

unset VAR
[ -z "$VAR" ]       &&
  [ -z "${VAR-}" ]  &&
  [ -z "${VAR:-}" ] &&
  echo True        # => True

并带有一个空变量

VAR=
[ -z "$VAR" ]       &&
  [ -z "${VAR-}" ]  &&
  [ -z "${VAR:-}" ] &&
  echo True        # => True

但我在足够多的地方看到它,我不得不问,我是否错过了什么?这只是一种误解导致了误用,还是确实有这样做的理由?

答案1

如果set -u有效且未VAR设置,[ -z "$VAR" ]将导致错误。使用[ -z "${VAR-}" ]默认值会覆盖对使用未设置变量的检查,并且不会出现错误。

答案2

你是绝对正确的 - 没有理由使用该表格或带有or 的${VAR:-}表格。${VAR-}test -ntest -z

我自己没有见过这个,所以我只能猜测,没有经验的 shell 程序员可能会认为未设置值和一个空的关于如何test -n工作的价值,但这只有在test(即[)既是内置的又是有缺陷的情况下才会发生;或者如果有人试图使用set -u而不考虑其含义,然后以这种方式防御它。

相关内容