示例_1

示例_1

在Example_1中,当我用 声明city为数组时declare -A,为什么在循环Bangalore中打印数组时首先输出for

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 中的关联数组(也称为 ahashhashed array)可以使用任何字符串作为索引(又名key) - 该字符串可以是数字(或看起来是数字,在 bash 脚本中几乎没有区别),也可以是任何其他有效的字符串。

与许多语言一样,bash 中的关联数组是无序的。如果您只是迭代数组(例如,不对键进行排序),您将以半随机顺序获得数组元素。

默认情况下,bash 中的数组是索引数组。您可以使用declare -a( 使用小写的 )显式声明索引数组a。无论declared 是否被索引,还是默认创建为索引数组,如果您尝试使用非数字索引设置数组元素,则索引将始终计算为0,覆盖或创建数组第零个元素的值(如果有)。

例如

$ 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 中,您没有,所以默认情况下,它是一个索引大批。

相关内容