= Test 組込みコマンド
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - Test 組込みコマンド

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

[[syntax]]
== 構文

- +test {{判定式}}+
- +[ {{判定式}} ]+

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

[[description]]
== 説明

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 {{文字列}}+:: 文字列が空文字列かどうか

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

+-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}} &lt;= {{文字列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}}+:: 二つの判定式の少なくとも片方が真かどうか

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

[[version-compare]]
=== バージョン番号の比較

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

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

[[exitstatus]]
== 終了ステータス

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

[[notes]]
== 補足

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

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

// vim: set filetype=asciidoc expandtab:
