きまブログ

5/31 はてなダイアリーから移行しました。


【備忘録】bashの条件判定のtestオプション(ファイル判定で紛らわしかったもの)

※ 2015-06-27 sat 内容を修正・追加しました。

ちょっと,bashの条件判定testのオプションを勉強していて,ファイルの判定で紛らわしいものがあったので確認してみました。

testコマンドオプションの比較

  • ファイルの存在を判定する:-e
  • "通常"ファイルを判定する:-f
  • ファイルサイズ0を判定する:-s(サイズが0より大きければTRUE)
test -eオプション

-eオプションは,単純に,lsしたときに表示されれば"TRUE(0)"判定されるんだと思います。

※ testはTRUEなら0,FALSEなら1を返します。

test -fオプション

-fオプションは、通常ファイルの判定。
キーになるのは"通常"ファイルというもの。

通常じゃないファイルとは?
いわゆるスペシャルファイルというヤツです。
たとえば,/dev/sda1 のようなデバイスファイル。
(/dev/random のような疑似デバイスも含む)

そのため,/dev/sda1は,-eではTRUE, -fではFALSE, -sではFALSEとなります。
(つまり,デバイスファイルはサイズ0判定。。)

test -sオプション

-sオプションは,ファイルサイズが0より大きければ。。
つまり,touchされただけのファイルでは"FALSE(1)",
"通常の"ファイルやシンボリックリンクは"TRUE(0)"です。

上記の事をまとめた表

ファイルの種類 test -e test -f test -s
普通のテキストファイ TRUE TRUE TRUE
サイズ0のファイル TRUE TRUE FALSE
シンボリックリンク TRUE TRUE TRUE
デバイスファイル TRUE FALSE FALSE
実際のコマンド結果
  • 普通のテキストファイルで確認 (0がTrue, 1がFalseです。)
$ echo hoge > textfile.txt
$ test -e ./textfile.txt ; echo $?
0
$ test -f ./textfile.txt ; echo $?
0
$ test -s ./textfile.txt ; echo $?
0
  • touch しただけのサイズ0のファイルで確認 (0がTrue, 1がFalseです。)
$ touch size_zero_file
$ test -e ./size_zero_file ; echo $?
0
$ test -f ./size_zero_file ; echo $?
0
$ test -s ./size_zero_file ; echo $?
1
$ ln -s ./textfile.txt symboliclink
$ test -e ./symboliclink ; echo $?
0
$ test -f ./symboliclink ; echo $?
0
$ test -s ./symboliclink ; echo $?
0
  • デバイスファイル /dev/null で確認 (0がTrue, 1がFalse です。)
$ test -e /dev/null ; echo $?
0
$ test -f /dev/null ; echo $?
1
$ test -s /dev/null ; echo $?
1