同等のものは何ですかPython 辞書ただし、Bash では (OS X と Linux で動作するはずです)。
ベストアンサー1
バッシュ4
Bash 4 は、この機能をネイティブにサポートしています。 スクリプトのハッシュバンが#!/usr/bin/env bash
または であることを確認し#!/bin/bash
、 を使用しないようにします。スクリプトを直接実行するか、でsh
実行していることを確認します。(Bash スクリプトを Bash で実際に実行しないことは起こり得ますが、非常に混乱を招きます。)script
bash 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
、問題を完全に回避してください。