$ {!arr [*]}在bash和ksh中是不同的?

时间:2013-03-22 06:46:03

标签: bash ksh

例如:

arr=([5]=5 [10]=10)
echo ${!arr[*]}

Bash输出5 10但ksh输出10 5?他们的意思不一样吗?

1 个答案:

答案 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一样,所以你可以一次更新数组的多个键而不会取消所有元素的设置,而无需附加到以前存在的元素。