# Test 組込みコマンド

Test 組込みコマンドは引数で指定した内容の判定を行います。

## 構文

- `test 判定式`

- `[ 判定式 ]`

Test コマンドはオプションとオペランドとを区別しません。コマンドライン引数は全て判定式として解釈します。コマンドが `[` の名前で実行された時は、判定式の後に `]` が必要です。

## 説明

Test コマンドは引数で与えられた判定式を評価し、結果が真ならば 0 の終了ステータスを、偽ならば 1 の終了ステータスで終了します。判定式は何種類かの演算子とそれに対する被演算子とからなります。

ファイルに関する判定を行う単項演算子は以下の通りです。指定したファイルがシンボリックリンクの場合、そのシンボリックリンクが指している先のファイルについて判定を行います (`-h`, `-L` 演算子を除く)。

`-b ファイル`

  ファイルがブロックスペシャルファイルかどうか

`-c ファイル`

  ファイルがキャラクタスペシャルファイルかどうか

`-d ファイル`

  ファイルがディレクトリかどうか

`-e ファイル`

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

`-f ファイル`

  ファイルが通常のファイルかどうか

`-G ファイル`

  ファイルのグループ ID がシェルの実効グループ ID に等しいかどうか

`-g ファイル`

  ファイルの set-group-ID ビットが設定されているかどうか

`-h ファイル`

  `-L ファイル` に同じ

`-k ファイル`

  ファイルの sticky ビットが設定されているかどうか

`-L ファイル`

  ファイルがシンボリックリンクかどうか

`-N ファイル`

  ファイルの最終変更日時が最終アクセス日時より後かどうか

`-O ファイル`

  ファイルのユーザ ID がシェルの実効ユーザ ID に等しいかどうか

`-p ファイル`

  ファイルが FIFO (名前付きパイプ) かどうか

`-r ファイル`

  ファイルが読み込み可能かどうか

`-S ファイル`

  ファイルがソケットかどうか

`-s ファイル`

  ファイルサイズが空でないかどうか

`-u ファイル`

  ファイルの set-user-ID ビットが設定されているかどうか

`-w ファイル`

  ファイルが書き込み可能かどうか

`-x ファイル`

  ファイルが実行可能かどうか

ファイル記述子に関する判定を行う単項演算子は以下の通りです。

`-t ファイル記述子`

  ファイル記述子が端末かどうか (ファイル記述子は 0 以上の自然数で指定します)

文字列に関する判定を行う単項演算子は以下の通りです。

`-n 文字列`

  文字列が空文字列でないかどうか

`-z 文字列`

  文字列が空文字列かどうか

シェルのオプションに関する判定を行う単項演算子は以下の通りです。

`-o ?オプション`

  オプションが正しいオプション名であるかどうか

`-o オプション`

  オプションが正しいオプション名であり、かつオプションが有効に設定されているかどうか

ファイルに関する判定を行う二項演算子は以下の通りです (存在しないファイルは他のファイルより古いとみなします)。

`ファイル1 -nt ファイル2`

  ファイル1の更新時刻がファイル2より新しいかどうか

`ファイル1 -ot ファイル2`

  ファイル1の更新時刻がファイル2より古いかどうか

`ファイル1 -ef ファイル2`

  二つのファイルが互いのハードリンクであるかどうか

文字列に関する判定を行う二項演算子は以下の通りです。

`文字列1 = 文字列2`
`文字列1 == 文字列2`

  二つの文字列が同じかどうか

`文字列1 != 文字列2`

  二つの文字列が異なるかどうか

以下の二項演算子は現在のロケールの辞書式順序に従って文字列を比較します。

`文字列1 === 文字列2`

  二つの文字列が同じかどうか

`文字列1 !== 文字列2`

  二つの文字列が異なるかどうか

`文字列1 < 文字列2`

  文字列1 が 文字列2 よりも順序が手前かどうか

`文字列1 <= 文字列2`

  文字列1 が 文字列2 よりも順序が手前または同じかどうか

`文字列1 > 文字列2`

  文字列1 が 文字列2 よりも順序が後かどうか

`文字列1 >= 文字列2`

  文字列1 が 文字列2 よりも順序が後または同じかどうか

パターンマッチングを行う二項演算子は以下の通りです。

`文字列 =~ パターン`

  拡張正規表現パターンが文字列(の一部)にマッチするかどうか

整数に関する判定を行う二項演算子は以下の通りです。

`v1 -eq v2`

  v1 と v2 が等しいかどうか

`v1 -ne v2`

  v1 と v2 が異なるかどうか

`v1 -gt v2`

  v1 が v2 よりも大きいかどうか

`v1 -ge v2`

  v1 が v2 以上かどうか

`v1 -lt v2`

  v1 が v2 よりも小さいかどうか

`v1 -le v2`

  v1 が v2 以下かどうか

バージョン番号を表す文字列に関する判定を行う二項演算子は以下の通りです。文字列のバージョン番号としての比較のしかたは後述します。

`v1 -veq v2`

  v1 と v2 が等しいかどうか

`v1 -vne v2`

  v1 と v2 が異なるかどうか

`v1 -vgt v2`

  v1 が v2 よりも大きいかどうか

`v1 -vge v2`

  v1 が v2 以上かどうか

`v1 -vlt v2`

  v1 が v2 よりも小さいかどうか

`v1 -vle v2`

  v1 が v2 以下かどうか

他の判定式を組み合わせてより複雑な判定式を作る演算子は以下の通りです。

`! 判定式`

  判定式が偽かどうか (判定式の真偽を逆転します)

`( 判定式 )`

  判定式が真かどうか (判定式の構文上の優先順位を高くします)

`判定式1 -a 判定式2`

  二つの判定式が両方とも真かどうか

`判定式1 -o 判定式2`

  二つの判定式の少なくとも片方が真かどうか

判定式が空の場合、結果は偽とみなします。判定式が (演算子の付いていない) 文字列一つの場合、その文字列が空文字列でないかどうかを判定します。

### バージョン番号の比較

文字列のバージョン番号としての比較は、基本的には現在のロケール情報に従った辞書式順序で行います。ただし、連続する数字は一つの自然数として比較します。また数字とそれ以外の文字との比較では常に数字の方が大きいとみなします。

例えば、`0.1.2-3` と `00.001.02-3` は等しく、`0.2.1` と `0.10.0` とでは後者の方が大きいと判定されます。

## 終了ステータス

Test コマンドの終了ステータスは、判定式の評価結果が真ならば 0、偽ならば 1 です。判定式の構文に誤りがある場合その他のエラーが発生したときは、終了ステータスは 2 です。

## 補足

複雑な判定式は誤って解釈されることがあるので避けることをお勧めします。例えば `[ 1 -eq 1 -a -t = 1 -a ! foo ]` は `[ 1 -eq 1 ] && [ -t = 1 ] && ! [ foo ]` のようにコマンドを分けると式がより明確になります。

POSIX は、エラーが発生した場合の終了ステータスを 『2 以上』 と定めています。また POSIX には以下の演算子の規定はありません: `-G`, `-k`, `-N`, `-O`, `-nt`, `-ot`, `-ef`, `==`, `===`, `!==`, `<`, `<=`, `>`, `>=`, `=~`, `-veq`, `-vne`, `-vgt`, `-vge`, `-vlt`, `-vle`。 POSIX に `-o` の単項演算子としての規定はありません。