local foo=""
e local foo=
são exatamente equivalentes. Em ambos os casos, o lado direito do sinal de igual é uma string vazia.
local foo
e local foo=
são diferentes: local foo
deixa foo
não definido enquanto local foo=
define foo
como uma string vazia. Mais precisamente, local foo
cria uma variável local e essa variável é inicialmente não definida. Uma atribuição subsequente foo=…
define o valor local e essa atribuição pode ser combinada com a instrução local
. Testemunha:
bash-4.3$ demo () {
local unset empty=
echo "unset=\"${unset-(not set)}\" empty=\"${empty-(not set)}\""
}
bash-4.3$ demo
unset="(not set)" empty=""
Este é o mesmo comportamento do ksh (exceto que em ksh você precisa usar a palavra-chave typeset
em vez de local
). Por outro lado, em zsh, local foo
define foo
para uma string vazia.