1. ホーム
  2. bash

[解決済み] Bashでハッシュテーブルを定義する方法は?

2022-03-14 11:16:34

質問

に相当するものは何ですか? Python辞書 が、Bashで動作します(OS XとLinuxにまたがって動作するはずです)。

どのように解決するのですか?

バッシュ4

Bash 4はこの機能をネイティブにサポートしています。 あなたのスクリプトのハッシュバングが #!/usr/bin/env bash または #!/bin/bash を使用してしまうことがないように sh . スクリプトを直接実行するか、あるいは script と共に bash script . (実際にBashでBashスクリプトを実行するのではなく が行う が発生し、それが 本当に 紛らわしい!)

して、連想配列を宣言するのです。

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 は関数の中に入れることができません。 関数内に declare は、bash 関数内で作成した変数が ローカル をその関数のスコープに追加します。つまり、この関数でグローバル配列にアクセスしたり変更したりすることはできません。(bash 4では declare -g を使用してグローバル変数を宣言します。しかし、bash 4 ではそもそも連想配列が使えるので、この回避策は不要です)。

まとめ

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