導入
「引数を渡し忘れた」だけで壊滅的な動きをするスクリプトは、いつか誰かが事故を起こします。渡されなかったときにどうするかを、最初に決めておきましょう。
説明
方針は2つです。既定値で続けるか、エラーで止めるか。
#!/bin/bash
set -eu
# 引数がなければ既定値を使う
TARGET_DIR="${1:-logs}"
# 必須の引数がなければ、使い方を出して止める
if [ "$#" -gt 2 ]; then
echo "使い方: sh script.sh [ディレクトリ] [モード]" >&2
exit 1
fi
MODE="${2:-normal}"
echo "対象: $TARGET_DIR"
echo "モード: $MODE"
ls "$TARGET_DIR"
既定値の書き方には種類があります。
| 書き方 | 意味 |
|---|---|
${VAR:-既定値} | 空なら既定値を使う(VAR は変えない) |
${VAR:=既定値} | 空なら既定値を代入して使う |
${VAR:?メッセージ} | 空ならメッセージを出して終了する |
${VAR:+値} | 空でないときだけこの値を使う |
「必須の引数」には ${VAR:?…} が便利です。1行でチェックと終了が書けます。
TARGET="${1:?対象ファイルを指定してください}"
引数チェックの型は、こう覚えてください。
flowchart TD
A["スクリプト開始"] --> B{"引数の数は正しい?"}
B -->|"いいえ"| C["使い方を表示 → exit 1"]
B -->|"はい"| D{"任意の引数は?"}
D --> E["既定値で埋める"]
E --> F["本体の処理へ"]
エラーメッセージは >&2(標準エラー出力)へ出すのが作法です。こうしておくと、sh script.sh > result.txt としたときに、エラーだけは画面に残ります。
やってみよう
引数なしで実行し、既定値の logs が使われることを確かめましょう。次に sh script.sh files として対象が変わること、sh script.sh files debug でモードも変わることを試してください。
演習
sh script.sh files を実行して、対象: files と表示させてください。
ヒント1を見る
下の端末で、引数に files を渡して実行します。
ヒント2を見る
sh script.sh files