導入
シェルの if は、他の言語を知っている人ほど戸惑います。if の後ろに書くのは「条件式」ではなく コマンド だからです。この前提さえ分かれば、あとは形を覚えるだけです。
説明
シェルの if は「コマンドを実行して、終了ステータスが 0(成功)なら then 側を実行する」という仕組みです。
#!/bin/bash
if [ -f logs/app.log ]; then
echo "ログファイルがあります"
else
echo "ログファイルがありません"
fi
書き方の型はこうです。
if 条件; then
成り立つときの処理
else
成り立たないときの処理
fi
覚えるべき決まりごとは3つ。
fiで閉じる(ifの逆さま。endifではありません)thenの前には;を置く(改行でもよい)[と]の前後にはスペースが必要([は記号ではなくコマンドの名前だから)
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.log を logs/nothing.log に書き換えて実行し、else 側に落ちることを確認してください。条件を変えると通る道が変わる——この往復が、条件分岐を理解する一番の近道です。
演習
data.csv が存在するかを if で調べて、あれば CSVがあります と表示してください。
ヒント1を見る
ファイルの存在チェックは [ -f ファイル名 ] です。[ の後ろと ] の前にスペースを忘れずに。
ヒント2を見る
if [ -f data.csv ]; then … echo "CSVがあります" … fi