📚
Jsonから環境変数を読み込む
やり方
jqがインストールされている環境で、以下のシェルスクリプトを実行することで読み込みができます。
json_to_env.sh
#!/bin/bash
# sourceを使用して実行すると環境変数がロードされる
json_file=$1
# # JSONファイルをパースし、各要素を環境変数に設定
while IFS="=" read -r key value; do
# スペースを削除
key=$(echo $key | tr -d '[:space:]')
# 環境変数に設定
export $key="$value"
done < <(jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" "$json_file")
# 実行コマンド
source json_to_env.sh <jsonファイルのパス> # sourceを使用して実行することで読み込みができます。
解説
以下で、jqコマンドを使用してjonsファイルのkeyとvalueの配列を作成しています。
whileループで空白削除するため、区切り文字はなんでもいいのですが、「=」を使用しています。
(もう少しきれいなやり方があれば教えてください。)
(jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" "$json_file")
上で指定している区切り文字を、IFS="="
で分割文字に指定してkeyとvalueを取得します。
keyにスペースがあると困るので、トリムしてexportしています。
環境変数として読み込むためにはsource
コマンドで、このスクリプトを実行する必要があります。
while IFS="=" read -r key value; do
# スペースを削除
key=$(echo $key | tr -d '[:space:]')
# 環境変数に設定
export $key="$value"
経緯
Flutterでは環境変数を定義する場合にjsonファイルを使用します。
flutter run --dart-define-from-file=dart-define.json
上記の環境変数定義をdartだけで作成したバッチ処理にも反映したかったのですが、うまいやり方が見つかりませんでしたので、シェルスクリプトを作成しました。
以下のように実行するか、
source json_to_env.sh <jsonファイルのパス>; dart <実行ファイル>
dartで以下のように記述することで読み込みができます。
(process_runパッケージが必要)
void main(List<String> args) {
final json_path = args[0]
final shell = Shell();
await shell.run('''
source json_to_env.sh $json_path
''');
}
Discussion