導入
自動化スクリプトの事故は、たいてい「あると思ったファイルが無かった」「ディレクトリだと思ったらファイルだった」から始まります。処理の前に確かめる——これだけで事故の大半は防げます。
説明
ファイルまわりの判定は、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