変数
| 対応: | POSIX(sh互換) |
|---|
『シェルスクリプト』では変数を使って値を保持・再利用できます。代入・参照・削除の構文はプログラミング言語と少し異なる点があるため、それぞれのルールをしっかり把握しておくことが大切です。
変数の代入
変数に値を代入するときは = の前後にスペースを入れてはいけません。スペースを入れるとシェルがコマンドと引数として解釈してしまいエラーになります。
| 書き方 | 説明 |
|---|---|
var=value | 変数 var に値 value を代入します。= の前後にスペースは不要(入れるとエラー)です。 |
var="hello world" | スペースを含む値はダブルクォートで囲みます。 |
var='hello world' | シングルクォートで囲むと変数展開が行われません。 |
var=$(command) | コマンドの実行結果を変数に代入します(コマンド置換)。 |
var=$((1 + 2)) | 算術演算の結果を変数に代入します。 |
変数の参照
変数を参照するときは $var または ${var} と書きます。後者の波括弧形式は変数名の境界を明示できるため、文字列との連結時などに役立ちます。
| 書き方 | 説明 |
|---|---|
$var | 変数 var の値に展開されます。単体で使うときはこれで十分です。 |
${var} | 波括弧で変数名を囲みます。${var}_suffix のように直後に文字列を続けるときに変数名の境界を明示できます。 |
"$var" | ダブルクォートで囲むと空白や改行を含む値でも単一の文字列として扱われます。 |
"${var}" | 波括弧とダブルクォートを組み合わせた最も安全な参照形式です。 |
${var:-default} | 変数が未定義または空のとき default を返します(変数自体は変更されません)。 |
${var:=default} | 変数が未定義または空のとき default を代入してから返します。 |
${#var} | 変数の値の文字列長を返します。 |
readonly(読み取り専用変数)
readonly を付けて宣言した変数は、以降の再代入や unset による削除ができなくなります。定数として扱いたい値に使います。
| 書き方 | 説明 |
|---|---|
readonly var=value | 宣言と同時に読み取り専用にします。 |
var=value; readonly var | 先に代入してから readonly を適用します。 |
declare -r var=value | readonly と同等です。bash の declare 組み込みコマンドを使う書き方です。 |
readonly -p | 現在のシェルで定義されているすべての読み取り専用変数を一覧表示します。 |
unset(変数の削除)
unset コマンドで変数を削除できます。削除後にその変数を参照すると空文字列として扱われます。readonly 変数には unset できません。
| 書き方 | 説明 |
|---|---|
unset var | 変数 var を削除します。$ は付けません。 |
unset -v var | 明示的に変数を削除します(関数と区別するために -v を付ける書き方です)。 |
unset -f func | 関数 func を削除します。 |
環境変数と局所変数
シェル変数のスコープには「局所変数(ローカル変数)」と「環境変数」の2種類があります。局所変数は現在のシェルプロセス内でのみ有効です。export すると子プロセスにも引き継がれる環境変数になります。
| 種類 | 書き方 | 説明 |
|---|---|---|
| 局所変数 | var=value | 現在のシェルプロセス内でのみ有効です。子プロセス(スクリプトや外部コマンド)からは参照できません。 |
| 環境変数(export) | export var=value | 子プロセスに引き継がれます。実行するコマンドやスクリプトから参照できます。 |
| 関数内のローカル変数 | local var=value | 関数スコープ内だけで有効な変数を宣言します。bash 固有の機能です。関数の外からは参照できません。 |
| 環境変数の確認 | env または printenv | 現在の環境変数を一覧表示します。 |
| 局所変数の確認 | set | シェル変数と環境変数の両方を一覧表示します。 |
サンプルコード
psycho_pass_vars.sh
#!/bin/bash
# -----------------------------------------------
# PSYCHO-PASS の登場人物で変数の基本を確認します
# -----------------------------------------------
# -----------------------------------------------
# 1. 変数の代入と参照
# -----------------------------------------------
# 代入: = の前後にスペースを入れてはいけません
inspector="常守朱"
enforcer="狡噛慎也"
division="公安局刑事課一係"
# $var と ${var} — どちらも同じ値を参照します
echo "インスペクター: $inspector"
echo "エンフォーサー: ${enforcer}"
# 文字列と連結するときは ${var} で境界を明示します
echo "${inspector}は${division}に所属しています。"
# コマンド置換: コマンドの実行結果を変数に代入します
current_date=$(date '+%Y-%m-%d')
echo "記録日: ${current_date}"
echo ""
# -----------------------------------------------
# 2. デフォルト値の展開
# -----------------------------------------------
# hue_level が未定義なので デフォルト値 "0" が返ります
echo "色相レベル: ${hue_level:-0}"
# hue_level 自体は未設定のまま(代入は行われません)
echo "hue_level の値: ${hue_level}" # 空文字列
# := でデフォルト値を代入します
echo "犯罪係数: ${crime_coefficient:=50}"
echo "crime_coefficient の値: ${crime_coefficient}" # 50 が代入されています
echo ""
# -----------------------------------------------
# 3. readonly — 読み取り専用変数
# -----------------------------------------------
readonly SIBYL_SYSTEM="シビュラシステム"
echo "管理システム: ${SIBYL_SYSTEM}"
# 再代入しようとするとエラーになります
# SIBYL_SYSTEM="新システム" # bash: SIBYL_SYSTEM: readonly variable
echo ""
# -----------------------------------------------
# 4. unset — 変数の削除
# -----------------------------------------------
target="槙島聖護"
echo "ターゲット(削除前): ${target}"
unset target
echo "ターゲット(削除後): ${target}" # 空文字列になります
echo ""
# -----------------------------------------------
# 5. 局所変数と環境変数
# -----------------------------------------------
# 局所変数: 現在のシェル内だけで有効です
local_agent="宜野座伸元"
# export で環境変数に昇格させます
export DOMINANT_COLOR="青"
echo "局所変数 local_agent: ${local_agent}"
echo "環境変数 DOMINANT_COLOR: ${DOMINANT_COLOR}"
# 子プロセス(bash -c)から参照できるか確認します
bash -c 'echo "子プロセスから DOMINANT_COLOR: ${DOMINANT_COLOR}"'
bash -c 'echo "子プロセスから local_agent: ${local_agent}"' # 空文字列になります
echo ""
# -----------------------------------------------
# 6. 関数内の local 変数
# -----------------------------------------------
check_hue() {
# local を付けると関数スコープ内だけで有効になります
local analyst="雛河翔"
local status="ホログラム解析中"
echo "[関数内] アナリスト: ${analyst} / ステータス: ${status}"
}
check_hue
# 関数の外では analyst・status は参照できません
echo "[関数外] アナリスト: ${analyst}" # 空文字列になります
$ chmod +x psycho_pass_vars.sh $ ./psycho_pass_vars.sh インスペクター: 常守朱 エンフォーサー: 狡噛慎也 常守朱は公安局刑事課一係に所属しています。 記録日: 2026-03-27 色相レベル: 0 hue_level の値: 犯罪係数: 50 crime_coefficient の値: 50 管理システム: シビュラシステム ターゲット(削除前): 槙島聖護 ターゲット(削除後): 局所変数 local_agent: 宜野座伸元 環境変数 DOMINANT_COLOR: 青 子プロセスから DOMINANT_COLOR: 青 子プロセスから local_agent: [関数内] アナリスト: 雛河翔 / ステータス: ホログラム解析中 [関数外] アナリスト:
$var と ${var} の使い分け
| 場面 | 推奨 | 理由 |
|---|---|---|
| 単体で参照するとき | "$var" | ダブルクォートを付けることで空白・改行を含む値を安全に扱えます。 |
| 文字列を直後に続けるとき | "${var}suffix" | 波括弧がないと $varsuffix という別の変数名として解釈されてしまいます。 |
| デフォルト値・文字列長など | ${var:-default} / ${#var} | 波括弧内にパラメータ展開の修飾子を書くため波括弧が必須です。 |
| 配列の全要素 | "${array[@]}" | 各要素を個別の引数として正しく展開するためにダブルクォートと波括弧が必要です。 |
概要
『シェルスクリプト』の変数は var=value で代入し $var または ${var} で参照します。代入時は = の前後にスペースを入れないことが最重要のルールです。文字列と直接連結するときや ${var:-default} のようなパラメータ展開を使うときは波括弧形式を選んでください。readonly(または declare -r)を使うと定数として保護でき、再代入も unset も拒否されます。変数を削除したいときは unset var($ なし)を使います。通常の代入で作られる変数は現在のシェルプロセス内にとどまる局所変数です。子プロセスに引き継ぐには export で環境変数に昇格させます。関数内で local を使うと関数スコープに閉じた変数を定義できます。環境変数と局所変数の違いについては シェルスクリプトの基本構文 も合わせて参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。