こんにちは、かつコーチです。
前回は、値を保存しておく変数の使い方と、クォーティングの落とし穴を解説しました。
今回からは制御構文編に入り、まずは条件によって処理を分ける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コマンドの違いを詳しく比較します。
タグ: Shell, 初心者向け, 制御構文