本文へスキップ
BecomeCoder

シェルスクリプトコース · 第7章 安全に書く · レッスン31

既定値と必須チェック ― 引数がなくても壊れない

ブラウザで完結

導入

「引数を渡し忘れた」だけで壊滅的な動きをするスクリプトは、いつか誰かが事故を起こします。渡されなかったときにどうするかを、最初に決めておきましょう。

説明

方針は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

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。