test - ファイルチェック・値の比較をする

スポンサーリンク

testコマンドは、[]コマンドという別の形を持つコマンドです。

条件分岐として使用することができるため、シェルスクリプトを作成するときなどでとても便利なコマンドです。

使用用途は幅広く、ぜひ覚えておきたいLinuxコマンドです。

testコマンドとは

testコマンドは、引数の条件式を評価し、0(真)か1(偽)を結果として返します。
testコマンドは、ファイルのチェック、文字列の比較、数値の比較等を行うことができます。

testコマンドは、別の形式を扱うことができます。以下の表現は同じ意味になります。

[]コマンドを用いるときは、[の後にスペースを空け、]の前にもスペースを空けることに注意が必要になります。

また、testコマンドの<expression>が省略された場合は1(偽)になります。
<expression>が単一の引数の場合はnullならば1(偽)に、それ以外なら0(真)になります。
また、変数を用いる場合は、クオートで囲むほうがいいでしょう(例:"$var")。

ファイルタイプのチェック

testコマンドは、ファイルの存在を確認し、そのファイルタイプによって判定を行うことができます。
ファイルタイプのチェックに使う表現をまとめておきます。

ファイルタイプのチェックまとめ表

表現意味
-b fileblock special deviceならばtrue
-c filecharacter special deviceならばtrue
-d filedirectoryならばtrue
-f fileregular file(通常ファイル)ならばtrue
-h file
または
-L file
symbolic linkならばtrue
-p filenamed pipe(名前付きパイプ)ならばtrue
-S filesocketならばtrue
-t fdfile descriptor(ファイルディスクリプタ)として
端末に関連付けされているならばtrue

通常ファイルの存在を判定
(-f file)

-fオプションは通常ファイルが存在するかどうかの判定を行う事ができます。
ここでは、[]コマンドを用いて、if文を作成しています。
[]コマンドの処理は、file1という通常ファイルが存在するならば0(真)、それ以外なら1(偽)になります。
このコマンドの処理は、[]コマンドが真ならば「true」という文字を表示し、偽ならば何も表示しません。

コマンド例

ls -lの確認

実行結果

ディレクトリの存在を判定
(-d file)

-dオプションはディレクトリが存在するかどうかの判定を行う事ができます。
ここでも、[]コマンドを用いて、if文を作成しています。
[]コマンドの処理は、dir1というディレクトリが存在するならば0(真)、それ以外なら1(偽)になります。
このコマンドの処理は、[]コマンドが真ならば「true」という文字を表示し、偽ならば何も表示しません。

コマンド例

実行結果

ファイルディスクリプタの存在を判定
(-t fd)

ファイルディスクリプタ(ファイル記述子)とは、OSが、プログラムが参照するファイルを識別するために用いるもので、0から始まる非負整数になります。
また、0は標準入力、1は標準出力、2は標準エラー出力にOSで自動的に割り当てられています。
-tオプションは、ファイルディスクリプタが存在を判定することができます。

コマンド例

実行結果

文字列のチェック

testコマンドは、文字列同士の比較を行うことができます。
文字列のチェックに使う表現をまとめておきます。

文字列のチェックまとめ表

表現意味
-z string文字列の長さが0ならばtrue
-n string
string
文字列の長さが0ではないならばtrue
string1 = string2
string1 == string2
文字列が等しいならばtrue
string1 != string2文字列が等しくないならばtrue

同じ文字列の判定

同じ文字列かどうかを判定する場合は、=または==を用います。
=または==の両端にスペースを入れる必要であるということに注意が必要です。

コマンド例

実行結果

両端にスペースがない場合は、testコマンドが単一の引数とみなして、常にtrueになります。例えば、以下のようなものは常にtrueになります。

違う文字列の判定

違う文字列かどうかを判定する場合は、!=を用います。
!=の両端にスペースが必要なことに注意が必要です。

コマンド例

実行結果

数値のチェック

testコマンドは、数値の比較を行うことができます。
数値のチェックに使う表現をまとめておきます。

数値のチェックまとめ表

表現解釈意味
num1 -eq num2num1 = num2等しいならばtrue
num1 -ne num2num1 != num2等しくないならばtrue
num1 -lt num2num1 < num2num1がnum2より小さいならばtrue
num1 -le num2num1 <= num2num1がnum2以下ならばtrue
num1 -gt num2num1 > num2num1がnum2より大きいならばtrue
num1 -ge num2num1 >= num2num1がnum2以上ならばtrue

数値が等しいかを判定

数値が等しいかどうかを判定する場合は-eqを用います。

コマンド例

実行結果

数値が等しくないかを判定

数値が等しくないかどうかを判定する場合は-neを用います。

コマンド例

実行結果

ファイル特性のチェック

testコマンドは、ファイル特性をチェックし判定を行うことができます。
ファイルが存在しない場合は常に1(偽)になります。
このファイル特性のチェックに使う表現をまとめておきます。

ファイル特性のチェックまとめ表

表現意味
-e filefileが存在するならばtrue
-s filefileのサイズが0より大きいならばtrue
file1 -nt file2file1がfile2よりmtimeが新しいならばtrue
file1 -ot file2file1がfile2よりmtimeが古いならばtrue
file1 -ef file2file1とfile2が同じデバイスで同じinode番号ならばtrue

ファイルが存在するかどうかを判定

ファイルが存在するかは-eを用います。ファイルが存在する場合は0(真)になります。

コマンド例

カレントディレクトリでのファイルの存在を確認(lsコマンド)

実行結果

ファイルの修正時間(mtime)が新しいかどうか判定

ファイルを比較する場合、mtimeが新しいかどうかを判定する場合は-ntを用います。

コマンド例

mtimeの確認(ls --full-time)

実行結果

ハードリンクかどうかを判定

file1とfile2が同じデバイスで同じinode番号というのは、file1とfile2がハードリンクかどうかを判定するという意味になります。
ハードリンクかどうかを判定する場合は、-efを用います。

コマンド例

inode番号の確認(ls -1 --inode)

実行結果

-efでシンボリックファイルを指定した場合は、シンボリックファイルの参照先のファイルと比較します。そのため、比較するファイルが参照先と同じファイルを指していた場合はtrueになります。

パーミッションのチェック

testコマンドは、パーミッションのチェックを行うことができます。
パーミッションのチェックに使う表現をまとめておきます。

パーミッションのチェックまとめ表

表現意味
-g fileset-group-ID bitがあるならばtrue
-k filesticky bitがあるならばtrue
-r filer bitがあるならばtrue
-u fileset-user-ID bitがあるならばtrue
-w filew bitがあるならばtrue
-x filex bitがあるならばtrue
-O file所有者が現在有効なユーザIDならばtrue
-G file所有者が現在有効なグループIDならばtrue

書き込み可能かどうかの判定

-wはユーザが書き込み可能かどうかの判定を行います。

コマンド例

パーミッションの確認(ls -l)

実行結果

sticky bitの判定

sticky bitとは制限付き削除フラグのことで、このパーミッション付与されたファイルまたはディレクトリは、所有者(rootを除く)しか削除できません。sticky bitはパーミッションを確認するときの権限の一番右にある「t」という文字で表されます。
-kはファイルでの権限にsticky bitがあるかどうか判定を行います。

コマンド例

パーミッションの確認(ls -l)

実行結果

sticky bitはchmodコマンドで付与できます。

ANDとORとNOT

testコマンドは、論理演算の機能もあります。
ただし、testコマンドの表現よりシェルの論理表現(&&,||)のほうが好まれます。
この論理演算に使う表現をまとめておきます。

論理演算のまとめ表

表現解釈
! exprNOT expr
expr1 -a expr2expr1 AND expr2
expr1 -o expr2expr1 OR expr2

ただし、-aは-oより優先順位が高い

AND

-aでANDの論理表現ができますが変数によっては意図した動作にならない場合があるため、シェルの組み込みコマンド「&&」を用いるほうが好まれます。

コマンド例

または

実行結果

NOT

「!」の前後にスペースが必要なことに注意が必要です。また、シェルの組み込みコマンドにも同じ「!」のコマンドがあります。意味はtrueとfalseの反転で同じです。

コマンド例

または

実行結果

複雑な論理表現

シェルの括弧(「(」と「)」)を用いれば、優先順位を変更することができます。

コマンド例

実行結果

その他の表現

testコマンドは、シェルの機能に関わるような判定を行うことができます。この機能に使うオプションをまとめておきます。

その他の表現のまとめ表

表現意味
-o optname組み込みコマンドのsetでoptnameがONならばtrue
-v varnameシェルの変数varnameに値が割り当てられているならばtrue
-R varnameシェルの変数varnameが名前参照ならばtrue

setコマンドのオプション判定

-oでsetコマンドのオプションがONになっているかどうかを判定することができます。

コマンド例はあらかじめにset -xを入れています。

コマンド例

実行結果

シェル変数の値割り当ての判定

-vでシェルの変数に値が割り当てられているかを確認することができます。

ここでは、aという変数にあらかじめ値を割り当てています。

コマンド例

実行結果

変数が名前参照かを判定

名前参照は、ある変数に別の変数名を入れ、そのある変数を呼び出すことで別の変数名の値を呼び出すことができます。
-Rでその変数が名前参照かどうかを判定することができます。

コマンド例

変数の確認

実行結果

名前参照の宣言は以下のコマンドになります。

名前参照の宣言を解除するには以下のコマンドになります。

参考

Gnu Coreutils

Gnu Coreutils日本語版

GNU Bash manual