前回の記事(入門7)では、条件式を評価するための test コマンドや [ ] / [[ ]] の違いについて解説しました。
今回は、その条件式を使って実際にプログラムを枝分かれさせる「if文」について解説します。シェルスクリプトの if は、他のプログラミング言語(PythonやJavaScriptなど)とは根本的に異なる動きをするため、初心者がつまずきやすいポイントの1つです。
実務で必須の「コマンドが成功したか失敗したか(終了ステータス)」の判定と合わせて、分かりやすく紐解いていきましょう!
1. シェルスクリプトの「if」はコマンドの成功・失敗で動く
他の一般的なプログラミング言語では、if (条件式) の結果が「True(真)」か「False(偽)」かで分岐します。しかし、シェルスクリプトの if は違います。
シェルスクリプトの if は、「直後に書いたコマンドが成功したか(エラーなく実行できたか)」で分岐します。
if [ $s = "test" ] という書き方も、実は “[" という「testコマンド」を実行して、それが成功したかどうかを if が見ているに過ぎません。
2. if文の基本ルールと構文
シェルスクリプトの if の基本形は以下の通りです。
if コマンド; then
# コマンドが成功した(エラーなし)時の処理
fi⚠️ 注意:セミコロン(;)の位置
if のある行の末尾に ; then と書くのが一般的ですが、このセミコロン(;)を忘れると構文エラーになります。もしセミコロンを書きたくない場合は、以下のように then を次の行に書く必要があります(実務では一行でスッキリ書けるセミコロン付きが好まれます)。
# セミコロンを使わない書き方
if コマンド
then
# 処理
fi3. 最重要:「終了ステータス ($?)」の仕組み
すべてのコマンドは、実行が終わるとOSに対して「終了ステータス」を残します。この番号は、直前の実行結果として $?(ドル・クエスチョン)という特殊な変数に自動で格納されます。
| 終了ステータスの値 | 意味 | if文での扱い |
|---|---|---|
0 | 正常終了(成功) | then 以降が実行される(真) |
0 以外 (1〜255) | 異常終了(失敗・エラーなど) | 実行されない、または else に進む(偽) |
💡 実務的な実例:コマンドを直接 if に放り込む
if はコマンドの成否を見ているため、[ ] を使わなくても、普通のコマンドを直接 if の後ろに書くことができます。実務で非常によく使う書き方です。
# 例: ファイルの中に "error" という文字があるか判定する
# grepコマンドは一致する文字が見つかると「成功(0)」を返す性質があります
if grep -q "error" /var/log/app.log; then
echo "警告: ログにエラーが検出されました!"
fiこのように、grep の結果をわざわざ変数に代入して [ ] で判定しなくても、直接 if grep と書くことでシンプルかつ高速に動作させることができます。
4. elif・else による複数分岐と case文
条件を複数に分けたい場合は elif や else を組み合わせます。
num=10
if [ "$num" -gt 20 ]; then
echo "20より大きいです"
elif [ "$num" -gt 5 ]; then
echo "5より大きく20以下です"
else
echo "5以下です"
fi💡 条件が多い場合は「case文」という選択肢も
もし「変数の値が A の時、B の時、C の時……」のように、1つの対象に対して大量の文字列分岐を行う場合、if や elif を重ねるとコードが非常に読みづらくなります。
そのような場合は、パターンマッチに特化した case 文を使うのがスマートです。詳細な使い方は次回の記事でじっくり解説しますが、以下のようにスッキリ記述できます。
# case文のイメージ(詳細は次回!)
case "$action" in
"start") echo "起動します" ;;
"stop") echo "停止します" ;;
*) echo "無効な操作です" ;;
esac5. if文でよくやる「現場の落とし穴」
① $?(終了ステータス)は「一瞬」で上書きされる
直前のコマンドの結果を表す $? ですが、何かコマンドを1つ実行するたびに中身が常に最新の結果で上書きされます。以下はよくある失敗例です。
# 判定したいコマンドを実行
./my_script.sh
# ここで余計なコマンド(echoなど)を挟むと...
echo "処理が終了しました"
# この $? は my_script.sh の結果ではなく、直前の「echo」の結果(常に0)になってしまう!
if [ $? -ne 0 ]; then
echo "エラーが発生しました"
fi終了ステータスを使って条件判定を行いたい場合は、コマンド実行の直後に if 文で判定するか、一時的に別の変数に退避(例: status=$?)させるのが鉄則です。
② 0が正常、0以外が異常
プログラミング言語の真偽値は「0はFalse」「1以上はTrue」とするのが一般的です。シェルスクリプトのif 文では「0が正常終了(true)」「0以外がエラー(false)」で判定されます。ミスを防ぐためにもしっかりと頭に入れておきましょう。
6. まとめ
シェルスクリプトの if は、単なる条件比較ではなく、OS上で動くコマンドの成否を判定するものです。
コマンドの「終了ステータス(成功は0、失敗はそれ以外)」を正しく意識できるようになれば、実務でトラブルを起こさないスクリプトが書けるようになります。ぜひ覚えておきましょう!

コメント