最後に関連付けられたアイテムのみを表示するシェルスクリプトの辞書

辞書を使用しようとしていますが、奇妙な動作に遭遇しました。次のような辞書を作成する場合:

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

最後の要素「prd」最初の画面ではなく、画面に印刷されます。最初のエントリを除くすべてのエントリを削除すると、正しい出力になります。私が見たすべてのコード例は上記のような辞書を使用しているため、何が間違っているのかわかりません。誰かが私の間違いを見つけることができますか?

ご挨拶

コメント

  • スクリプトをどのように実行していますか?
  • ルートprivsでshバイナリを使用してbashから実行しています
  • serversが連想配列ではなく配列であるかのように動作します。タイプミスをチェックし、bashのバージョンが4.0以上(連想配列をサポートする最初のバージョン)であることを確認します。
  • shまたはbashを使用していますか?
  • のバージョンは何ですか。使用するbash(4より前のバージョンのbashを使用する場合と同じように動作します)?

回答

@Yurkoのコメントは正しいトラックだと思います。

バージョン4より前のbash(Macの/bin/bashなど):

  1. declare -A行はエラー(declare: -A: invalid option)を発行し、配列は宣言されていません
  2. 2行目でインデックス付き配列が作成されます。インデックスは算術式として評価されるためです。
  3. bash算術式の場合:「裸の」単語は変数の名前として扱われ、未設定の変数には値ゼロが与えられます

したがって、各文字列はに割り当てられます。インデックス0

これを試してください:

 declare -p servers  

出力が表示されます

 declare -a servers="([0]="prd")"  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です