シェルスクリプトに連想配列を実装するためのトリックを見ました。例:print array["apples"]
echo $array$key
としてスクリプト化できます ここでkey=apples。
ただし、配列を反復処理するためのキーを生成する方法については言及されていませんでした。
考えられる唯一の方法は、forループを使用して反復処理できるように、スペースで区切られた変数にキーを格納することでした。アレイ上。
では、後で使用するためにキーを保存する他の方法はありますか?
承認された回答:
連想配列を備えたシェル
最新のシェルの中には、連想配列を提供するものがあります:ksh93、bash≥4、zsh。 ksh93およびbashで、a
の場合 は連想配列であり、"${!a[@]}"
キーの配列です:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
zshでは、その構文はkshエミュレーションモードでのみ機能します。それ以外の場合は、zshのネイティブ構文を使用する必要があります:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
a
の場合にも機能します 空のキーはありません。
zshでは、両方のk
でループすることもできます。 eysとv
同時にalues:
for k v ("${(@kv)a}") echo "$k -> $v"
連想配列のないシェル
連想配列を持たないシェルで連想配列をエミュレートすることは、はるかに多くの作業です。連想配列が必要な場合は、おそらくksh93やPerlなどのより大きなツールを導入する時期です。
単なるPOSIXシェルで連想配列が必要な場合は、キーに0-9A-Z_a-z
の文字のみが含まれるように制限されている場合に、連想配列をシミュレートする方法を次に示します。 (ASCII数字、文字、アンダースコア)。この仮定の下で、キーは変数名の一部として使用できます。以下の関数は、名前付けプレフィックス「stem」で識別される配列に作用します。この配列には、2つの連続したアンダースコアを含めることはできません。
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo "$__aa__${1}""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case $__aa__${1} in
*" $2 "*) $3=$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=$3
case $__aa__${1} in
*" $2 "*) :;;
*) __aa__${1}="${__aa__${1}}$2 ";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case $__aa__${1} in
*" $2 "*) __aa__${1}="${__aa__${1}%%* $2 } ${__aa__${1}#* $2 }";;
esac"
}
(警告、テストされていないコード。構文的に無効な語幹とキーのエラー検出は提供されていません。)
関連:Linux –低速メディア–ディスクキャッシュチューニング?