本文へスキップ
BecomeCoder

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

条件を組み合わせる ― かつ・または・そうでない

ブラウザで完結

導入

「ファイルがあって、かつ中身が空でないとき」のように、条件は複数重なります。シェルには組み合わせ方が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 "準備完了"

実際に動かしてみよう

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

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

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