シェルスクリプトでは、変数を定義する際に型宣言は不要で、単に代入するだけで利用可能です。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などの設定ファイルに記述する必要があります。