Bash if文・シェルスクリプト条件分岐の基本|else・elif・文字列比較まとめ

分岐・反復
スポンサーリンク

Bashのif文は、条件に応じて処理を分岐させるための基本構文です。
シェルスクリプトでの自動化や効率化には欠かせない要素であり、正しく使いこなすことで複雑な処理もシンプルに書けるようになります。

本記事では、

  • if文の基本構文
  • elseやelifによる条件分岐
  • 文字列・数値の比較方法
  • 複数条件(AND / OR)の判定方法

などを、豊富なコード例とともにわかりやすく解説します。

初めてBashを学ぶ方はもちろん、書き方の見直しやベストプラクティスを確認したい方にも役立つ内容です。

ループ処理については 「Bash for」や「Bash while or until」、その他 スクリプト設計 も参考になるかと思います。

条件分岐も含む Bashについて、包括的に取り扱っている記事はこちらから → Bash

  1. Bash if文|すぐ試せるコピペサンプル集
    1. 1. 数値比較
    2. 2. 変数の空チェック
    3. 3. ファイルの存在確認
    4. 4. 配列の要素確認
    5. 5. 文字列比較
    6. 6. 複数条件(AND / OR)
    7. 7. コマンド実行結果の判定
    8. 8. ファイル更新日時による判定
    9. 9. ディレクトリの存在確認
  2. Bashのif文とは(bash if)
    1. if文の役割と基本構造
    2. [ ] と [[ ]] の違い(比較表)
  3. if else構文の使い方(bash if else)
    1. 基本構文と流れ図
    2. シンプルな数値比較例
  4. elifを使った複数条件分岐(bash else if / bash if else if)
    1. elif の書き方と動作の流れ
    2. 「else if」と書けない理由(エラー例)
    3. elifとcase文の使い分け
  5. 文字列比較の方法(bash if 文字列比較)
    1. = と != の使い方
    2. -z / -n で空・非空を判定
    3. 文字列比較の注意点(引用符必須など)
  6. 数値比較(bash if eq)
    1. -eq, -ne, -gt, -lt, -ge, -le の一覧表
    2. 実例:ユーザー入力値による判定
  7. 複数条件の判定(bash if and)
    1. AND条件の書き方:&& と -a の違い
    2. OR条件の書き方:|| と -o の違い
    3. 推奨される構文と非推奨構文
  8. ファイルやディレクトリの存在チェック
    1. -e, -f, -d などのファイルテスト演算子
    2. 実用例:ログファイルの有無で処理分岐
  9. 実践ユースケース集
    1. コマンドの成功/失敗を判定して分岐
    2. CLI引数がない場合のデフォルト処理
    3. ファイル更新日時で処理切り替え
  10. よくあるエラーと対策(Q&A形式)
    1. Q. else ifは使える?
    2. Q. スペースが足りないとエラーになるのはなぜ?
    3. Q. bash if eq と == の違いは?
  11. まとめ
    1. if文習得のメリット
    2. 応用先(自動化スクリプト、監視処理、日常業務改善)
  12. 関連記事

Bash if文|すぐ試せるコピペサンプル集

Bashのif文は、条件によって処理を分けるための基本構文です。

ここでは、そのままコピーして使える実用的なサンプルコードをまとめました。
スクリプト作成や条件分岐の学習にぜひご活用ください。

1. 数値比較

#!/bin/bash
num=10
if [ "$num" -gt 5 ]; then
    echo "numは5より大きいです"
elif [ "$num" -eq 5 ]; then
    echo "numは5です"
else
    echo "numは5以下です"
fi
  • -gt(より大きい)、-eq(等しい)など数値比較演算子を利用。

2. 変数の空チェック

#!/bin/bash
name=""
if [ -z "$name" ]; then
    echo "nameは空です"
fi
  • -z は文字列が空かどうかを判定します。
  • -n を使えば非空の判定も可能です。

3. ファイルの存在確認

#!/bin/bash
file_path="/tmp/test.txt"
if [ -f "$file_path" ]; then
    echo "ファイルが存在します: $file_path"
else
    echo "ファイルが存在しません: $file_path"
fi
  • -f は通常ファイル、-e は存在するかどうかを判定します。

4. 配列の要素確認

