![Shell:为什么 [ -n "${VAR-}" ] 而不是 [ -n "$VAR" ]?](https://linux22.com/image/113472/Shell%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%20%5B%20-n%20%22%24%7BVAR-%7D%22%20%5D%20%E8%80%8C%E4%B8%8D%E6%98%AF%20%5B%20-n%20%22%24VAR%22%20%5D%EF%BC%9F.png)
我看到很多 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 -n
test -z
我自己没有见过这个,所以我只能猜测,没有经验的 shell 程序员可能会认为未设置值和一个空的关于如何test -n
工作的价值,但这只有在test
(即[
)既是内置的又是有缺陷的情况下才会发生;或者如果有人试图使用set -u
而不考虑其含义,然后以这种方式防御它。