例如:
arr=([5]=5 [10]=10)
echo ${!arr[*]}
Bash输出5 10
但ksh输出10 5
?他们的意思不一样吗?
答案 0 :(得分:5)
${!var[@]}
/ ${!var[*]}
扩展在支持它的所有shell中都是相同的。
在ksh93中,如果在没有明确声明类型的情况下为数组指定任何索引,它将始终假定一个无序的关联数组,这与Bash不同,在Bash中,您只能使用{{1}声明一个关联数组明确地。
typeset -A
如果要使用指定键的复合赋值指定索引数组,则必须使用
$ a=([5]=yo [10]=jo); typeset -p a
typeset -A a=([10]=jo [5]=yo)
要真正可移植(使用zsh和mksh),您不能将赋值指定为typeset -a arr=([5]=5 [10]=10)
的参数,因此必须使用
typeset
还有许多其他差异。例如,如果在复合赋值中指定键,则ksh会强制您对每个元素执行此操作,并且不会像bash和mksh那样隐式增加索引。关于ksh93的一个好处是,它不会像使用typeset -a arr; arr+=([5]=5 [10]=10) # portable to bash/ksh93/mksh
typeset -a arr; arr[5]=5 arr[10]=10 # portable to bash/ksh93/mksh/zsh
# (typeset to localize), most ksh derivs. bash/ksh88/pdksh/mksh/zsh etc
typeset arr; arr[5]=5 arr[10]=10
# set -A name -- value ... # Also portable to most ksh derivs EXCEPT bash.
一样在所有下标上设置附加模式,就像bash一样,所以你可以一次更新数组的多个键而不会取消所有元素的设置,而无需附加到以前存在的元素。