在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 中的关联数组(也称为 ahash
或hashed array
)可以使用任何字符串作为索引(又名key
) - 该字符串可以是数字(或看起来是数字,在 bash 脚本中几乎没有区别),也可以是任何其他有效的字符串。
与许多语言一样,bash 中的关联数组是无序的。如果您只是迭代数组(例如,不对键进行排序),您将以半随机顺序获得数组元素。
默认情况下,bash 中的数组是索引数组。您可以使用declare -a
( 使用小写的 )显式声明索引数组a
。无论declare
d 是否被索引,还是默认创建为索引数组,如果您尝试使用非数字索引设置数组元素,则索引将始终计算为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 中,您没有,所以默认情况下,它是一个索引大批。