Por padrão matrizes de processo bash como matrizes indexadas.
Nesse caso, os índices são avaliados como uma expressão aritmética.
$ joe=3 mary=6
$ unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb")
A saída revela várias coisas:
- A matriz é indexada: o
-a
na saída. - A matriz contém dois valores.
- Os índices dos valores correspondem aos valores numéricos das variáveis
joe
emary
. - Os valores contidos na matriz podem ser strings.
Isso acontece mesmo que os índices sejam citados (até mesmo aspas simples):
$ joe=3 mary=6
$ unset data
$ data=(["joe"]=111 ["mary"]=bbb)
$ declare -p data
declare -a data=([3]="111" [6]="bbb")
Se as strings usadas como índices não foram definidas para conter um número, são de qualquer maneira avaliadas como uma Expressão Aritmética que possui valor zero.
$ unset joe ; unset mary ; unset data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -a data=([0]="bbb")
O que aconteceu é que [joe]=111
avaliou para [0]=111
, definindo a matriz no índice 0
para 111
. Porém, [mary]=bbb
avaliou para [0]=bbb
, substituindo assim o valor da matriz no índice 0
para bbb
.
Para realmente ter um array Associativo, ele deve ser definido antes de seu uso.
Não pode ser alterado enquanto contém dados. Com o array definido como acima:
$ declare -A data
bash: declare: data: cannot convert indexed to associative array
Mas, limpando, podemos:
$ joe=3 ; mary=6 ; unset data
$ declare -A data
$ data=([joe]=111 [mary]=bbb)
$ declare -p data
declare -A data=([joe]="111" [mary]="bbb" )
Como você pode ver, não importa que as strings usadas como índices também sejam nomes de variáveis válidos e que elas contenham um valor. Eles são usados como índices de string para o array associativo.