#!/bin/bash
fruits=("apple" "banana" "cherry")
if [ "${#fruits[@]}" -gt 0 ]; then
    echo "配列には${#fruits[@]}個の要素があります"
    echo "1つ目の要素は: ${fruits[0]}"
fi
  • ${#配列[@]} で要素数を取得できます。
  • -gt 0 で0以上を判定

5. 文字列比較

#!/bin/bash
str="hello"
if [ "$str" = "hello" ]; then
    echo "文字列が一致しました"
fi
  • =(一致)、!=(不一致)を利用。
  • 引用符で囲むことでスペースや空文字にも対応。

6. 複数条件(AND / OR)

#!/bin/bash
age=20
country="JP"
if [ "$age" -ge 18 ] && [ "$country" = "JP" ]; then
    echo "日本在住の18歳以上です"
fi
  • &&(AND条件)、||(OR条件)を利用。
  • -a-o は古い構文のため、推奨されません。

7. コマンド実行結果の判定

#!/bin/bash
if ls /tmp >/dev/null 2>&1; then
    echo "コマンドが成功しました"
else
    echo "コマンドが失敗しました"
fi
  • 終了ステータスが0(成功)かどうかで分岐します。

8. ファイル更新日時による判定

#!/bin/bash
file_path="/tmp/data.txt"
if [ "$file_path" -nt "/tmp/reference.txt" ]; then
    echo "data.txtはreference.txtより新しいです"
fi
  • -nt(newer than)、-ot(older than)で比較可能。

9. ディレクトリの存在確認

#!/bin/bash
dir="/tmp/mydir"
if [ -d "$dir" ]; then
    echo "ディレクトリが存在します"
fi
  • -d はディレクトリかどうかを判定します。

Bashのif文とは(bash if)

if文の役割と基本構造

Bashのif文は、条件に応じて処理を分岐させるための構文です。
特定の条件が**真(true)**の場合のみ処理を実行したり、**偽(false)**の場合は別の処理を実行したりすることができます。

基本構文は以下の通りです。

if [ 条件式 ]; then
    # 条件が真の場合の処理
elif [ 別の条件式 ]; then
    # 他の条件が真の場合の処理
else
    # すべての条件が偽の場合の処理
fi
  • iffi で条件分岐を囲みます。
  • 条件式の前後にはスペースが必須です。
  • elif を使うことで複数条件の分岐が可能です。

[ ] と [[ ]] の違い(比較表)

Bashでは条件式を書くときに、[ ] または [[ ]] を使います。
どちらも条件式を評価しますが、機能や挙動に違いがあります。

項目[ ](testコマンド)[[ ]](拡張test構文)
対応シェルPOSIX互換シェル全般Bash, Zsh など一部シェル
役割test コマンドの別名Bashの構文として組み込み
文字列比較= , !== , != , =~(正規表現)
論理演算-a , -o&& , `
ワイルドカード展開される(引用符必須)展開されない(安全)
推奨度移植性重視ならこちらBash限定で高機能に使える

ポイント

  • 移植性を重視するなら [ ] を使う。
  • Bash限定で正規表現や安全な条件式を使いたい場合は [[ ]] が便利。
  • 文字列比較や複数条件を扱うときは、[[ ]] の方が記述ミスを防ぎやすいです。

if else構文の使い方(bash if else)

基本構文と流れ図

if else 構文は、条件がの場合との場合で処理を分けたいときに使います。
if 部分が真でなければ、自動的に else 部分が実行されます。

基本構文は以下の通りです。

if [ 条件式 ]; then
    # 条件が真の場合の処理
else
    # 条件が偽の場合の処理
fi

処理の流れは次のようになります。

条件式を評価
   ├─ 真(true) → ifブロックの処理を実行
   └─ 偽(false) → elseブロックの処理を実行

シンプルな数値比較例

#!/bin/bash
score=75

if [ "$score" -ge 60 ]; then
    echo "合格です"
else
    echo "不合格です"
fi

この例では、変数 score が60以上なら「合格」、それ以外は「不合格」と表示します。
-ge は「greater than or equal to(以上)」を意味する数値比較演算子です。

elifを使った複数条件分岐(bash else if / bash if else if)

elif の書き方と動作の流れ

Bashでは、複数の条件を順番に評価したい場合に elif を使います。
elif「else if」 に相当しますが、Bashの構文上は必ず1単語で elif と書きます。

基本構文は以下の通りです。

if [ 条件式1 ]; then
    # 条件1が真の場合の処理
elif [ 条件式2 ]; then
    # 条件1が偽かつ条件2が真の場合の処理
elif [ 条件式3 ]; then
    # 条件1・2が偽かつ条件3が真の場合の処理
else
    # すべての条件が偽の場合の処理
fi

動作の流れは次のようになります。

条件1を評価
   ├─ 真 → ifブロックを実行(以降は評価しない)
   └─ 偽 → 条件2を評価
            ├─ 真 → elifブロックを実行
            └─ 偽 → 条件3...(繰り返し)
                 └─ すべて偽 → elseブロックを実行

「else if」と書けない理由(エラー例)

Bashのif文はC言語などと異なり、else if という書き方はできません。
半角スペースを入れると構文エラーになります。

# 間違い(構文エラーになる)
if [ "$num" -gt 0 ]; then
    echo "正の数"
else if [ "$num" -eq 0 ]; then
    echo "ゼロ"
fi

実行すると以下のようなエラーが出ます。

syntax error near unexpected token `if'

正しくは elif を使います。

# 正しい書き方
if [ "$num" -gt 0 ]; then
    echo "正の数"
elif [ "$num" -eq 0 ]; then
    echo "ゼロ"
else
    echo "負の数"
fi

elifとcase文の使い分け

elif は条件式を柔軟に書けますが、特定の値の一致判定が多い場合は case 文のほうが読みやすくなります。

elif の例(柔軟な条件式に向く)

if [ "$score" -ge 80 ]; then
    echo "優"
elif [ "$score" -ge 60 ]; then
    echo "良"
else
    echo "可"
fi

case の例(特定の値ごとの分岐に向く)

case "$fruit" in
    apple)
        echo "りんごです"
        ;;
    banana)
        echo "バナナです"
        ;;
    *)
        echo "その他のフルーツです"
        ;;
