シェル操作 初級

環境変数の使い方

Linuxの環境変数とは何か、設定・参照・削除の方法を学び、シェルスクリプトや設定ファイルで活用する

環境変数は、シェルやプログラムが参照できる「名前付きの値」です。 パスの設定、言語ロケール、APIキーの管理など、Linuxを使いこなすうえで欠かせない仕組みです。

環境変数とは

環境変数はシェルセッション全体で共有される変数で、子プロセスにも引き継がれます。 対して、シェル変数はそのシェルの中だけで有効です。

# シェル変数(子プロセスには引き継がれない)
MY_VAR="hello"

# 環境変数(export で子プロセスにも引き継がれる)
export MY_VAR="hello"

環境変数を参照する

変数の値を参照するには $変数名 または ${変数名} を使います。

echo $HOME
echo $USER
echo ${PATH}

よく使われる組み込みの環境変数には次のものがあります。

変数名内容
HOMEホームディレクトリのパス
USERログイン中のユーザー名
PATHコマンドの検索パス(:区切り)
SHELL使用中のシェル
LANG言語・ロケール設定
PWD現在のディレクトリ

環境変数の一覧を確認する

現在のシェルで設定されているすべての環境変数を見るには env または printenv を使います。

# すべての環境変数を表示
env

# 特定の変数だけ表示
printenv HOME
printenv PATH

set コマンドはシェル変数も含めて表示するため、env より多くの変数が出力されます。

環境変数を設定する

セッション内での設定

export DATABASE_URL="postgres://localhost/mydb"
export DEBUG=true

export をつけると、そのシェルから起動した子プロセス(スクリプトなど)にも変数が渡されます。

一時的にコマンドに渡す

コマンドの直前に変数を書くと、そのコマンドだけに環境変数を渡せます。 グローバルな設定を変えずに試したいときに便利です。

LANG=C ls --help    # 英語で出力
DEBUG=1 ./my-script.sh

環境変数を削除する

unset コマンドで変数を削除します。

export TEMP_TOKEN="abc123"
echo $TEMP_TOKEN   # abc123

unset TEMP_TOKEN
echo $TEMP_TOKEN   # (何も出力されない)

設定を永続化する

セッションをまたいで変数を保持したい場合は、シェルの設定ファイルに追記します。

# ~/.bashrc(bash の場合)に追記
echo 'export MY_TOOL_HOME="/opt/my-tool"' >> ~/.bashrc
echo 'export PATH="$MY_TOOL_HOME/bin:$PATH"' >> ~/.bashrc

# 変更を現在のシェルに反映
source ~/.bashrc

~/.profile はログイン時に読み込まれ、~/.bashrc はインタラクティブシェル起動時に読み込まれます。

PATH を追加する

新しいディレクトリをコマンド検索パスに追加するには、PATH に追記します。

# 既存の PATH の先頭にディレクトリを追加
export PATH="/home/user/bin:$PATH"

# 確認
echo $PATH

先頭に追加した場合、同名のコマンドが既存のパスにあっても、追加したパスのものが優先されます。

変数の展開テクニック

# デフォルト値を指定する(変数が未定義または空のとき "default" を使う)
echo ${MY_VAR:-"default"}

# 変数が未定義のときだけデフォルト値を設定する
: ${MY_VAR:="default"}
echo $MY_VAR   # default

# 変数が定義されているときだけ別の値を使う
echo ${MY_VAR:+"defined!"}

練習問題

問題1

GREETING という環境変数に "こんにちは" を設定し、echo で表示してください。

問題2

現在設定されている環境変数の中から PATH だけを表示するコマンドを書いてください(2通り以上)。

問題3

次のコマンドを実行したとき、何が表示されるか答えてください。

export NAME="Alice"
bash -c 'echo $NAME'

問題4

/home/user/scripts をコマンドの検索パスに追加し、現在のセッションで有効にしてください。

問題5

SECRET_KEY という環境変数を設定したあと、その変数を削除し、空になったことを確認してください。


答え

問題1の答え

export GREETING="こんにちは"
echo $GREETING

問題2の答え

# printenv を使う
printenv PATH

# echo を使う
echo $PATH

# env から grep で絞り込む
env | grep ^PATH=

問題3の答え

Alice

export で設定した変数は子プロセス(bash -c ... で起動したサブシェル)にも引き継がれるため、Alice が表示されます。export なしで NAME="Alice" とした場合は空行が表示されます。

問題4の答え

export PATH="/home/user/scripts:$PATH"

# 確認
echo $PATH

問題5の答え

export SECRET_KEY="mysecret"
echo $SECRET_KEY   # mysecret

unset SECRET_KEY
echo $SECRET_KEY   # (何も表示されない)
echo "変数の値: '${SECRET_KEY}'"   # 変数の値: ''