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行分岐も活用
関連記事: