Bashのif文は、条件に応じて処理を分岐させるための基本構文です。
シェルスクリプトでの自動化や効率化には欠かせない要素であり、正しく使いこなすことで複雑な処理もシンプルに書けるようになります。
本記事では、
- if文の基本構文
- elseやelifによる条件分岐
- 文字列・数値の比較方法
- 複数条件(AND / OR)の判定方法
などを、豊富なコード例とともにわかりやすく解説します。
初めてBashを学ぶ方はもちろん、書き方の見直しやベストプラクティスを確認したい方にも役立つ内容です。
ループ処理については 「Bash for」や「Bash while or until」、その他 スクリプト設計 も参考になるかと思います。
条件分岐も含む Bashについて、包括的に取り扱っている記事はこちらから → Bash
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
if〜fiで条件分岐を囲みます。- 条件式の前後にはスペースが必須です。
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
理由:
- 変数が空のときに構文エラーを防げる
- 文字列にスペースが含まれていても正しく比較できる
- ワイルドカード(
*や?)が意図せず展開されるのを防ぐ
安全な書き方を徹底することで、予期しないバグを防ぎ、より堅牢なスクリプトになります。
数値比較(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文は、シェルスクリプトの中でも特に利用頻度が高い構文です。
基本から応用まで習得しておけば、業務効率化やトラブル対応のスピードアップに大きく貢献します。