esac
  • elif: 数値比較、複雑な条件式、範囲判定などに向く
  • case: 文字列の完全一致やパターンマッチに向く

文字列比較の方法(bash if 文字列比較)

= と != の使い方

Bashのif文では、文字列が等しいかどうかを比較するために =、等しくないかを比較するために != を使います。

#!/bin/bash
str="hello"

if [ "$str" = "hello" ]; then
    echo "文字列が一致しました"
fi

if [ "$str" != "world" ]; then
    echo "文字列は一致していません"
fi
  • = は文字列が一致するかを判定します。
  • != は文字列が一致しないかを判定します。

-z / -n で空・非空を判定

文字列が空かどうかは -z、非空かどうかは -n で判定します。

#!/bin/bash
name=""

if [ -z "$name" ]; then
    echo "nameは空です"
fi

name="Alice"
if [ -n "$name" ]; then
    echo "nameは空ではありません"
fi
  • -z は長さが0(空文字列)の場合に真を返します。
  • -n は長さが1以上(非空文字列)の場合に真を返します。

文字列比較の注意点(引用符必須など)

文字列比較では、変数を必ず二重引用符 " で囲むのが安全です。

if [ "$var" = "test" ]; then
    echo "一致"
fi

理由:

  1. 変数が空のときに構文エラーを防げる
  2. 文字列にスペースが含まれていても正しく比較できる
  3. ワイルドカード(*?)が意図せず展開されるのを防ぐ

安全な書き方を徹底することで、予期しないバグを防ぎ、より堅牢なスクリプトになります。

数値比較(bash if eq)

-eq, -ne, -gt, -lt, -ge, -le の一覧表

Bashのif文では、数値比較に専用の演算子を使います。
文字列比較用の =!= は数値には使えないため注意してください。

演算子意味
-eq等しい[ "$a" -eq "$b" ]
-ne等しくない[ "$a" -ne "$b" ]
-gtより大きい[ "$a" -gt "$b" ]
-ltより小さい[ "$a" -lt "$b" ]
-ge以上[ "$a" -ge "$b" ]
-le以下[ "$a" -le "$b" ]

実例:ユーザー入力値による判定

