シェルスクリプト 初級

Bashの条件分岐とテスト演算子

if/elif/else構文とテスト演算子を使ったBashの条件分岐を学び、ファイルテストや文字列・数値比較を実践する

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
複合条件&&, ||, !
パターンマッチ=~[[...]] 内)

条件分岐はシェルスクリプトの要です。[...][[...]] の使い分け、変数のクォート、終了ステータスの活用を意識して書くと、より堅牢なスクリプトが作れます。