Bashの条件分岐とテスト演算子
Bashスクリプトで「条件によって処理を分岐させる」ためには if 文を使います。
条件の評価には test コマンド(または [...] / [[...]])を組み合わせます。
ここでは、基本的な構文から、ファイルテスト・文字列比較・数値比較まで順を追って解説します。
1. if 文の基本構文
if [ 条件式 ]; then
# 条件が真のときに実行
elif [ 別の条件式 ]; then
# 別の条件が真のときに実行
else
# どの条件も偽のときに実行
fi
[ と ] はそれぞれスペースで区切る必要があります。忘れると構文エラーになります。
簡単な例
#!/bin/bash
score=75
if [ "$score" -ge 90 ]; then
echo "優"
elif [ "$score" -ge 70 ]; then
echo "良"
elif [ "$score" -ge 60 ]; then
echo "可"
else
echo "不可"
fi
良
2. ファイルテスト演算子
ファイルやディレクトリの状態を調べるための演算子です。
| 演算子 | 意味 |
|---|---|
-e ファイル | ファイルが存在する |
-f ファイル | 通常ファイルである |
-d ファイル | ディレクトリである |
-r ファイル | 読み取り権限がある |
-w ファイル | 書き込み権限がある |
-x ファイル | 実行権限がある |
-s ファイル | サイズが0より大きい |
使用例
#!/bin/bash
FILE="/etc/passwd"
if [ -f "$FILE" ]; then
echo "$FILE は通常ファイルです"
else
echo "$FILE は存在しないか、通常ファイルではありません"
fi
if [ -r "$FILE" ]; then
echo "読み取り可能です"
fi
/etc/passwd は通常ファイルです
読み取り可能です
3. 文字列の比較
| 演算子 | 意味 |
|---|---|
"$a" = "$b" | 文字列が等しい |
"$a" != "$b" | 文字列が異なる |
-z "$a" | 文字列が空(長さ0) |
-n "$a" | 文字列が空でない |
使用例
#!/bin/bash
name="Alice"
if [ "$name" = "Alice" ]; then
echo "こんにちは、Alice!"
fi
empty=""
if [ -z "$empty" ]; then
echo "変数は空です"
fi
こんにちは、Alice!
変数は空です
注意: 変数は必ずダブルクォートで囲む(
"$var")。空文字やスペースが含まれる場合に構文エラーを防げます。
4. 数値の比較
| 演算子 | 意味 |
|---|---|
-eq | 等しい(equal) |
-ne | 等しくない(not equal) |
-lt | より小さい(less than) |
-le | 以下(less or equal) |
-gt | より大きい(greater than) |
-ge | 以上(greater or equal) |
使用例
#!/bin/bash
count=5
if [ "$count" -gt 3 ]; then
echo "count は 3 より大きい"
fi
if [ "$count" -eq 5 ]; then
echo "count は 5 に等しい"
fi
count は 3 より大きい
count は 5 に等しい
5. 論理演算子(AND / OR / NOT)
条件を組み合わせるには以下を使います。
| 記法 | 意味 |
|---|---|
[ 条件A ] && [ 条件B ] | 両方真(AND) |
[ 条件A ] || [ 条件B ] | どちらか真(OR) |
! [ 条件A ] | 否定(NOT) |
[[ 条件A && 条件B ]] | [[...]] 内でのAND |
[[ 条件A || 条件B ]] | [[...]] 内でのOR |
使用例
#!/bin/bash
age=25
citizen="yes"
if [ "$age" -ge 18 ] && [ "$citizen" = "yes" ]; then
echo "投票できます"
fi
file="data.txt"
if [ ! -f "$file" ]; then
echo "$file が存在しないため作成します"
touch "$file"
fi
6. [[...]] の便利な機能
[[...]] は [...] の拡張版で、Bash独自の機能を使えます。
#!/bin/bash
filename="report_2026.txt"
# パターンマッチング(=~ で正規表現)
if [[ "$filename" =~ ^report_[0-9]{4}\.txt$ ]]; then
echo "正しいファイル名形式です"
fi
# ワイルドカードマッチング
if [[ "$filename" == report_* ]]; then
echo "report_ で始まるファイルです"
fi
正しいファイル名形式です
report_ で始まるファイルです
7. コマンドの終了ステータスを条件にする
コマンドの終了ステータス($?)も条件に使えます。成功は 0、失敗は 1 以上です。
#!/bin/bash
if grep -q "root" /etc/passwd; then
echo "root ユーザーが存在します"
fi
# $? を直接使う例
ls /nonexistent 2>/dev/null
if [ $? -ne 0 ]; then
echo "ディレクトリが見つかりません"
fi
root ユーザーが存在します
ディレクトリが見つかりません
練習問題
問題1
引数として渡されたファイルパスが「存在する通常ファイルで、かつ読み取り権限がある」場合に "読み取り可能なファイルです" と表示し、そうでない場合は "ファイルが存在しないか、読み取れません" と表示するスクリプトを書いてください。
問題2
変数 num に任意の整数を入れ、その値が「偶数か奇数か」を判定して表示するスクリプトを書いてください。(ヒント: % は余り演算子で、Bashでは $(( num % 2 )) と書きます)
問題3
以下の条件をすべて満たすときに "条件を満たしています" と表示するスクリプトを書いてください。
- 変数
nameが空でない - 変数
ageが18以上 - 変数
countryが"Japan"と等しい
解答例
問題1の解答
#!/bin/bash
path="$1"
if [ -f "$path" ] && [ -r "$path" ]; then
echo "読み取り可能なファイルです"
else
echo "ファイルが存在しないか、読み取れません"
fi
# 実行例
bash check_file.sh /etc/passwd
# → 読み取り可能なファイルです
bash check_file.sh /nonexistent
# → ファイルが存在しないか、読み取れません
問題2の解答
#!/bin/bash
num=7
if [ $(( num % 2 )) -eq 0 ]; then
echo "$num は偶数です"
else
echo "$num は奇数です"
fi
7 は奇数です
問題3の解答
#!/bin/bash
name="Taro"
age=20
country="Japan"
if [ -n "$name" ] && [ "$age" -ge 18 ] && [ "$country" = "Japan" ]; then
echo "条件を満たしています"
else
echo "条件を満たしていません"
fi
条件を満たしています
まとめ
| 場面 | 使う演算子の例 |
|---|---|
| ファイルの存在確認 | -f, -d, -e |
| 権限の確認 | -r, -w, -x |
| 文字列の比較 | =, !=, -z, -n |
| 数値の比較 | -eq, -ne, -lt, -gt |
| 複合条件 | &&, ||, ! |
| パターンマッチ | =~([[...]] 内) |
条件分岐はシェルスクリプトの要です。[...] と [[...]] の使い分け、変数のクォート、終了ステータスの活用を意識して書くと、より堅牢なスクリプトが作れます。