我们来看一个片段:
set -o nounset
var="${var}something"
echo $var
它失败并出现错误:
unset.sh: line 3: var: unbound variable
但是当我使用+=
运算符时
set -o nounset
var+=something
echo $var
它运行没有错误并打印:
something
对我来说,这样的行为似乎有点出乎意料。可以吗?var+=something
和 的行为应该var=${var}something
相似还是可以不同?
答案1
这里需要注意的是 shellbash
将 POSIX 选项的范围限制nounset
为仅有的变量的显式扩展。
也就是说,nounset
只有当您尝试显式扩展未设置的变量时,shell 选项才会起作用。这正在发生var="${var}something"
,但不是在var+=something
。
该语句var+=something
没有提及$var
,因此没有任何未设置变量的显式扩展。
在我看来,这是可以的bash
,原因有两个:
- 我想
nounset
参考变量的显式扩展。 - 该
+=
运算符是 POSIX 标准的扩展,因此 POSIX shell 选项不需要影响它。
var
如果您需要在向其附加值之前检查是否已定义,请使用类似
if [[ -v var ]]; then
var+=something
else
echo 'Unset variable var' >&2
exit 1
fi
(即使用内置测试进行测试-v
),或者,如果您依赖于nounset
捕获未设置变量的实际使用,请使用var=${var}something
语法。