No bash, as matrizes podem ser indexadas ou associativas . Os arrays indexados têm um índice numérico e são (por padrão) iterados pela ordem numérica de seus índices.
Um array associativo (também conhecido como hash
ou hashed array
) no bash pode usar qualquer string como o índice (também conhecido como key
) - esta string pode ser numérica (ou parecer numericamente, há pouca diferença em um script bash), ou pode ser qualquer outra string válida.
Matrizes associativas no bash são, como estão em vários idiomas, não-ordenadas. Se você apenas iterar pelo array (por exemplo, sem classificar as chaves), você obterá os elementos do array em uma ordem semi-aleatória.
Matrizes no bash são, por padrão, matrizes indexadas. Você pode declarar explicitamente uma matriz indexada com declare -a
(com uma minúscula a
. Se declare
d a ser indexada ou criada como uma matriz indexada por padrão, se você tentar definir um elemento da matriz com um não numérico index, o índice será sempre avaliado como 0
, substituindo ou criando o valor (se houver) do elemento zeroth da matriz.
por exemplo,
$ declare -a foo
$ foo[0]=5
$ foo[1]=2
$ declare -p foo
declare -a foo=([0]="5" [1]="2")
OK, é o que você esperaria. Mas agora tente definir foo[bar]
:
$ foo[bar]=99
$ declare -p foo
declare -a foo=([0]="99" [1]="2")
Da mesma forma, você pode declarar uma matriz como associativa a declare -A
(observe o capital A
). Isso forçará a matriz a ser associativa mesmo se TODOS os índices forem numéricos.
$ unset foo
$ declare -A foo
$ foo[0]=5
$ foo[1]=2
$ foo[bar]=99
$ declare -p foo
declare -A foo=([bar]="99" [0]="5" [1]="2" )
Assim, a resposta à sua pergunta é que no exemplo_1, você declarou city
como uma matriz associativa . No exemplo_2, você não o fez, por padrão, é uma matriz indexada .