名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 注意事項
test ユーティリティは、condition が示す条件を評価し、その結果を終了ステータスで表します。評価結果が真のときは終了ステータスが 0 に、偽のときは 1 になります。
test ユーティリティの第 1 の形式は次のとおりです。
test [ condition ] |
角括弧は condition が省略可能なオペランドであり、必ずしもコマンド行で指定する必要がないことを示します。
test ユーティリティの第 2 の形式は次のとおりです。
[ [ condition ] ] |
最初の開く角括弧 ([) は必須のユーティリティ名です。内側の角括弧は condition がオプションであることを示しています。最後の閉じる角括弧 (])は必須のオペランドです。
2G バイト (231 バイト) 以上のファイルに対する test の動作については、largefile(5) のマニュアルページを参照してください。
test と [ ユーティリティは条件 condition を評価して、その値が真である場合は終了ステータスを 0 に設定し、そうでない場合はゼロ以外の値 (偽) に設定します。引数がない場合は、test と [ ユーティリティは終了ステータスをゼロ以外の値に設定します。アクセス権をテストするときは、プロセスの実効ユーザー ID が使用されます。
test と [ ユーティリティに指定する引数、つまり、オペレータ、フラグ、および (最後の行を示す) 括弧はすべて、区切り文字 (通常はスペース文字) で区切る必要があります。
-primary_operator primary_operand
3 つの要素を持つ、次のいずれかのプライマリのことを「2 項プライマリ」と呼びます。
primary_operand -primary_operator primary_operand primary_operand primary_operator primary_operand
ファイルオペランド (-h と -L プライマリを除く) がシンボリックリンクを示している場合、シンボリックリンクは展開され、test は展開後のファイルに実行されます。
自分のファイルをテストした場合でも (-r、-w、または -x のテスト)、テストしたファイルのアクセス権に所有者ビットが設定されていない場合は、ファイルのアクセス権に「グループ」ビットまたは「その他」のビットが設定されていても、ゼロ以外 (偽) の終了ステータスが返されます。
= と != プライマリは単項プライマリよりも優先されます。= と != プライマリは常に引数をとります。したがって、= と != は単項プライマリの引数として使用できません。
condition を記述するために以下の基本式が使用できます。
ファイル file が存在すれば真。(sh では使用不可)
ファイル file が存在し、ブロック型特殊ファイルであれば真。
ファイル file が存在し、文字型特殊ファイルであれば真。
ファイル file が存在し、ディレクトリであれば真。
ファイル file が存在すれば真。(sh では使用不可)
ファイル file が存在し、そのファイルが通常ファイルであれば真。あるいは、/usr/bin/sh ユーザーが自分の PATH 環境変数内で /usr/bin よりも前に /usr/ucb を指定しており、file が存在し、そのファイルがディレクトリでなければ、test は真を返します。csh の test と [ ビルトインは常に後者の動作を行います。
ファイル file が存在し、セットグループ ID フラグが設定されていれば真。
ファイル file が存在し、ファイルのグループがプロセスの実効グループ ID と一致していれば真。(sh では使用不可)
ファイル file が存在し、シンボリックリンクであれば真。
ファイル file が存在し、スティッキビットが設定されていれば真。
ファイル file が存在し、シンボリックリンクであれば真。
string の長さがゼロでなければ真。(sh では使用不可)
オプション option がついていれば真。(csh または sh では使用不可)
ファイル file が存在し、プロセスの実効ユーザー ID がそのファイルを所有していれば真。(sh では使用不可)
ファイル file が名前付きパイプ (FIFO) であれば真。
ファイル file が存在し、読み取り可能であれば真。
ファイル file が存在し、サイズがゼロより大きければ真。
ファイル file が存在し、そのファイルがソケットであれば真。(sh では使用不可)
ファイル記述子番号が file_descriptor であるファイルがオープンされていて、端末装置に対応していれば真。file_descriptor が指定されていない場合、デフォルト値として 1 が使用されます。
ファイル file が存在し、セットユーザー ID フラグが設定されていれば真。
ファイル file が存在し、書き込み可能であれば真。真であっても、書き込みフラグが設定されていることを表すだけです。ファイルシステムが読み取り専用であれば、この条件が真であっても file は書き込み不可能です。
ファイル file が存在し、実行可能であれば真。真であっても、実行フラグが設定されていることを表すだけです。file がディレクトリの場合には、真は file が検索可能なことを表します。
文字列 string の長さがゼロであれば真。
ファイル file1 が存在し、file2 よりも新しい場合は真。(sh では使用不可)
ファイル file1 が存在し、file2 よりも古い場合は真。(sh では使用不可)
ファイル file1 と file2 が存在し、同じファイルを参照している場合は真。(sh では使用不可)
文字列 string が NULL の文字列でなければ真。
文字列 string1 と string2 が等しければ真。
文字列 string1 と string2 が等しくなければ真。
整数 n1 と n2 が代数的に等しければ真。
整数 n1 が代数的に整数 n2 より大きければ真。
整数 n1 が代数的に整数 n2 より大きければ真。
整数 n1 が代数的に整数 n2 より大きいか等しければ真。
整数 n1 が代数的に整数 n2 より小さければ真。
整数 n1 が代数的に整数 n2 より小さいか等しければ真。
condition1 および condition2 の両方が真であれば真。-a 2 項プライマリは左結合であり、-o 2 項プライマリよりも優先される。
condition1 または condition2 のどちらかが真であれば真。-o バイナリプライマリは左結合である。
これらの基本式は、以下の演算子と組み合わせて指定できます。
条件 condition が偽であれば真。
condition が真であれば真。丸括弧 ( ) を使用すると、通常の優先順位や結合規則を変更できる。なお、丸括弧はシェルにとっても意味を持つので、引用する必要がある。
演算子の優先順位を決めるアルゴリズム、および生成される戻り値は、 testに渡す引数の数により異なります。ただし [. . .] 形式を使う場合、最終引数の右角括弧は、このアルゴリズムでは引数には含まれません。
以下のリストにおいて、$1、$2、$3、$4 は、condition、condition1、または condition2 として test に渡す引数を表します。
偽 (1) で終了。
$1 が空でなければ真 (0) で終了。NULL なら偽。
$1 が ! のとき、 $2 が空なら真、$2 が空でなければ偽。
$1 が単項基本式のとき、単項テストの結果が真なら真、偽なら偽。
その他の場合、結果は不定。
$2 が 2 項基本式のとき、$1 と $3 を対象に 2 項テストを実行。
$1 が ! のとき、$2 と $3 の 2 つの引数に対するテストを否定形に。
その他の場合、結果は不定。
$1が ! のとき、$2、$3、$4 の 3 つの引数に対するテストを否定形に。
その他の場合、結果は不定。
基本式と演算子が混在しているような、ユーザーが用意した入力データを処理する際、スクリプト側では十分な注意が必要です。スクリプトに対して入力データが生成されるケースをアプリケーション作成者がすべて理解していない限り、test "$1" -a "$2" というような記述は、test "$1" && test "$2" と変えた方がいいでしょう。ユーザーが $1 を ! に設定し、$2 を空の文字列に設定したような場合の問題を防ぐためです。つまり移植性の高さが問題の場合には、test expr1 -a expr2 というような記述は以下の記述に変更し、test expr1 && test expr2 また、test expr1 -o expr2 の記述は以下のように変更してください。test expr1 || test expr2 ただし、シェルでは && と | | が同等の優先順位を持つのに対し、test では -a の方が -o よりも優先順位が高いことに注意してください。
シェルコマンド言語では、グループ分け用に小括弧と中括弧が使用できます。
sh を使うときは、小括弧はエスケープ付きで記述しなければなりません。次の例を見てください。
test \( expr1 -a expr2 \) -o expr3
このコマンドは、 XSI 準拠のシステム以外では、必ずしも移植可能ではありません。 この形式の代わりに、以下のように記述できます。
( test expr1 && test expr2 ) || test expr3
次に、以下の 2 つのコマンドを見てください。
test "$1" test ! "$1"
古いシステムの一部では、このコマンドの動作は信頼性を欠くことがあります。つまりこのような string 条件を使い $1 を !、(、または単項基本式に展開すると、その結果は保証できません。したがって、それぞれ以下のように記述する方がいいでしょう。
test -n "$1" test -z "$1"
同様に、古いシステムでは以下のようなコマンドの信頼性は保証できません。
test "$response" = "expected string"
これは、次のどちらかの形式に変えるようにしてください。
test "X$response" = "Xexpected string" test "expected string" = "$response"
なお 2 番目の形式は、expected string が単項基本式とまぎらわしくなることはない、というのが前提です。つまり expected string の先頭文字が -、(、!、= のいずれかのときは、1 番目の形式を使用してください。注記した事項を除き、前述の規則を使用すれば、上記 3 つの比較形式はどのような入力データに対しても信頼性の高いものです。なお、どの形式でも文字列は引用符で囲んで記述する点に注意してください。
引数の数が 4 個を超えている場合、文字列比較の 2 項基本式 = と != はどの単項基本式よりも優先順位が高いので、引数が正しく指定されていないと処理結果は保証できません。たとえば次の例を見てください。
test -d $1 -o -d $2
ここで $1 の評価結果がディレクトリ名 = となった場合、先頭の 3 つの引数は文字列比較を表すものと見なされます。したがって 2 つ目の -d を検出したときに構文エラーとなります。これを避けるには、次に示すどちらかの形式、できれば 2 番目の方を使用してください。
test \( -d "$1" \) -o \( -d "$2" \) test -d "$1" || test -d "$2"
また引数が 4 個を超えているときに次のように指定したとします。
test "$1" = "bat" -a "$2" = "ball"
このとき $1 の評価結果が ( または ! だと構文エラーとなります。これを避けるには、次に示すいずれかの形式、できれば 3 番目を使用してください。
test "X$1" = "Xbat" -a "X$2" = "Xball" test "$1" = "bat" && test "$2" = "ball" test "X$1" = "Xbat" && test "X$2" = "Xball"
if の例では次の 3 つの状態が調べられ、3 つのすべてが真、または正常終了とみなされた場合、その結果が画面に出力されます。
1 に設定されている変数の値が 0 より大きいか
2 に設定されている変数の値が 2 に等しいか
"root" という語がテキストファイル /etc/passwd に含まれているか
test ! -d tempdir && mkdir tempdir
読み取り不可になるまで少し待つ。
while test -r thefile do sleep 30 done echo'"thefile" is no longer readable'
引数が 3 つの文字列 (2 つは変形) のうちの 1 つであり、test コマンドの開く角括弧バージョン ([) を使用していればコマンドを実行する。
if [ "$1" = "pear" ] || [ "$1" = "grape" ] || [ "$1" = "apple" ] then command fi case "$1" in pear|grape|apple) command;; esac
ZERO=0 ONE=1 TWO=2 ROOT=root if [ $ONE -gt $ZERO ] [ $TWO -eq 2 ] grep $ROOT /etc/passwd >&1 > /dev/null # 出力を破棄する then echo "$ONE is greater than 0, $TWO equals 2, and $ROOT is" \ "a user-name in the password file" else echo "At least one of the three test conditions is false" fi
test `grep $ROOT /etc/passwd >&1 /dev/null` # 出力を破棄する echo $? # 成功テスト [ `grep nosuchname /etc/passwd >&1 /dev/null` ] echo $? # 失敗テスト
@ ZERO = 0; @ ONE = 1; @ TWO = 2; set ROOT = root grep $ROOT /etc/passwd >&1 /dev/null # 出力を破棄する # grep 実行直後に$ status をテストする if ( "$status" == "0" && $ONE > $ZERO && $TWO == 2 ) then echo "$ONE is greater than 0, $TWO equals 2, and $ROOT is" \ "a user-name in the password file" endif
ZERO=0 ONE=1 TWO=$((ONE+ONE)) ROOT=root if ((ONE > ZERO)) # 数式比較 [[ $TWO = 2 ]] # 文字列比較 [ `grep $ROOT /etc/passwd >&1 /dev/null` ] # 出力を破棄する then echo "$ONE is greater than 0, $TWO equals 2, and $ROOT is" \ "a user-name in the password file" else echo "At least one of the three test conditions is false" fi
test の実行に影響を与える環境変数 LC_CTYPE、LC_MESSAGES、NLSPATH についての詳細は、environ(5) を参照してください。
以下の終了ステータスが返されます。
condition の評価結果は真だった。
condition の評価結果は偽だった、または condition が指定されていなかった。
エラーが発生した。
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWcsu |
インタフェースの安定性 | 標準 |
-f オプションの代替である not-a-directory は BSD アプリケーションの移行を補助するものであり、将来のリリースではサポートされなくなる可能性があります。
名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 注意事項