GNU/Linux >> Linux の 問題 >  >> Linux

シェルスクリプトの連想配列?

シェルスクリプトに連想配列を実装するためのトリックを見ました。例: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 –低速メディア–ディスクキャッシュチューニング?
Linux
  1. シェルスクリプトでSetuidを許可しますか?

  2. Unix Bourne Shellの配列?

  3. Webサイトからシェルスクリプトを実行しますか?

  1. シェルスクリプトでパスワードを隠す?

  2. Unixシェルスクリプトのファイル拡張子?

  3. 複数のシェルスクリプト間で変数を共有しますか?

  1. シェルスクリプトのPosixコンプライアンスをテストする方法は?

  2. シェルスクリプトで長いコマンドを分割しますか?

  3. シェルからPythonスクリプトを実行する方法