web-dev-qa-db-ja.com

-Aを使用してbash配列を宣言するとどうなりますか?

Example_1で、citydeclare -Aの配列として宣言した場合、配列がBangaloreループで出力されるときに、なぜforが最初に出力されるのですか?

Bangalore
Remote
Kolkata
Ahmedabad
Hyderabad
Pune
Mumbai
Delhi
Chennai

example_2では、番号順にソートされていると思います

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
1
superman

Bashでは、配列はindexedまたはassociativeのいずれかになります。インデックス付き配列には数値インデックスがあり、(デフォルトでは)インデックスの番号順に繰り返されます。

Bashの連想配列(hashまたはhashed arrayとも呼ばれます)は、インデックスとして任意の文字列を使用できます(別名key)-この文字列は数値にすることができます(または数値、bashスクリプトにはほとんど違いはありません)、または他の有効な文字列にすることができます。

Bashの連想配列は、多くの言語でそうであるように、順序付けられていません。配列を反復処理するだけの場合(たとえば、キーを並べ替えずに)、配列要素を半ランダムな順序で取得します。

Bashの配列は、デフォルトではインデックス付き配列です。インデックス付き配列は、declare -a(小文字のaを使用)で明示的に宣言できます。declaredをインデックスに登録するか、デフォルトでインデックス付き配列として作成するかを設定しようとすると、数値以外のインデックスを持つ配列要素の場合、インデックスは常に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配列です。

3
cas