Example_1で、city
をdeclare -A
の配列として宣言した場合、配列がBangalore
ループで出力されるときに、なぜfor
が最初に出力されるのですか?
Bangalore
Remote
Kolkata
Ahmedabad
Hyderabad
Pune
Mumbai
Delhi
Chennai
example_2では、番号順にソートされていると思います
$ 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
$ 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
Bashでは、配列はindexedまたはassociativeのいずれかになります。インデックス付き配列には数値インデックスがあり、(デフォルトでは)インデックスの番号順に繰り返されます。
Bashの連想配列(hash
またはhashed array
とも呼ばれます)は、インデックスとして任意の文字列を使用できます(別名key
)-この文字列は数値にすることができます(または数値、bashスクリプトにはほとんど違いはありません)、または他の有効な文字列にすることができます。
Bashの連想配列は、多くの言語でそうであるように、順序付けられていません。配列を反復処理するだけの場合(たとえば、キーを並べ替えずに)、配列要素を半ランダムな順序で取得します。
Bashの配列は、デフォルトではインデックス付き配列です。インデックス付き配列は、declare -a
(小文字のa
を使用)で明示的に宣言できます。declare
dをインデックスに登録するか、デフォルトでインデックス付き配列として作成するかを設定しようとすると、数値以外のインデックスを持つ配列要素の場合、インデックスは常に0
と評価され、配列の0番目の要素の値(存在する場合)をオーバーライドまたは作成します。
例えば.
$ declare -a foo
$ foo[0]=5
$ foo[1]=2
$ declare -p foo
declare -a foo=([0]="5" [1]="2")
OK、それはあなたが期待することです。しかし、今度はfoo[bar]
を設定してみてください。
$ foo[bar]=99
$ declare -p foo
declare -a foo=([0]="99" [1]="2")
同様に、配列をdeclare -A
に関連付けるように宣言できます(capitalA
に注意してください)。これにより、すべてのインデックスが数値であっても、配列が強制的に関連付けられます。
$ 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" )
したがって、あなたの質問に対する答えは、example_1で、city
を連想配列として宣言したということです。 example_2では、そうではなかったので、デフォルトではindexed配列です。