Em bash , como em ksh , em que $var é uma matriz, $var é realmente a abreviação de ${var[0]} .
Então, em:
var=([1]=whatever [2]=blah)
${var+set} não se expandiria para set e [[ -v var ]] retornaria falso, porque $var não tem elemento de indice 0 (observe que em bash , como em ksh , mas ao contrário da maioria outras shells e linguagens, arrays são sparse arrays ou arrays associativos com chaves limitadas a inteiros positivos).
Em bash (pelo menos desde 4.3), quando você declara uma variável como matriz com:
typeset -a var
var é inicialmente não definido. Não está nem mesmo definido para uma lista vazia. Em 4.3 , typeset -p var retornaria um erro. Em 4.2 e antes, ele produziria:
declare -a a='()'
(como se declarasse a matriz com uma lista vazia como em zsh )
Em 4.4, gera:
declare -a var
Portanto, desde a versão 4.3, uma matriz não definida (mas declarada) é diferente de uma matriz que é atribuída a uma lista vazia.
Ainda assim, é difícil diferenciar programaticamente entre os dois. Mas na prática, a distinção não é muito útil. Provavelmente, o que você deseja saber é quantos elementos estão na matriz:
((${#array[@]})) || echo array has no element
Veja zsh , rc , fish e yash para shells com melhores designs de matriz.