Bashでハッシュテーブルを定義するにはどうすればいいですか?質問する

Bashでハッシュテーブルを定義するにはどうすればいいですか?質問する

同等のものは何ですかPython 辞書ただし、Bash では (OS X と Linux で動作するはずです)。

ベストアンサー1

バッシュ4

Bash 4 は、この機能をネイティブにサポートしています。 スクリプトのハッシュバンが#!/usr/bin/env bashまたは であることを確認し#!/bin/bash、 を使用しないようにします。スクリプトを直接実行するか、でsh実行していることを確認します。(Bash スクリプトを Bash で実際に実行しないことは起こり得ますが、非常に混乱を招きます。)scriptbash script

連想配列を宣言するには、次のようにします。

declare -A animals

通常の配列代入演算子を使用して、要素を埋めることができます。たとえば、次のマップを作成する場合animal[sound(key)] = animal(value):

animals=( ["moo"]="cow" ["woof"]="dog")

または、1 行で宣言してインスタンス化します。

declare -A animals=( ["moo"]="cow" ["woof"]="dog")

通常の配列と同じように使用します。

  • animals['key']='value'値を設定する

  • "${animals[@]}"価値観を広げる

  • "${!animals[@]}"( !) をクリックしてキーを展開します

忘れずに引用してください:

echo "${animals[moo]}"
for sound in "${!animals[@]}"; do echo "$sound - ${animals[$sound]}"; done

バッシュ3

bash 4 より前では、連想配列はありません。連想配列をエミュレートするために使用しないでくださいeval。これはシェル スクリプトの疫病evalので、疫病のように避けてください。最も重要な理由は、データを実行可能コードとして扱うことです (他にも多くの理由があります)。eval

まず第一に、bash 4 へのアップグレードを検討してください。これにより、プロセス全体がはるかに簡単になります。

アップグレードできない理由がある場合、declareこれははるかに安全なオプションです。これは bash コードのようにデータを評価しないためeval、任意のコード挿入がそれほど簡単に許可されません。

概念を紹介しながら答えを準備しましょう:

まず、間接性です。

$ animals_moo=cow; sound=moo; i="animals_$sound"; echo "${!i}"
cow

第二にdeclare

$ sound=moo; animal=cow; declare "animals_$sound=$animal"; echo "$animals_moo"
cow

これらをまとめると:

# Set a value:
declare "array_$index=$value"

# Get a value:
arrayGet() { 
    local array=$1 index=$2
    local i="${array}_$index"
    printf '%s' "${!i}"
}

使ってみましょう:

$ sound=moo
$ animal=cow
$ declare "animals_$sound=$animal"
$ arrayGet animals "$sound"
cow

注意:declare関数内には配置できません。bashdeclare関数内で を使用すると、作成された変数はその関数のスコープに対してローカルになりますつまり、それを使用してグローバル配列にアクセスしたり変更したりすることはできません。(bash 4 では、 を使用してグローバル変数を宣言できますdeclare -gが、bash 4 では、そもそも連想配列を使用できるため、この回避策を回避できます。)

まとめ:

  • bash 4 にアップグレードしてdeclare -A連想配列に使用します。
  • declareアップグレードできない場合はオプションを使用してください。
  • 代わりにを使用することを検討しawk、問題を完全に回避してください。

おすすめ記事