【Shell Script】if文で条件分岐する基本

Shell Script

こんにちは、かつコーチです。

前回は、値を保存しておく変数の使い方と、クォーティングの落とし穴を解説しました。

今回からは制御構文編に入り、まずは条件によって処理を分けるif文を扱います。

「ファイルがあれば処理する、なければスキップする」といった判断は、実務のスクリプトでほぼ必ず登場します。

比較演算子の細かい違いはSH05に譲り、今回はif文そのものの基本形をしっかり押さえます。

if文とは?

if文:条件によって道を分ける案内標識

if文とは、「もし◯◯なら△△する、そうでなければ□□する」という判断をスクリプトに組み込むための構文です。

道路の案内標識をイメージしてください。

「工事中ならう回路へ、そうでなければ直進」というように、状況によって進む道を切り替える役割を果たします。

if文があることで、スクリプトは決まった手順をなぞるだけでなく、状況に応じて振る舞いを変えられるようになります。

なぜ条件分岐が必要なのか

たとえば「ログファイルが存在すれば内容を表示し、存在しなければエラーメッセージを出す」という処理は、条件分岐なしには書けません。

条件分岐がないスクリプトは、常に同じ手順しか実行できず、想定外の状況(ファイルがない、値が空など)に対応できずにエラーで止まってしまいます。

基本の書き方

手順1:if文の基本形

シェルスクリプトのif文は、次のような形で書きます。

#!/bin/bash
count=5

if [ "$count" -gt 3 ]; then
  echo "3より大きいです"
fi
3より大きいです

[ "$count" -gt 3 ]の部分が条件式で、「countが3より大きければ」という意味になります。

-gtは「greater than(より大きい)」の略で、数値を比較する演算子です。

thenの後に、条件が真(true)だったときの処理を書き、最後はfi(ifを逆から読んだもの)で締めくくります。

手順2:else・elifで分岐を増やす

条件が偽(false)だったときの処理はelseで追加できます。

#!/bin/bash
count=2

if [ "$count" -gt 3 ]; then
  echo "3より大きいです"
else
  echo "3以下です"
fi

3つ以上に条件を分けたい場合はelif(else ifの略)を使います。

#!/bin/bash
score=75

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

上から順に条件が評価され、最初に真になったelifの処理だけが実行されます。

手順3:ファイルの存在確認と組み合わせる

if文は、ファイルの有無を確認する処理でもよく使われます。

#!/bin/bash
log_file="/var/log/syslog"

if [ -f "$log_file" ]; then
  echo "ログファイルが見つかりました"
else
  echo "ログファイルがありません"
fi

-fはファイルが存在するかどうかを判定するオプションで、こうした判定オプションはSH05で一覧にして紹介します。

よくあるつまずきポイント:数値比較と文字列比較の混同

私が初めてif文を書いたとき、数値のつもりで=を使ってしまい、意図しない挙動に悩んだことがあります。

❌ Before:数値の比較に文字列用の演算子を使う

count=10
if [ "$count" = 9 ]; then
  echo "9です"
fi

このコード自体はエラーにはなりませんが、=は本来「文字列が完全に一致するか」を見る演算子であり、数値としての大小比較には使えません。

さらに厄介なことに、値によっては次のようなエラーも起こります。

count="abc"
if [ "$count" -gt 3 ]; then
  echo "3より大きいです"
fi
bash: [: abc: integer expression expected

-gtは数値専用の演算子なので、数字ではない文字列を渡すと「integer expression expected(整数が期待されている)」というエラーになります。

✅ After:数値には数値用、文字列には文字列用の演算子を使う

count=10
if [ "$count" -eq 9 ]; then
  echo "9です"
fi

name="katsu"
if [ "$name" = "katsu" ]; then
  echo "一致しました"
fi

数値の比較には-eq(等しい)や-gt(より大きい)を、文字列の比較には=!=を使うと覚えておけば、この種のエラーはほぼ防げます。

応用・一歩先の使い方

複数条件をつなげる(AND・OR)

複数の条件を同時に満たすかどうかを調べたいときは、&&(かつ)や||(または)を使います。

#!/bin/bash
age=25
has_ticket=1

if [ "$age" -ge 20 ] && [ "$has_ticket" -eq 1 ]; then
  echo "入場できます"
fi

「20歳以上」かつ「チケットを持っている」の両方を満たしたときだけ、メッセージが表示されます。

条件が複雑になってきたら、1つずつ[ ]で区切って&&||でつなぐと可読性を保てます。

コマンドの終了ステータスで分岐する

if文は、コマンドが成功したかどうか(終了ステータス)で分岐させることもできます。

if grep -q "error" /var/log/app.log; then
  echo "エラーが見つかりました"
fi

grep -qは該当行があれば終了ステータス0(成功)を返すため、[ ]を使わずに直接if文の条件として使えます。

まとめ

この記事のポイント

  • if文は「もし◯◯なら」という条件分岐で、道を分ける案内標識にあたる
  • if [ 条件 ]; then ... elif ... else ... fiの形で書く
  • 数値比較は-eq-gtなど、文字列比較は=!=を使う
  • &&||で複数条件をつなげられる

次に読むべき記事

次回は、今回登場した[ ]と、より安全な[[ ]]testコマンドの違いを詳しく比較します。

→ 次の記事:test・[ ]・の違いと比較演算子

タグ: Shell, 初心者向け, 制御構文

タイトルとURLをコピーしました