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 -.