Bashシェルにおける変数管理と環境変数のメカニズム

変数の代入と基本ルール

Bashシェルで変数を定義する際、等号(=)の前後にスペースを含めることはできません。また、コマンドは左から右へと評価されます。

# 正しい代入
user_id=1001

# 誤った代入(スペースが含まれている)
# user_id = 1001

# 変数に文字列を結合する
user_id=${user_id}_admin

クォートとエスケープシーケンス

Bashでは、シングルクォートとダブルクォートで特殊文字の扱いが異なります。

  • ダブルクォート ("): 内部の変数や特殊文字は展開されます。例えば、"$user_id" は変数の値として評価されます。
  • シングルクォート ('): 内部のすべての文字はリテラル(通常の文字)として扱われます。'$user_id' はそのままの文字列として出力されます。
  • エスケープ文字 (\): C言語と同様に、バックスラッシュを使用して特殊文字をエスケープできます。例えば、\ はスペース文字自体を表します。
# エスケープとクォートのネスト
display_name="Alice\'s\ Profile"

# パスの追加(コロン区切り)
EXEC_PATH=${EXEC_PATH}:/opt/custom/bin

環境変数とサブプロセスへの継承

現在のシェル(親プロセス)から新しいシェル(サブプロセス)を起動した場合、通常の変数はサブプロセスに継承されません。変数をサブプロセスで利用可能にするには、exportコマンドを使用して環境変数としてエクスポートする必要があります。

# 親シェルで変数を定義
app_env="production"

# サブシェルを起動
bash

# サブシェル内では通常の変数は参照できない
echo $app_env  # 何も出力されない
exit

# 変数を環境変数としてエクスポート
export app_env

# 再度サブシェルを起動
bash
echo $app_env  # "production" が出力される
exit

環境変数が継承される理由:
シェルが起動されると、OSは専用のメモリ領域を割り当てます。親シェルでexportされた変数はこのメモリ領域に登録され、サブシェルが起動される際に、親の環境変数メモリ領域がサブシェルの環境にコピーされるため、参照が可能になります。

変数の確認と主要な環境変数

環境変数やカスタム変数を確認するには、以下のコマンドを使用します。

  • env または export: 現在の環境変数のみを一覧表示します。
  • set: 環境変数に加え、シェル関数やユーザー定義変数を含むすべての変数を表示します。

システム内で重要な役割を果たす代表的な環境変数は以下の通りです(慣習的に大文字で定義されます)。

  • SHELL: 現在使用しているシェルの実行ファイルパス(例: /bin/bash)。
  • PATH: コマンド実行時の検索ディレクトリリスト。
  • PS1: プロンプトの表示フォーマット。
  • $$: 現在実行中のシェルのプロセスID(PID)。

標準入力と変数のデフォルト値処理

readコマンドを使用すると、キーボードからの入力を変数に格納できます。

# 20秒のタイムアウト付きでユーザー入力を求める
read -p "ユーザー名を入力してください (20秒以内): " -t 20 input_user
echo "入力された名前: ${input_user}"

Bashの変数はデフォルトで文字列として扱われるため、val=1+2 と代入しても計算されず、そのまま 1+2 という文字列になります。算術演算を行う場合は専用の構文が必要です。また、変数の展開時にデフォルト値を設定したり、エラーを発生させたりするパラメータ展開の仕組みがあります。

# ${var-default}: varが未定義の場合にdefaultを適用(空文字列は定義済みとみなす)
# ${var:-default}: varが未定義、または空文字列の場合にdefaultを適用
config_file=${user_config:-/etc/app/default.conf}

# ${var?message}: varが未定義の場合にエラーメッセージを出力してシェルを終了
# ${var:?message}: varが未定義、または空文字列の場合にエラーを出力して終了
db_host=${DB_HOST:?"エラー: DB_HOSTが設定されていません"}

タグ: bash linux ShellScripting EnvironmentVariables BashVariables

9月5日 11:37 投稿