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

3

例如:

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

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

1个回答

6
< p > $ {!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+=(...)中将所有下标设置为附加模式,因此您可以一次更新数组的多个键,而无需取消所有元素或追加到先前存在的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接