本文へスキップ
BecomeCoder

シェルスクリプトコース · 第4章 条件分岐 · レッスン15

if ― 条件で処理を分ける

ブラウザで完結

導入

シェルの if は、他の言語を知っている人ほど戸惑います。if の後ろに書くのは「条件式」ではなく コマンド だからです。この前提さえ分かれば、あとは形を覚えるだけです。

説明

シェルの if は「コマンドを実行して、終了ステータスが 0(成功)なら then 側を実行する」という仕組みです。

#!/bin/bash

if [ -f logs/app.log ]; then
  echo "ログファイルがあります"
else
  echo "ログファイルがありません"
fi

書き方の型はこうです。

if 条件; then
  成り立つときの処理
else
  成り立たないときの処理
fi

覚えるべき決まりごとは3つ。

  1. fi で閉じる(if の逆さま。endif ではありません)
  2. then の前には ; を置く(改行でもよい)
  3. []前後にはスペースが必要[ は記号ではなくコマンドの名前だから)

3つ目が最頻出のつまずきポイントです。[-f file] と詰めて書くとエラーになります。[ はコマンド、-f はその引数——そう思えば、スペースが要る理由が腹落ちします。

flowchart TD
    A["if [ -f logs/app.log ]"] --> B["[ コマンドを実行"]
    B --> C{"終了ステータスは 0?"}
    C -->|"0(成功)"| D["then の処理"]
    C -->|"0以外(失敗)"| E["else の処理"]
    D --> F["fi(おわり)"]
    E --> F

条件が3つ以上に分かれるときは elif を挟みます。

if [ "$1" = "start" ]; then
  echo "起動します"
elif [ "$1" = "stop" ]; then
  echo "停止します"
else
  echo "start か stop を指定してください"
fi

やってみよう

スクリプトを実行して ログファイルがあります と出ることを確かめましょう。次に logs/app.loglogs/nothing.log に書き換えて実行し、else 側に落ちることを確認してください。条件を変えると通る道が変わる——この往復が、条件分岐を理解する一番の近道です。

演習

data.csv が存在するかを if で調べて、あれば CSVがあります と表示してください。

ヒント1を見る

ファイルの存在チェックは [ -f ファイル名 ] です。[ の後ろと ] の前にスペースを忘れずに。

ヒント2を見る

if [ -f data.csv ]; thenecho "CSVがあります"fi

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。