zshシェルのエラー置換エラー

zshシェルのエラー置換エラー

こんにちは私の中前の質問zshシェルで連想配列を使用する方法を明確に理解します。

しかし、スクリプトで次のコマンドを実行するたびに

for KEY in ${!array[@]}私の配列のキー間反復

エラーが発生しますbad substitution

同様echo ${!array[@]}に与えられた。

注:array私の連想配列の名前。

答え1

zshBashとは異なるパラメータ置換があります。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「名前が連想配列を参照している場合は、要素値の代わりにキー(要素名)が置き換えられます」という説明があるマニュアルページを参照してください。

関連情報