Por que nem toda variável é inicializada com seu valor padrão específico de tipo de dados na declaração no Bash?

3

Quando executo o seguinte código na versão do Bash "GNU bash, versão 4.1.10 (4) -release (i686-pc-cygwin)", recebo:

declare a
declare -p a
# Output: -bash: declare: a: not found
declare -i b
declare -p b
# Output: -bash: declare: b: not found
declare -a c
declare -p c
# Output: declare -a c='()'
declare -A d
declare -p d
# Output: declare -A d='()'

Indiscutivelmente, acho que as variáveis acima devem ser inicializadas em todos os casos ou em nenhuma delas. Isso parece mais consistente do que inicializar apenas arrays mediante declaração.

    
por Tim Friske 27.11.2012 / 10:53

1 resposta

1

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.

    
por 27.11.2012 / 14:16

Tags