
Bash学習記録③_条件分岐(if文)よく使う演算子と実務コード例
1. 条件分岐とは?
「もし〜ならAを実行し、そうでなければBを実行する」という判断をスクリプトに行わせる仕組み。
運用自動化において、エラー検知・容量監視・ファイル存在確認などのコアとなる処理。
2. 基本構文テンプレート
if [ 条件1 ]; then
# 条件1が「真(True)」の時の処理
elif [ 条件2 ]; then
# 条件1は「偽」だが、条件2が「真」の時の処理
else
# どの条件にも当てはまらない時の処理
fi
⚠️ 最重要ルール 3原則
カッコのスペース: [ の直後と ] の直前には必ず半角スペースを入れる([ "$A" -eq 1 ])
変数の参照: 変数の値を評価する際は "$変数名" と $ と "" をセットで付ける
構文の閉じ: if で始めたら、最後は逆から書いた fi で閉じる
3. 条件判定演算子マスタ(崩れないテキスト版)
■ 数値の比較(数値同士を比べるとき)
-gt : 〜より大きい(>) ➔ [Greater Than]
例: [ "$COUNT" -gt 0 ]
-ge : 〜以上(>=) ➔ [Greater or Equal]
例: [ "$USAGE" -ge 80 ]
-eq : 〜と等しい(=) ➔ [Equal]
例: [ "$COUNT" -eq 0 ]
-lt : 〜より小さい(<) ➔ [Less Than]
例: [ "$COUNT" -lt 5 ]
-le : 〜以下(<=) ➔ [Less or Equal]
例: [ "$USAGE" -le 50 ]
-ne : 〜と等しくない(!=) ➔ [Not Equal]
例: [ "$COUNT" -ne 0 ]
■ 文字列の比較(テキスト同士を比べるとき)
= : 〜と等しい(一致する)
例: [ "$ENV" = "production" ]
!= : 〜と等しくない(一致しない)
例: [ "$STATUS" != "OK" ]
-z : 文字列が「空(0文字)」なら真 ➔ [Zero]
例: [ -z "$LOGFILE" ]
-n : 文字列が「空でない(1文字以上)」なら真 ➔ [Not zero]
例: [ -n "$LOGFILE" ]
■ ファイル・ディレクトリの確認
-f : ファイルが存在すれば真 ➔ [File]
例: [ -f "$LOGFILE" ]
-d : ディレクトリが存在すれば真 ➔ [Directory]
例: [ -d "$BACKUP_DIR" ]
■ 複数条件の組み合わせ
&& : 〜かつ(AND)➔ 両方の条件を満たす
例: [ "$ENV" = "production" ] && [ "$COUNT" -ge 10 ]
|| : 〜または(OR)➔ どちらか片方を満たす
例: [ "$STATUS" = "ERROR" ] || [ "$STATUS" = "WARN" ]
コード例
#!/bin/bash
LOGFILE="server.log"
ENV="production"
# 1. ファイルが存在するかチェック
if [ -f "$LOGFILE" ]; then
# 2. エラー件数を取得して多重分岐
COUNT=$(grep "ERROR" "$LOGFILE" | wc -l)
if [ "$ENV" = "production" ] && [ "$COUNT" -ge 10 ]; then
echo "EMERGENCY: Production server has many errors!"
elif [ "$COUNT" -ge 1 ]; then
echo "WARNING: Errors detected."
else
echo "OK: No errors found."
fi
else
echo "ERROR: Log file does not exist."
fi注意箇所
elif の判定順序(大きい数値から書く)
条件は上から順番に評価されます。
❌ -ge 1 を先に書くと、12 のときに -ge 10 まで届かず手前で捕まってしまう。
⭕ 大きい条件(-ge 10)➔ 小さい条件(-ge 1)の順に書く。
elif と else の使い分け
elif ➔ 条件を追加するとき(後ろに [ 条件 ]; then が必要)
else ➔ それ以外全部のとき(後ろに 条件は書かない)


日付指定バックアップスクリプト
目的
カレントディレクトリ内のログファイル(*.log)を自動確認し、ERROR が含まれているファイルのみを「今日の日付がついたバックアップフォルダ」に自動移動(退避)する。
コード (handson.sh)
#!/bin/bash
# 1. 今日の日付を変数に代入 (YYYY-MM-DD形式)
TODAY=$(date +%Y-%m-%d)
DIR="backup_${TODAY}"
# 2. バックアップ用ディレクトリが存在しなければ自動作成
if [ ! -d "$DIR" ]; then
mkdir "$DIR"
fi
# 3. カレントディレクトリ内のすべての .log ファイルをループ処理
for FILE in *.log
do
# ERROR の件数をカウント
COUNT=$(grep "ERROR" "$FILE" | wc -l)
# 件数が 1 以上ならバックアップディレクトリへ移動
if [ "$COUNT" -ge 1 ]; then
echo "Moving $FILE to $DIR/"
mv "$FILE" "$DIR/"
else
echo "keep $FILE in current dir"
fi
done
ポイント
① 日付コマンドと変数展開
TODAY=$(date +%Y-%m-%d)
date コマンドの出力を変数 TODAY に代入(例: 2026-07-30)。
DIR="backup_${TODAY}"
文字列と変数を連結する際は ダブルクォーテーション " で囲む(シングルクォーテーション ' だと展開されない)。
境界を明確にするため ${TODAY} と波カッコをつけるのがベストプラクティス。
② ディレクトリ存在チェックと否定演算子
if [ ! -d "$DIR" ]; then
-d "$DIR":指定ディレクトリが存在するか判定。
!:条件の否定(「〜でない場合」)。
合わせて「ディレクトリが存在しない場合のみ mkdir を実行する」という安全な処理になる。
③ for ループと条件分岐の組み合わせ
for FILE in *.log
ワイルドカードを使って対象ファイルを自動的に1つずつ取り出す。
COUNT=$(grep "ERROR" "$FILE" | wc -l)
grep で特定文字を検索し、wc -l で行数をカウント。
if [ "$COUNT" -ge 1 ]; then
エラー数が 1 以上(-ge 1)の場合のみ移動(mv)を実行。