All bash versions do handle arrays correctly if the array is given a list ().
Or an array element is given a value (even null).
This code (using typeset to get it to run in 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)"
Will print this results:
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 )
As you can see, all shells (with some diferences) run the code and provide equivalent results.
Also, all shells work with this code:
unset ar; typeset -i ar ; printf '%-17s%s ' "$(typeset -p ar)" '=='
unset ar; typeset -a ar ; printf '%-19s%s ' "$(typeset -p ar)" '++'
And print:
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=( ) ++
The rough patch is in bash series 4. Both 4.1 and 4.2 work for the array:
b41sh : declare -a ar='()' ++
b42sh : declare -a ar='()' ++
But not for a simple variable. And bash 4.3 fails in both tests:
b43sh : script: line 3: typeset: ar: not found ==
script: line 4: typeset: ar: not found ++
So, for this tests, please move out of Bash 4.3 --.
arbefore testing for it's presence using thedeclare -pcommand. Also, whydeclare -a ar='()'? a mere,declare -p arshould suffice.declare -a ar, but no error if the array was defined withdeclare -a ar=().