Suponho que sempre é possível declarar e inicializar as variáveis da seguinte forma com segurança e uniformidade:
declare a=""
declare -p a
# Output: declare -- a=""
declare -i b=0
declare -p b
# Output: declare -i b="0"
declare -a c=()
declare -p c
# Output: declare -a c='()'
declare -A d=()
declare -p d
# Output: declare -A d='()'
Dado que parece haver um comportamento diferente em diferentes versões do shell Bash.
Quando um não fornece um valor de inicialização explícito ao declarar uma variável, o resultado pode não ser o que se espera, conforme demonstrado no exemplo a seguir com variáveis locais:
function foobar {
declare a
declare -i b
declare -a c
declare -A d
declare -p a b c d
a=a
b=42
c+=(c)
d+=([d]=42)
declare -p a b c d
}
foobar
# Output:
# declare -- a=""
# declare -i b=""
# declare -a c='()'
# declare -A d='()'
# Output:
# declare -- a="a"
# declare -i b="42"
# declare -a c='([0]="c")'
# declare -A d='([d]="42" )'
declare -p a b c d
# Output:
# bash: declare: a: not found
# bash: declare: b: not found
# bash: declare: c: not found
# bash: declare: d: not found
No caso de variáveis locais e inicialização tardia, tudo funciona conforme o esperado. Particularmente observe que o primeiro declare -p a b c d
dentro da função foobar
relata todas as variáveis como sendo inicializadas para seus valores padrão específicos de tipo de dados. Compare isso com o caso de variável global, em que as variáveis a
e b
foram relatadas como -bash: declare: a: not found
e -bash: declare: b: not found
, respectivamente.