🖥

Bash | あなたが扱っているのは本当に環境変数ですか? (環境変数を上書きできているようで出来てないケース )

2023/08/26に公開

スクリプト

たとえば「環境変数 COLOR に何が与えられても、シェル内で上書きして標準出力する」というスクリプトがある場合。

env.sh
COLOR='green'

echo Varbiable color is $COLOR
echo ENV color is $(printenv COLOR)

環境変数を渡した場合

COLOR=red を渡してシェルを実行しても、出力は当然、上書きされた値になる。

$ COLOR=red bash env.sh
Varbiable color is green
ENV color is green

環境変数を渡さなかった場合

だがそもそも環境変数 COLOR= を渡さずシェルを実行した場合。
普通の変数は存在するが、環境変数は存在しない状態になった。

$ bash env.sh 
Varbiable color is green
ENV color is

どうやら

シェル実行時に環境変数を渡した場合は、その変数は「環境変数」扱いに。
そうでない場合は「普通の変数」扱いになるようだ。

なおかつご覧のとおり、シェルでは「環境変数」と「普通の変数」の区切りは、わりと曖昧っぽい。

結論

  • スクリプト内で、いきなり大文字の変数代入 ( NAME=yuma ) をしても、環境変数にはならない。
  • スクリプト内で環境変数を作る場合は export ( ex. export NAME=yuma ) する。
  • いちど環境変数に「なった」ものは、NAME=yuma のように、普通の変数と同じように代入できる。
  • スクリプト起動時に Name=yuma example.sh のように書いた場合、その変数に対して、スクリプト内で export したのと同じ効果が得られる。

初期指定されていない環境変数を上書きする

export すると環境変数を上書きできる。

スクリプト

env.sh
export COLOR='green'

echo Varbiable color is $COLOR
echo ENV color is $(printenv COLOR)

結果

$ bash env.sh
Varbiable color is green
ENV color is green

環境

  • bash 3.2
  • sh 3.2

参考

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2016-07-27

Discussion