シェルスクリプトで .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
としても同じように機能します。ただし、source
は bash
で実行しないと 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
以上。
コメントを書く