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

${!arr[*]}在bash和ksh中不同吗?,bash,ksh,Bash,Ksh,例如: arr=([5]=5 [10]=10) echo ${!arr[*]} Bash输出5 10,但是ksh输出10 5?它们的意思不同?所有支持它的shell中的${!var[@]}/${!var[*]}扩展都是相同的 在ksh93中,如果在没有显式声明类型的情况下为数组指定任何索引,它将始终假定一个无序的关联数组,而在Bash中,只能显式使用typeset-a声明关联数组 $ a=([5]=yo [10]=jo); typeset -p a typeset -A a=([10]=jo

例如:

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

Bash输出
5 10
,但是ksh输出
10 5
?它们的意思不同?

所有支持它的shell中的
${!var[@]}
/
${!var[*]}
扩展都是相同的

在ksh93中,如果在没有显式声明类型的情况下为数组指定任何索引,它将始终假定一个无序的关联数组,而在Bash中,只能显式使用
typeset-a
声明关联数组

 $ a=([5]=yo [10]=jo); typeset -p a
typeset -A a=([10]=jo [5]=yo)
如果要使用指定键的复合赋值指定索引数组,则必须使用

typeset -a arr=([5]=5 [10]=10)
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.
要真正可移植(使用zsh和mksh),您不能将赋值指定为
typeset
的参数,因此必须使用

typeset -a arr=([5]=5 [10]=10)
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.
还有许多其他不同之处。例如,如果在复合赋值中指定键,ksh会强制您对每个元素都这样做,并且不会像bash和mksh那样隐式增加索引。ksh93的一个优点是,它不会像bash那样使用
arr+=(…)
在所有下标上设置附加模式,因此您可以一次更新数组的多个键,而不会取消所有元素的设置,也不会附加到以前存在的元素