3

例えば:

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

bash は出力します5 10が、ksh は出力し10 5ますか? 同じ意味じゃない?

4

1 に答える 1

6

${!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)

(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 の優れた点の 1 つは、bash のように使用してすべての添え字に追加モードを設定しないことarr+=(...)です。そのため、すべての要素を設定解除したり、既存の要素に追加したりすることなく、配列の複数のキーを一度に更新できます。

于 2013-03-22T06:54:44.403 に答える