[Linux] シェルスクリプトで.envファイルを読み込む [dotenv]

[Linux] シェルスクリプトで.envファイルを読み込む [dotenv]

シェルスクリプトで .env

.envファイルで定義した内容をシェルスクリプトから参照するために、環境変数として読み込む方法をまとめます。

.
├── .env
└── my_script.sh

こんな感じの構成になっていて、my_script.sh から .env ファイルを読み込んでその中で定義された変数を参照できるようにします。

.envの内容をシェル変数として読み込む実装方法

.env ファイル

# 値を定義します。
MY_STRING=ABC
MY_NUMBER=123

my_script.sh

#!/bin/bash

# ./.envファイルを読み込んで変数として参照できるようにする
source ./.env

echo $MY_STRING
echo $MY_NUMBER

実行方法

$ bash my_script.sh
ABC
123

. [.envパス名] とすると .env の内容を読み込んで値を読み込みます。

source コマンドはシェルの環境設定を即座に反映させるためのコマンドです。ここでは .env の内容をシェルに反映しています。

.(ドット) と source コマンドの違い

. コマンドは source コマンドと同じなので . ./.env としても同じように機能します。ただし、sourcebash で実行しないと my_script.sh: 4: my_script.sh: source: not found というエラーになります。

source が見つからないというのは実行時に sh で実行しているからかもしれないです。

# shで実行
$ sh my_script.sh
my_script.sh: 4: my_script.sh: source: not found

# bashで実行
$ bash my_script.sh
ABC
123

環境によっては sh で実行しても内部的には bash での実行になる場合もあるのでうまくいくこといもあります。

command not found

.env

# = の前後で余計なスペース禁止
MY_VALUE = xxx

.env ファイルに値を定義するときに、=(イコール) の前後にスペースを入れているとシェルスクリプトから読み込むときにエラーになります。

$ bash my_script.sh
./.env: line 2: MY_VALUE: command not found

シェルの変数定義時と同じなのでスペースを入れずに定義するようにしましょう。

余計なスペースがあってもシェル変数として定義する

のっぴきならない事情でスペースを削除できない場合は sed で余計なスペースを置換してから利用します。

#!/bin/bash

eval `cat .env | grep -v ^# | sed -e 's/\s*=\s*/=/g'`

echo $MY_VALUE

grep -v ^# でコメント行を無視して、sed -e 's/\s*=\s*/=/g でイコールの両端にあるスペースをトリムしています。処理後の文字列を eval で評価することでシェル変数として定義しています。

ハイライトがおかしくなるのが気になりますがうまく動きます。

.envの内容を環境変数として読み込む実装方法

source コマンドや eval ではなく、export すれば環境変数として定義できます。環境変数にすればシェルスクリプト外部で定義した変数をシェルスクリプトで参照できます。

.env

# 値を定義します。
MY_STRING=ABC
MY_NUMBER=123

my_script.sh

#!/bin/bash

echo $MY_STRING
echo $MY_NUMBER

実行結果

$ export $(cat .env | grep -v ^#)
$ bash my_script.sh
ABC
123

以上。

参考URL

Linuxカテゴリの最新記事