本文へスキップ
BecomeCoder

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

ファイル判定 ― あるか・ディレクトリか・書けるか

ブラウザで完結

導入

自動化スクリプトの事故は、たいてい「あると思ったファイルが無かった」「ディレクトリだと思ったらファイルだった」から始まります。処理の前に確かめる——これだけで事故の大半は防げます。

説明

ファイルまわりの判定は、test の中でも特によく使います。

演算子意味
-e存在する(exists。ファイルでもディレクトリでも)
-f存在して、普通のファイルである(file)
-d存在して、ディレクトリである(directory)
-s存在して、中身が空でない(size > 0)
-r -w -x読める/書ける/実行できる
#!/bin/bash

TARGET=logs/app.log

if [ ! -f "$TARGET" ]; then
  echo "エラー: $TARGET がありません"
  exit 1
fi

echo "$TARGET を処理します"

if [ -d logs ]; then
  echo "logs はディレクトリです"
fi

if [ -s "$TARGET" ]; then
  echo "中身が入っています"
fi

! は否定です。[ ! -f "$TARGET" ] は「普通のファイルでないなら」。この 「無かったら文句を言って止める」 という型は、実務のスクリプトの冒頭にほぼ必ず出てきます。

flowchart TD
    A["スクリプト開始"] --> B{"対象ファイルはある?"}
    B -->|"ない"| C["エラーを表示して exit 1"]
    B -->|"ある"| D["本体の処理へ"]

-f-e の使い分けも大事です。「ディレクトリでは困る」場面(cat したい、grep したい)では -f を使います。-e は「何かがある」だけで、ディレクトリでも真になります。

やってみよう

スクリプトを実行して、3つの判定が通ることを確かめましょう。次に TARGET=logs/nothing.log に書き換えて実行すると、冒頭のチェックに引っかかって exit 1 で止まり、あとの処理が一切走らないことが分かります。これが「守りの効いたスクリプト」です。

演習

files がディレクトリかどうかを判定して、ディレクトリなら files はディレクトリです と表示してください。

ヒント1を見る

ディレクトリの判定は [ -d 名前 ] です。

ヒント2を見る

if [ -d files ]; then echo "files はディレクトリです"; fi

実際に動かしてみよう

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

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

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