メインコンテンツへスキップ
見出し画像
Photo byjagaimo863

Bash学習記録③_条件分岐(if文)よく使う演算子と実務コード例

    1. 条件分岐とは?

    「もし〜ならAを実行し、そうでなければBを実行する」という判断をスクリプトに行わせる仕組み。

    運用自動化において、エラー検知・容量監視・ファイル存在確認などのコアとなる処理。

    2. 基本構文テンプレート

    if [ 条件1 ]; then
        # 条件1が「真(True)」の時の処理
    elif [ 条件2 ]; then
        # 条件1は「偽」だが、条件2が「真」の時の処理
    else
        # どの条件にも当てはまらない時の処理
    fi
    

    ⚠️ 最重要ルール 3原則

    1. カッコのスペース: [ の直後と ] の直前には必ず半角スペースを入れる([ "$A" -eq 1 ])

    2. 変数の参照: 変数の値を評価する際は "$変数名" と $ と "" をセットで付ける

    3. 構文の閉じ: 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)を実行。


    この記事が参加している募集

     
     

    がぼ

     
     
    バスケサークル運営のかたわらサウナや自炊、旅、買ってよかったもの等、日々の心が動いた体験を気ままに記録しています。その時々で「気になったこと」を自由に発信中。一人で過ごす休日や日々の選択肢を広げたい方へ、ほっと一息ついて新しいことを始めるきっかけになれば幸いです。(INFP-T)

    あなたへのおすすめ