2026年11月1日

2026年11月1日

bash if文・case文の書き方

はじめに

シェルスクリプトで判断を伴う処理を書くには、if 文と case 文が欠かせません。if は柔軟な条件評価、case は値のパターンマッチによる分岐に向いており、用途で使い分けます。

bashの条件式は他言語と書き方が異なり、[ ] や [[ ]] の使い方、文字列と数値の比較演算子の違いなど、独特の作法があります。本記事で要点を押さえましょう。

症状・背景

条件分岐 が必要になる主な場面:

  • 引数の有無や値で動作を切り替えたいとき
  • ファイル/ディレクトリの存在確認
  • コマンドの成否で次のアクションを変えたいとき
  • 環境 (Production / Staging) で挙動を変えたいとき

手順・設定方法

ステップ1: 基本のif文

#!/usr/bin/env bash

if [[ "$1" == "start" ]]; then
    echo "サービスを開始します"
elif [[ "$1" == "stop" ]]; then
    echo "サービスを停止します"
else
    echo "Usage: $0 {start|stop}"
    exit 1
fi

ステップ2: 主要な比較演算子

# 文字列比較
[[ "$a" == "$b" ]]    # 等しい
[[ "$a" != "$b" ]]    # 等しくない
[[ -z "$a" ]]         # 空文字列
[[ -n "$a" ]]         # 非空文字列

# 数値比較 (-eq -ne -lt -le -gt -ge)
[[ "$count" -gt 10 ]]      # > 10
[[ "$count" -eq 0 ]]       # == 0

# ファイルテスト
[[ -e /etc/hosts ]]   # 存在する
[[ -f /etc/hosts ]]   # 通常ファイル
[[ -d /var/log ]]     # ディレクトリ
[[ -r file ]]         # 読み込み可
[[ -w file ]]         # 書き込み可
[[ -x file ]]         # 実行可
[[ -s file ]]         # サイズが0より大きい

# 論理演算
[[ "$a" == "x" && "$b" == "y" ]]
[[ "$a" == "x" || "$b" == "y" ]]

ステップ3: case文によるパターンマッチ

#!/usr/bin/env bash

case "$1" in
    start)
        echo "起動します"
        ;;
    stop)
        echo "停止します"
        ;;
    restart|reload)
        echo "再起動します"
        ;;
    status)
        echo "ステータスを表示"
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|status}"
        exit 1
        ;;
esac

ステップ4: コマンド成否での分岐

# コマンドの終了コードで条件分岐
if ping -c 1 -W 1 example.com > /dev/null 2>&1; then
    echo "到達可能"
else
    echo "到達不可"
fi

# 短絡評価 (&&, ||)
mkdir -p /backup && echo "OK" || echo "NG"

# ファイル存在確認のショートカット
[[ -f /etc/nginx/nginx.conf ]] && nginx -t

# パターンマッチを case で
read -p "続行しますか? [y/N]: " ans
case "$ans" in
    [yY]|[yY][eE][sS]) echo "続行します" ;;
    *)                 echo "中止します"; exit 0 ;;
esac

注意事項

  • [ ] (test) より [[ ]] (拡張test) を推奨。クォート省略時の事故が少なく、パターンマッチも使えます
  • 文字列比較は ==/!=、数値比較は -eq/-gt など。混在に注意
  • 変数は必ずクォートで囲む。[[ $var == "x" ]] でも基本は安全だが、ダブルクォートが無難
  • case のパターンには *、?、[abc] などのグロブが使えます

まとめ

1. 基本: if [[ 条件 ]]; then ... fi の構造

2. 比較: 文字列は ==、数値は -eq / -gt など別演算子

3. ファイル: -f(ファイル) -d(ディレクトリ) -x(実行可)

4. case: 多分岐は case ... esac が読みやすい

5. 短絡: && / || で1行分岐も活用

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