Vamos a um trecho:
set -o nounset
var="${var}something"
echo $var
Ele falha com erro:
unset.sh: line 3: var: unbound variable
No entanto, quando eu uso +=
o operador
set -o nounset
var+=something
echo $var
ele roda sem erro e imprime:
something
Para mim, tal comportamento parece um pouco inesperado. Está tudo bem? Devem var+=something
e var=${var}something
se comportam de forma semelhante ou está tudo bem que eles sejam diferentes?
Uma coisa a notar aqui é que o
bash
shell limita o escopo danounset
opção POSIX a apenas expansões explícitas de variáveis.Ou seja, a
nounset
opção shell só entra em ação quando você tenta expandir explicitamente uma variável que não está definida. Isso está acontecendo emvar="${var}something"
, mas não emvar+=something
.A instrução
var+=something
não contém menção a$var
, portanto, não há expansão explícita de qualquer variável não definida.Na minha opinião, tudo bem que seja assim em
bash
, por dois motivos:nounset
me referir a expansões explícitas de variáveis.+=
operador é uma extensão do padrão POSIX, portanto, uma opção de shell POSIX não precisa afetá-lo.Se você precisar verificar se
var
está definido antes de anexar um valor a ele, use algo como(ou seja, teste com o
-v
teste interno), ou, se você confianounset
para capturar usos reais de variáveis não definidas, use avar=${var}something
sintaxe.