#!/bin/bash
read -p "年齢を入力してください: " age

if [ "$age" -lt 0 ]; then
    echo "年齢は0以上で入力してください"
elif [ "$age" -lt 20 ]; then
    echo "未成年です"
elif [ "$age" -lt 65 ]; then
    echo "成人です"
else
    echo "シニアです"
fi

この例では、read コマンドでユーザーから年齢を入力してもらい、
入力値に応じて条件分岐しています。

  • -lt(less than)で「未成年」や「成人」などを判定
  • 条件は上から順に評価され、最初に一致したものが実行されます

複数条件の判定(bash if and)

AND条件の書き方:&& と -a の違い

Bashのif文で複数条件をすべて満たす場合に真としたいときは、AND条件を使います。

# 推奨構文(&& を使う)
if [ "$age" -ge 18 ] && [ "$country" = "JP" ]; then
    echo "日本在住の18歳以上です"
fi
# 古い構文(-a を使う)
if [ "$age" -ge 18 -a "$country" = "JP" ]; then
    echo "日本在住の18歳以上です"
fi
  • && は読みやすく、構文エラーも少ないため推奨されます。
  • -a は古い記法で、条件式の解釈が曖昧になる場合があるため非推奨です。

OR条件の書き方:|| と -o の違い

複数条件のうちいずれかが真の場合に処理を実行したいときは、OR条件を使います。

# 推奨構文(|| を使う)
if [ "$day" = "Saturday" ] || [ "$day" = "Sunday" ]; then
    echo "今日は休日です"
fi
# 古い構文(-o を使う)
if [ "$day" = "Saturday" -o "$day" = "Sunday" ]; then
    echo "今日は休日です"
fi
  • || は明確に条件を分けて書けるため推奨されます。
  • -o-a 同様に構文解釈の曖昧さから非推奨です。

推奨される構文と非推奨構文

条件種別推奨構文非推奨構文
AND条件[ 条件1 ] && [ 条件2 ][ 条件1 -a 条件2 ]
OR条件[ 条件1 ] || [ 条件2 ][ 条件1 -o 条件2 ]
  • 推奨構文の利点
    • 読みやすく、条件式が明確
    • 引数の解釈ミスや予期せぬ展開を防ぎやすい
  • 非推奨構文のリスク
    • 条件式が複雑になると誤動作しやすい
    • POSIX互換性の問題やシェルによる挙動差が出ることがある

ファイルやディレクトリの存在チェック

-e, -f, -d などのファイルテスト演算子

Bashでは、ファイルやディレクトリの存在や種類を判定するためにファイルテスト演算子を使います。

演算子意味
-eファイルまたはディレクトリが存在する[ -e path ]
-f通常ファイルが存在する[ -f path ]
-dディレクトリが存在する[ -d path ]
-r読み取り可能[ -r path ]
-w書き込み可能[ -w path ]
-x実行可能[ -x path ]
-sサイズが0より大きい[ -s path ]
-nt指定ファイルより新しい[ file1 -nt file2 ]
-ot指定ファイルより古い[ file1 -ot file2 ]

実用例:ログファイルの有無で処理分岐

#!/bin/bash
log_file="/var/log/myapp.log"

if [ -f "$log_file" ]; then
    echo "ログファイルが存在します。内容を表示します。"
    cat "$log_file"
else
    echo "ログファイルが存在しません。新規作成します。"
    touch "$log_file"
fi

この例では、ログファイルが存在する場合は内容を表示し、存在しない場合は新しく作成します。

ポイント

  • -f は通常ファイル限定なので、ディレクトリや特殊ファイルは除外されます。
  • ディレクトリの存在を確認する場合は -d を使います。
  • ファイルの新旧比較をする場合は -nt-ot が便利です。

実践ユースケース集

コマンドの成功/失敗を判定して分岐

Bashでは、直前に実行したコマンドの終了ステータス(0が成功、0以外が失敗)を使って条件分岐できます。
直接 if にコマンドを書く方法がシンプルです。

#!/bin/bash
if ping -c 1 example.com >/dev/null 2>&1; then
    echo "ネットワーク接続に成功しました"
else
    echo "ネットワーク接続に失敗しました"
