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

test

testコマンドは、[]コマンドという別の形を持つコマンドです。
条件分岐として使用することができるため、シェルスクリプトを作成するときなどでとても便利なコマンドです。
使用用途は幅広く、ぜひ覚えておきたいLinuxコマンドです。

testコマンドとは

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

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

コマンド例1

コマンド例2

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

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

testコマンドの利用例

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

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

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

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

次に、ファイルタイプのチェックに関していくつかのコマンド例を示します。

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

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

コマンド例

ls -lの確認

実行結果

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

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

コマンド例

ls -lの確認

実行結果

ファイルディスクリプタの存在を判定
(-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 文字列が等しくないならばture

次に、文字列のチェックに関していくつかのコマンド例を示します。

同じ文字列の判定

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

コマンド例

実行結果

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

実行結果

違う文字列の判定

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

コマンド例

実行結果

数値のチェック

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

数値のチェックまとめ表

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

次に、数値のチェックに関していくつかのコマンド例を示します。

数値が等しいかを判定

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

コマンド例

実行結果

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

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

コマンド例

実行結果

ファイル特性のチェック

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

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

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

次に、ファイル特性のチェックに関していくつかのコマンド例を示します。

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

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

コマンド例

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

実行結果

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

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

コマンド例

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

実行結果

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

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

コマンド例

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

実行結果

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

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

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

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

次に、パーミッションのチェックに関していくつかのコマンド例を示します。

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

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

コマンド例

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

実行結果

sticky bitの判定

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

コマンド例

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

権限の一番右に「t」という文字があり、これがsticky bitになります。

実行結果

sticky bitの付与はchmodコマンドで行います。
コマンド例

ANDとORとNOT

testコマンドは、ファイルの存在を確認し、そのファイルタイプによって判定を行うことができます。
ただし、testコマンドの表現よりシェルの論理表現(&&,||)のほうが好まれます。
このファイルタイプのチェックに使う表現をまとめておきます。

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

表現 解釈
! expr NOT expr
expr1 -a expr2 expr1 AND expr2
expr1 -o expr2 expr1 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でその変数が名前参照かどうかを判定することができます。

コマンド例

宣言の確認(declare -p a b : 引数は変数名a,b)

実行結果

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

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

参考

外部リンクGnu Coreutils

外部リンクGnu Coreutils日本語版

外部リンクGNU Bash manual