[解決済み] Bashでハッシュテーブルを定義する方法は?
質問
に相当するものは何ですか? 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
の代わりに、この問題を完全に回避することができます。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bashでjsonファイルを解析するために、jqの出力にあるダブルクオートを削除する方法は?
-
[解決済み】Bashのシンタックスエラー:予期しないファイルの終わり
-
[解決済み] Cp: ターゲットはディレクトリではありません
-
[解決済み] bashスクリプトでタブ文字をエコーする
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] Bashを使ってプログレスインジケータを表示する [重複]。
-
[解決済み] bash スクリプトを実行している docker エントリポイントに "permission denied" が表示される。
-
[解決済み] AWS CLIのプロファイルを一時的に切り替えるには?
-
[解決済み] シェルスクリプトでの連想配列
-
[解決済み] Javascriptで文字列からHashを生成する