導入
「ファイルがあって、かつ中身が空でないとき」のように、条件は複数重なります。シェルには組み合わせ方が2通りあり、書き方も読みやすさも違います。実務で見かける形を両方おさえましょう。
説明
いちばん読みやすいのは、if の外で &&(かつ)・||(または)を使う書き方です。
#!/bin/bash
TARGET=logs/app.log
# かつ: 両方成り立つとき
if [ -f "$TARGET" ] && [ -s "$TARGET" ]; then
echo "ファイルがあり、中身も入っています"
fi
# または: どちらかが成り立つとき
if [ "$1" = "start" ] || [ "$1" = "restart" ]; then
echo "起動処理を行います"
fi
# そうでない: 否定
if [ ! -f missing.txt ]; then
echo "missing.txt はありません"
fi
[ 条件A ] && [ 条件B ] は「A が成功したら B も実行する。両方成功したら全体が成功」という意味です。第3章で学んだ && がそのまま条件の組み立てに使えている、というだけのこと。新しい文法ではありません。
if を使わず1行で書くこともできます。短い後始末や通知に向いています。
[ -d backup ] || mkdir backup
これは「backup ディレクトリが無ければ作る」。実務でよく見る、非常に短い定型句です。
flowchart LR
A["[ -d backup ]"] --> B{"成功?"}
B -->|"はい(ある)"| C["何もしない"]
B -->|"いいえ(ない)"| D["mkdir backup"]
[ 条件A -a 条件B ](-a が「かつ」)という古い書き方もありますが、読みにくく落とし穴も多いので、[ A ] && [ B ]に統一するのがおすすめです。
やってみよう
スクリプトを実行して、3つの判定を確かめましょう。次に端末で sh script.sh start として、2つ目の if が通ることを確認してください。最後に [ -d backup ] || mkdir backup を書き足して実行し、ls でディレクトリができていることを見てみましょう。
演習
backup ディレクトリが無ければ作る、を1行で書いて実行し、ls で確認できる状態にしてください。そのあと echo "準備完了" を出してください。
ヒント1を見る
「失敗したら実行する」の || を使います。
ヒント2を見る
[ -d backup ] || mkdir backup の次の行に echo "準備完了"