例如:
arr=([5]=5 [10]=10)
echo ${!arr[*]}
Bash输出5 10
,但ksh输出10 5
?它们的意思不一样吗?
$ {!var [@]} / $ {!var [*]} 扩展在所有支持它的shell中都是相同的。
< p > 在ksh93中,如果您未明确声明类型就指定任何数组索引,它将始终假定为关联数组,这是无序的,与Bash不同,在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)
为了真正做到在zsh和mksh中的可移植性,你不能将分配作为参数传递给typeset
,因此必须使用。
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+=(...)
中将所有下标设置为附加模式,因此您可以一次更新数组的多个键,而无需取消所有元素或追加到先前存在的元素。