こんにちは私の中前の質問zshシェルで連想配列を使用する方法を明確に理解します。
しかし、スクリプトで次のコマンドを実行するたびに
for KEY in ${!array[@]}
私の配列のキー間反復
エラーが発生しますbad substitution
。
同様echo ${!array[@]}
に与えられた。
注:array
私の連想配列の名前。
答え1
zsh
Bashとは異なるパラメータ置換があります。man zshexpn
。いくつかのサポート拡張動作のための修飾子、変数名の前に括弧内に表示されます${(X)name}
。配列キー(関連配列を含む)を含む修飾子は配列のキーリストに展開されますが、空の文字列の場合はキーを省略しますk
。空のキーを保持するには、${(k)array}
二重引用符と@
修飾子を使用してください。
for x in "${(@k)array}" ; ...
配列のキーを繰り返しますarray
。
答え2
を使用する必要があり、"${(@k)array}"
null"${(k)array}"
以外のキーにのみ拡張されます。
typeset -A array
array=(k1 v1 k2 v2 k3 v3)
for k in "${(@k)array}"; do
printf "%s -> %s\n" "$k" "$array[$k]"
done
それから:
$ zsh test.zsh
k1 -> v1
k2 -> v2
k3 -> v3
for
ループをキー、値拡張に置き換えることもできます。
printf '%s -> %s\n' "${(@kv)array}"
答え3
私が知る限り、${!...}
それは存在しません。私の考えでは、あなたがしたいと思います:${(k)array[@]}
、または単に${(k)array}
。詳細については、zshexpn(1)
拡張フラグについてk
「名前が連想配列を参照している場合は、要素値の代わりにキー(要素名)が置き換えられます」という説明があるマニュアルページを参照してください。