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.