📚

Jsonから環境変数を読み込む

2023/11/01に公開

やり方

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
    ''');

}
GitHubで編集を提案

Discussion