O que declarar um array bash com -A do?

0

Em Example_1, quando eu declarar city para ser uma matriz com declare -A , por que Bangalore é a saída quando a matriz é impressa no loop for ?

Bangalore
Remote
Kolkata
Ahmedabad
Hyderabad
Pune
Mumbai
Delhi
Chennai

no Example_2, acredito que seja classificado em ordem numérica

example_1

$ cat novice_3.sh 
#!/bin/bash/
declare -A  city=(  ["0"]="Mumbai" ["8"]="Delhi" ["16"]="Kolkata"
                    ["26"]="Bangalore" ["32"]="Chennai"  ["40"]="Pune" 
                    ["50"]="Hyderabad" ["56"]="Ahmedabad"  ["17"]="Remote" )
for i in ${!city[@]};do
echo "${city[$i]}"
done

$ sh novice_3.sh
Bangalore
Remote
Kolkata
Ahmedabad
Hyderabad
Pune
Mumbai
Delhi
Chennai

example_2

$ cat novice_3.sh
#!/bin/bash/
declare   city=( ["0"]="Mumbai" ["8"]="Delhi" ["16"]="Kolkata"
                 ["26"]="Bangalore" ["32"]="Chennai"  ["40"]="Pune" 
                 ["50"]="Hyderabad" ["56"]="Ahmedabad"  ["17"]="Remote" )
for i in ${!city[@]};do
echo "${city[$i]}"
done

$ sh novice_3.sh
Mumbai
Delhi
Kolkata
Remote
Bangalore
Chennai
Pune
Hyderabad
Ahmedabad
    
por superman 08.08.2017 / 08:41

1 resposta

1

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 .

    
por 08.08.2017 / 09:09