This behavior seems very strange. This example is with $@ but it seems the same for ${array[@]}
The manual says for ${parameter:-word}: > If parameter is unset or null, the expansion of word is substituted. In this case, $@ is expanded as if it was quoted (even if 'word' is not quoted) and the outer quotes do no serve to quote the expansion of $@. $ set -- '1 1' '2 2'; unset x $ v=( "${x-$@}" ); declare -p v declare -a v=([0]="1 1" [1]="2 2") In this case though, the expansion is an empty string rather than nothing so it seems that a different set of rules is being followed: $ set -- $ v=("$@"); declare -p v # obviously declare -a v=() $ v=( "${@-$@}" ); declare -p v # ? declare -a v=([0]="") The following is strange, in light of the above: $ v=("${@-${@-$@}}"); declare -p v declare -a v=()