bash 中字符串连接时的名词集选项

bash 中字符串连接时的名词集选项

我们来看一个片段:

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,原因有两个:

  1. 我想nounset参考变量的显式扩展。
  2. +=运算符是 POSIX 标准的扩展,因此 POSIX shell 选项不需要影响它。

var如果您需要在向其附加值之前检查是否已定义,请使用类似

if [[ -v var ]]; then
    var+=something
else
    echo 'Unset variable var' >&2
    exit 1
fi

(即使用内置测试进行测试-v),或者,如果您依赖于nounset捕获未设置变量的实际使用,请使用var=${var}something语法。

相关内容