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.