fi
  • >/dev/null 2>&1 は標準出力とエラー出力を非表示にするためのリダイレクトです。
  • if に直接コマンドを書くと、成功時にthenブロック、失敗時にelseブロックが実行されます。

CLI引数がない場合のデフォルト処理

スクリプト実行時に引数が渡されなかった場合、デフォルト値を設定して処理します。

#!/bin/bash
file_path="${1:-/tmp/default.txt}"

if [ -f "$file_path" ]; then
    echo "指定されたファイルを使用します: $file_path"
else
    echo "ファイルが存在しません: $file_path"
fi
  • ${1:-値} は「第1引数が空または未設定なら値を使う」という構文です。
  • 引数チェックには -z "$1" を使ってもOKです。

ファイル更新日時で処理切り替え

2つのファイルの更新日時を比較し、新しい方を使うなどの処理が可能です。

#!/bin/bash
config_file="/etc/myapp/config.cfg"
backup_file="/etc/myapp/config.bak"

if [ "$config_file" -nt "$backup_file" ]; then
    echo "設定ファイルがバックアップより新しいため、バックアップを更新します。"
    cp "$config_file" "$backup_file"
else
    echo "バックアップが最新です。更新は不要です。"
fi
  • -nt は「newer than(より新しい)」、-ot は「older than(より古い)」を意味します。
  • 設定ファイルの変更検出やバックアップ更新スクリプトに便利です。

よくあるエラーと対策(Q&A形式)

Q. else ifは使える?

A. 使えません。Bashでは else if ではなく、elif と1単語で書きます。
else if と書くと構文エラーになります。

誤り(エラーになる例)

if [ "$num" -gt 0 ]; then
    echo "正の数"
else if [ "$num" -eq 0 ]; then
    echo "ゼロ"
fi

正しい書き方

if [ "$num" -gt 0 ]; then
    echo "正の数"
elif [ "$num" -eq 0 ]; then
    echo "ゼロ"
else
    echo "負の数"
fi

Q. スペースが足りないとエラーになるのはなぜ?

A. [ ]コマンドとして解釈されるため、括弧の外側や演算子の前後にスペースが必要です。

誤り(スペースなし)

if ["$num"-gt5]; then
    echo "NG"
fi

実行結果:

bash: [ "$num"-gt5 ]: command not found

正しい書き方

if [ "$num" -gt 5 ]; then
    echo "OK"
fi
  • [ の後ろと ] の前には必ずスペースを入れる
  • 演算子(-gt など)の前後にもスペースが必要

Q. bash if eq と == の違いは?

A. -eq は数値比較、== は文字列比較に使います。

# 数値比較(-eq)
if [ "$a" -eq 10 ]; then
    echo "aは10です"
fi

# 文字列比較(==)
if [ "$b" == "apple" ]; then
    echo "bはappleです"
fi
  • 数値を比較する場合に == を使うと、意図通りに動かないかエラーになることがあります。
  • 数値は -eq / -ne / -gt / -lt / -ge / -le、文字列は = / != / ==[[ ]]使用時)を使い分けましょう。

まとめ

if文習得のメリット

Bashのif文を使いこなせるようになると、条件に応じた柔軟な処理が書けるようになります。
単純なスクリプトから複雑な分岐ロジックまで対応でき、処理の自動化や効率化に直結します。

特に、数値・文字列・ファイル状態・コマンド結果など、さまざまな条件を組み合わせることで、実務レベルのスクリプトが構築可能になります。

  • 手作業の条件分岐を自動化できる
  • スクリプトの安全性・堅牢性が向上する
  • 再利用しやすいコードが書ける

応用先(自動化スクリプト、監視処理、日常業務改善)

if文は、日常業務からシステム運用まで幅広く応用できます。

  • 自動化スクリプト
    • バックアップ処理
    • ログ整理
    • ファイルの振り分け
  • 監視処理
    • サーバー死活監視(ping結果による判定)
    • サービス稼働チェック
    • エラー検知と通知
  • 日常業務改善
    • 入力値チェック
    • 条件付きメール送信
    • 実行環境ごとの設定切り替え

Bashのif文は、シェルスクリプトの中でも特に利用頻度が高い構文です。
基本から応用まで習得しておけば、業務効率化やトラブル対応のスピードアップに大きく貢献します。

スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする