Shellスクリプトにおける変数の扱いとスコープ

シェルスクリプトでは、変数を定義する際に型宣言は不要で、単に代入するだけで利用可能です。Bashでは明示的に型を指定しない限り、すべての値は文字列として扱われます。

変数名には$を付けずに代入し、使用時には$を前置します。変数名を{}で囲むことで、変数の境界を明確にできます。特に変数名が他の文字と隣接する場合に有用なため、常に括弧付きで参照することを推奨します。

name="alice"
echo $name
name="bob"  # 再代入も$なし
echo ${name}
for lang in Python Ruby Go Rust; do
    echo "I love ${lang}Lang"  # {}で境界を明確化
done

変数名の命名規則

  • 英字、数字、アンダースコアのみ使用可能
  • 先頭は数字不可
  • Bash予約語(if, forなど)は避ける

有効な例:

USER_HOME
_temp_file
count3

無効な例:

2nd_var=10     # 数字始まり
my-var=value   # ハイフン禁止
case=switch    # 予約語使用

値の引用方法

空白を含まない値は引用符なしでも可。空白や特殊文字を含む場合は引用符必須。

  • シングルクォート'...'内は一切展開されず、リテラルとして扱われる
  • ダブルクォート"..."内では変数やコマンド置換が展開される
msg='Hello $USER'     # 出力: Hello $USER
msg="Hello $USER"     # 出力: Hello alice

コマンド結果の代入

コマンドの実行結果を変数に格納するには、$(command)構文を使用します。古い`command`構文は可読性が低いため非推奨です。

current_dir=$(pwd)
file_count=$(ls -1 | wc -l)

読み取り専用変数

readonlyで変数をロックすると、その後の再代入はエラーになります。

config_path="/etc/app.conf"
readonly config_path
# config_path="/tmp"  ← エラー発生

変数の削除

unsetで変数を破棄できます。存在しない変数をunsetしてもエラーになりません。

unset temp_var

変数のスコープと環境変数

変数の有効範囲は以下の3種類があります:

  • グローバル変数:関数外で定義、または関数内でlocalなしで定義された変数。現在のシェル内でのみ有効。
  • ローカル変数:関数内でlocal付きで定義。その関数内でのみ有効。
  • 環境変数exportで宣言された変数。子プロセスにも継承される。

環境変数は子シェル起動時にコピーされるため、親子間で独立して変更可能です。ただし、exportによる環境変数は一時的であり、新しいシェルセッションでは無効です。永続化するには.bashrc.profileなどの設定ファイルに記述する必要があります。

タグ: bash shell-script variable-scope environment-variable readonly-variable

6月3日 23:08 投稿