O 'declare -p' verifica se uma variável (incluindo uma variável de matriz) está definida?

0

O declare -p verifica se uma variável (incluindo uma variável de matriz ) está definida?

Por que ele se comporta de maneira diferente para uma variável de matriz e uma variável que não é de matriz?

Para uma variável de matriz:

$ unset ar
$ declare -a ar=()
$ declare -p ar
declare -a ar='()'
$ echo ${ar[@]-This is a new value}
This is a new value

e

$ unset ar
$ declare -a ar
$ declare -p ar
bash: declare: ar: not found
$ echo ${ar[@]-This is a new value}
This is a new value

Para uma variável que não seja de matriz:

$ unset var
$ declare -i var
$ declare -p var
bash: declare: var: not found
$ echo ${var-This is a new value}
This is a new value

Obrigado.

Estou executando o Bash 4.3.48.

De link , ouvi dizer que em 4.4, após executar unset ar e declare -a ar , a saída de executar declare -p var é declare -a ar .

Gostaria de saber se declare -p na bash 4.4. manipula array de forma diferente de outros tipos. Na versão 4.4, após executar unset var e declare -i var , qual é a saída da execução declare -p var . Ela gera error such as bash: declare: var: not found ou declare -i var ?

    
por Tim 24.07.2017 / 19:41

1 resposta

2

Todas as versões bash manipulam matrizes corretamente se a matriz receber uma lista () .
Ou um elemento da matriz recebe um valor (mesmo nulo).
Este código (usando o typeset para executá-lo em ksh):

unset ar; typeset -a ar=()
printf '%-20s%s ' "$(typeset -p ar)" '--'

unset ar; typeset -a ar; ar[3]=""
printf '%-30s%s ' "$(typeset -p ar)" '@@'

unset ar; typeset -a ar; ar[3]="val"
printf '%-31s ' "$(typeset -p ar)"

imprimirá os resultados:

zsh/sh          : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
b203sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b204sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b205sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b30sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b32sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b41sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b42sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b43sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b44sh           : declare -a ar=()    -- declare -a ar=([3]="")        @@ declare -a ar=([3]="val")
ksh93           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
attsh           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
zsh/ksh         : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
zsh             : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' )    @@ typeset -a ar=( '' '' val )

Como você pode ver, todos os shells (com algumas diferenças) executam o código e fornecem resultados equivalentes.

Além disso, todos os shells funcionam com este código:

unset ar; typeset -i ar              ; printf '%-17s%s ' "$(typeset -p ar)" '=='
unset ar; typeset -a ar              ; printf '%-19s%s ' "$(typeset -p ar)" '++'

E imprima:

zsh/sh          : typeset -i ar=0  == typeset -a ar=(  ) ++
b203sh          : declare -i ar="" == declare -a ar='()' ++
b204sh          : declare -i ar="" == declare -a ar='()' ++
b205sh          : declare -i ar="" == declare -a ar='()' ++
b30sh           : declare -i ar="" == declare -a ar='()' ++
b32sh           : declare -i ar="" == declare -a ar='()' ++
b44sh           : declare -i ar    == declare -a ar      ++
ksh93           : typeset -i ar    == typeset -a ar      ++
attsh           : typeset -i ar    == typeset -a ar      ++
zsh/ksh         : typeset -i ar=0  == typeset -a ar=(  ) ++
zsh             : typeset -i ar=0  == typeset -a ar=(  ) ++

A correção aproximada está na série bash 4. Tanto o 4.1 quanto o 4.2 funcionam para o array:

b41sh           : declare -a ar='()' ++
b42sh           : declare -a ar='()' ++

Mas não para uma variável simples. E o bash 4.3 falha em ambos os testes:

b43sh           : script: line 3: typeset: ar: not found ==
                  script: line 4: typeset: ar: not found ++

Então, para este teste, por favor, saia do Bash 4.3 -.

    
por 25.07.2017 / 05:32

Tags