Bash でハッシュテーブルの配列を使いたくなったことはありませんか。
私は今デプロイスクリプトを書いていてそれが欲しくなりました。
調べてみると、Bash 4 には Dictionary と呼ばれるものがあるようです。
https://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
ですが、手元の Macbook Pro の Bash のバージョンを調べてみたところ 3.2.57 と古かったので使えませんでした。
これをアップデートするのは簡単ですが、古い Bash しかない環境というのはよくあると思うので、別の方法を考えてみました。
やってみた
#!/bin/bash -eu
# ハッシュテーブルの配列的なやつ
# 実際は JSON のストリーム
PARAMETERS=$(cat <<_EOT_
{
"foo":"FOO 1",
"bar":"BAR 1"
}
{"foo":"FOO 2","bar":"BAR 2"}
{
"foo": "フー",
"bar": "\u30d0\u30fc"
}
_EOT_
)
# Line-delimited JSON に変換
PARAMETERS=$(echo "${PARAMETERS}" | jq . --monochrome-output --compact-output)
# JSON を一つ一つ取り出して foo と bar の値をそれぞれ出力
while IFS='' read -r param || [[ -n "${param}" ]]; do
foo=$(echo "${param}" | jq .foo -r)
bar=$(echo "${param}" | jq .bar -r)
echo "foo=${foo}"
echo "bar=${bar}"
echo "---"
done < <(echo "${PARAMETERS}")
$ bash json_stream.sh
foo=FOO 1
bar=BAR 1
---
foo=FOO 2
bar=BAR 2
---
foo=フー
bar=バー
---
- ヒアドキュメントで文字列として JSON を組み立てる
- 改行区切りで 1 行 1 JSON の Line-Delimited JSON に変換する
- ループで 1 JSON ずつ読み出す
- ループ内では
jq .foo
といった感じで個別のプロパティを取り出す
何かのお役に立てば幸いです。