教材
- CloudTech
学習時間
- 25分 × 1セット
学んだこと
シェル変数とは
シェル変数は、現在使用しているシェル(bashなど)の中で一時的にテキスト文字列などの値を保存できる仕組み。そのシェルのセッション内でのみ有効で、子プロセス(新しく起動したシェル)には引き継がれない。
変数の宣言と参照
# 変数の宣言(= の前後にスペースを入れないこと)
shell_var=test123
# 変数の参照($ をつける)
echo $shell_var
# 出力: test123
注意:
shell_var = test123のように=の前後にスペースを入れるとエラーになる。これはシェルがshell_varをコマンド名、=とtest123をその引数として解釈してしまうため。
現在のシェル変数を確認する
# 設定されているシェル変数の一覧を表示
set
# 変数が大量に存在するため、grepで絞り込むと便利
set | grep shell_var
代表的なシェル変数
PS1(プロンプト表示の定義)
PS1 はコマンドプロンプトの表示内容を定義するシェル変数。
PS1='[\u@\h \W]\$ '
| 記号 | 意味 | 表示例 |
|---|---|---|
\u |
現在のユーザー名 | ec2-user |
\h |
ホスト名(最初の . まで) |
ip-172-31-0-1 |
\W |
現在のディレクトリ名(ベース名のみ) | ~ |
\$ |
一般ユーザーなら $、rootなら #
|
$ |
補足:
\Hを使うとFQDN(完全修飾ドメイン名)が表示され、\wを使うとカレントディレクトリがホームディレクトリからの相対パスではなくフルパスで表示される。
シェルの切り替えと変数のスコープ
sh コマンドで子シェルを起動する
# 新しいシェル(子シェル)を起動
sh
# 元のシェル(親シェル)に戻る
exit
sh コマンドを実行すると、現在のシェルの中で新しいシェルプロセス(子シェル)が起動する。この子シェルはあくまで別のプロセスであるため、親シェルで定義したシェル変数は子シェルには引き継がれない。
# 親シェルで変数を定義
my_var=hello
echo $my_var
# 出力: hello
# 子シェルを起動
sh
# 子シェルでは変数が存在しない
echo $my_var
# 出力: (空)
# 親シェルに戻る
exit
環境変数とは
シェルを切り替えても変数の値を引き継ぎたい場合は、環境変数を使用する。環境変数は export コマンドで宣言し、子プロセスに自動的に引き継がれる。
環境変数の宣言方法
# 方法1: 既存のシェル変数を環境変数に昇格させる
shell_var=test123
export shell_var
# 方法2: 宣言と同時にexportする(こちらの方が一般的)
export shell_var=test123
環境変数の確認
# 環境変数の一覧を表示(シェル変数は含まれない)
printenv
# 特定の環境変数を確認
printenv shell_var
# envコマンドでも確認できる
env | grep shell_var
シェル変数と環境変数の違いまとめ:
項目 シェル変数 環境変数 有効範囲 現在のシェルのみ 現在のシェル+子プロセス 宣言方法 VAR=valueexport VAR=value確認コマンド setprintenv/env子シェルへの引き継ぎ されない される
環境変数の活用例:コマンドのデフォルトオプション
一部のコマンドは、特定の環境変数を参照してデフォルトの動作を変更する。
LESS 環境変数の例
# lessコマンドのデフォルトオプションを設定
export LESS="-N"
この設定により、以降 less コマンドを実行すると、-N(行番号表示)オプションが自動的に適用される。毎回 less -N filename と入力する必要がなくなる。
補足: 同様の仕組みを持つ環境変数の例として、
EDITOR(デフォルトのテキストエディタを指定)、PAGER(デフォルトのページャを指定)、LANG(ロケール設定)などがある。
注意点
-
exportで設定した環境変数は、現在のセッション内でのみ有効。ターミナルを閉じると消える。 - 永続化するには、
~/.bashrcや~/.bash_profileに記述する必要がある。 - 環境変数は子プロセスに引き継がれるが、子プロセスで変更しても親プロセスには反映されない(一方通行)。
感想
徐々に業務で使用したことのあるようなコマンドが出てきて楽しくなってきた。シェル変数と環境変数の違いは、実務でもスクリプトを書くときに重要な知識なので、しっかり理解しておきたい。