例_1

例_1

city例_1で配列として宣言しましたが、ループで配列を印刷するときに、declare -Aなぜ最初に出力されますか?Bangalorefor

Bangalore
Remote
Kolkata
Ahmedabad
Hyderabad
Pune
Mumbai
Delhi
Chennai

example_2では数字で並べられていると思います。

例_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

例_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

答え1

Bashでは配列が可能です。索引または関連。インデックス配列は数値インデックスを持ち(デフォルトでは)インデックスの数値順に繰り返されます。

Bashの連想配列(ahashまたは)hashed arrayは、すべての文字列をインデックス(aka key)として使用できます。文字列は数字にすることができます(または数字として表示され、bashスクリプトではほとんど違いはありません)。その他の有効な文字列。

多くの言語と同様に、bashの連想配列には順序がありません。たとえば、キーをソートせずに配列を繰り返すと、配列要素は半ランダムな順序で表示されます。

デフォルトでは、bashの配列はインデックス配列です。declare -aインデックス配列を明示的に(小文字を使用して)宣言できますa。 dがインデックス化されているのか、デフォルトでインデックス付けされた配列で作成されたのかにかかわらず、declare数値ではなくインデックスで配列要素を設定しようとすると、インデックスは常にと評価され、 の00番目の要素値を上書きまたは生成します。配列(存在する場合)

例えば

$ declare -a foo
$ foo[0]=5
$ foo[1]=2
$ declare -p foo
declare -a foo=([0]="5" [1]="2")

まあ、それはあなたが期待するものです。しかし、次のように設定してみてくださいfoo[bar]

$ foo[bar]=99
$ declare -p foo
declare -a foo=([0]="99" [1]="2")

同様に、次のように配列を宣言できますdeclare -A(注首都 A)。これは、すべてのインデックスが数値であっても配列の関連付けを強制します。

$ 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には1つもないので、デフォルトで索引大量に。

関連情報