変数と引数
このレッスンで分かること
- 変数は
name=value(スペースなし) で代入、参照は$nameまたは${name}- 位置引数は
$1$2$#$@、デフォルト値は${1:-既定値}- 本格運用なら冒頭に
set -euo pipefailを入れて事故防止
変数と引数 とは
シェルスクリプトで変数と引数を活用する方法をターミナルで実践的に学びます。本レッスンでは、変数と引数 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
シェルスクリプトを「使い回せる道具」にするには、固定値ではなく状況に応じて変化する値を扱えなければなりません。バックアップ先のパス、対象ユーザーの名前、処理する日付などをスクリプトの中にハードコードしてしまうと、毎回エディタを開いて編集することになり、自動化の意味が薄れてしまいます。変数と引数は、シェルスクリプトを柔軟に再利用するための土台です。
変数の基本
シェルでは = の左右にスペースを入れずに代入します。スペースを入れるとコマンド扱いされてエラーになるため、ここは初学者が一度はハマるポイントです。
ターミナル
#!/bin/bash
name="Linux"
version=6
echo "$name $version"参照するときは $name または ${name} のように $ を前置します。${name} の波括弧形式は、文字列と連結するときに変数名の終わりを明示できて便利です。
ターミナル
file="report"
echo "${file}_2026.txt" # report_2026.txtクォートの違い
ターミナル
name="Tanaka"
echo "Hello, $name" # ダブルクォートは変数展開する
echo 'Hello, $name' # シングルクォートは展開しない| 書き方 | 変数展開 | 用途 |
|---|---|---|
"..." | される | 一般的な文字列、変数を埋め込みたいとき |
'...' | されない | リテラルで $ をそのまま出したいとき |
| クォートなし | される (空白で分割) | 単純な単語のとき |
空白を含む値はダブルクォートで囲まないと、意図しない単語分割が起きて壊れます。スクリプトを安全に書く基本は「変数参照はとにかくダブルクォートで囲む」と覚えてしまうのが安全です。
位置引数
スクリプトに外から渡す値は 位置引数 として $1, $2, $3 ... で参照できます。
ターミナル
#!/bin/bash
# greet.sh
echo "Hello, $1"
echo "You are $2 years old"ターミナル
$ bash greet.sh Tanaka 30
Hello, Tanaka
You are 30 years old主な特殊変数は次のとおりです。
| 変数 | 意味 |
|---|---|
$0 | スクリプト自身の名前 |
$1, $2, ... | 1 番目, 2 番目の引数 |
$# | 引数の個数 |
$@ | 全ての引数 (個別) |
$* | 全ての引数 (1 つの文字列) |
$? | 直前のコマンドの終了ステータス (0 = 成功) |
引数の処理フロー
位置引数はコマンドラインから直接受け取れるため、cron や CI から呼ぶときも引数を変えるだけで挙動を切り替えられます。
デフォルト値とパラメータ展開
引数が省略されたときに備えて、デフォルト値を持たせるとスクリプトが堅牢になります。
ターミナル
#!/bin/bash
name="${1:-guest}" # $1 が空なら guest を使う
echo "Hello, $name"他にも ${var:?エラーメッセージ} で必須化したり、${var:+置き換え値} で「セットされていれば」分岐する書き方ができます。set -u を組み合わせると、未定義変数の参照で即座にエラーにできてバグを早期発見できます。
| 展開記法 | 動き | 用途 |
|---|---|---|
${var:-既定} | 空なら既定値 | デフォルト値 |
${var:=既定} | 空なら既定を代入 | 初期化 |
${var:?エラー} | 空ならエラー終了 | 必須化 |
${var:+置換} | セット時のみ置換 | 条件付き出力 |
${var#prefix} | 先頭マッチ削除 | 文字列加工 |
${var%suffix} | 末尾マッチ削除 | 拡張子除去 |
本格的なスクリプトでは冒頭に
set -euo pipefailを入れる習慣を付けると、未定義変数やコマンド失敗、パイプ途中のエラーをすぐに検知できます。本番運用の bash 暗黙のお作法と思って覚えておくと事故が減ります。
ローカル変数とエクスポート
スクリプト内で定義した変数はそのプロセス内で有効です。子プロセス (パイプの右側など) にも継承したい場合は export を使います。
ターミナル
export API_URL="https://api.example.com"
bash subscript.sh # subscript からも $API_URL が見える環境変数として外部から渡したいときも export を使います。逆に、シェル関数内では local を付けてスコープを閉じるのが定石です (関数のレッスンで再度触れます)。
「変数を export する必要があるか」は、その変数を子プロセスから読みたいかどうかで決めます。スクリプト内部だけで完結するなら export 不要、別コマンドや別スクリプトに渡したいなら export します。何でも export する書き方は意図しない挙動の温床になります。
引数を使った実例
ターミナル
#!/bin/bash
# count_files.sh
dir="${1:-.}"
count=$(ls "$dir" | wc -l)
echo "$dir contains $count items"$(...) は コマンド置換 で、コマンドの実行結果を変数に取り込みます。古い書き方ではバッククォート ` ... ` も使われますが、現在は $(...) が読みやすく推奨されます。
ここまでの要点
変数は = の前後にスペースなし、参照は $var / ${var}。位置引数 $1 $@ $# を覚える。デフォルトは ${1:-既定}、必須化は ${1:?}。set -euo pipefail で事故防止、$(...) でコマンド置換。
まとめ
- 変数は
name=value形式で代入、$nameで参照 ".."でクォートして安全な単語分割を保つ$1,$2,$#,$@で位置引数を扱う${var:-default}で省略時のデフォルトを設定できるexportで環境変数として子プロセスに渡せる$(コマンド)で実行結果を変数に取り込める
次のレッスン
次は 条件分岐 if で、シェルスクリプトで変数と引数を活用する方法をターミナルで実践的に学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 変数と引数 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 変数と引数 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- 変数 name に Linux を代入する
- echo で Hello, Linux を出力する