名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 注意事項
test ユーティリティは、condition が示す条件を評価し、その結果を終了ステータスで表します。評価結果が真のときは終了ステータスが 0 に、偽のときは 1 になります。
第 2 の形式、つまり test の代わりに [ ] を記述する場合、一対の角括弧は別々の引数となるように離れている必要があります。condition 引数は省略可能です。
ファイルが 2G バイト (231 バイト) 以上ある場合の test の動作については、largefile(5) を参照してください。
if の直後の condition を実行し、終了ステータスが 0 であれば最初の then の直後の action を実行します。0 でなければ、elif の直後の condition2 を実行し、さらにその終了ステータスが 0 であれば次の then の後の action2 を実行します。if と elif conditions が失敗した場合は else action3 を実行します。else action も then action も実行されなかった場合には、if コマンドは終了ステータス 0 を返します。elif . . . then . . . 分岐ペアの指定はいくつでもできますが、else の指定は一つだけです。
test は、条件 condition を評価し、その値が真の場合は終了ステータスに 0 を設定し、偽の場合は終了ステータスにゼロ以外 (偽) を設定します。引数がない場合も、test はゼロ以外の終了ステータスを設定します。アクセス権をテストする場合は、プロセスの実効ユーザー ID が使用されます。
すべての演算子、フラグ、および角括弧 (2 番目の形式で使用されている括弧) は、test コマンドへの別々の引数でなければなりません。通常、これらの引数は、空白で区切られます。
condition は、次に示す基本式を使用して構成します。
ファイル filename が存在し、読み取り可能であれば真。
ファイル filename が存在し、書き込み可能であれば真。
ファイル filename が存在し、実行可能であれば真。
ファイル filename が存在し、通常ファイルであれば真。または、/usr/bin/sh を使用しているユーザーが環境変数 PATH の中で /usr/bin の前に /usr/ucb を使用している場合には、test コマンドは、ファイル filename が存在し、ディレクトリでなければ、真を返します。これは、/usr/bin/csh を使用しているユーザーのデフォルトの設定でもあります。
ファイル filename が存在し、ディレクトリであれば真。
ファイル filename が存在し、シンボリックリンクであれば真。デフォルトでは、他のすべての基本式 (-L filename を除く) では、シンボリックリンクも含まれます。
ファイル filename が存在し、文字型特殊ファイルであれば真。
ファイル filename が存在し、ブロック型特殊ファイルであれば真。
ファイル filename が存在し、名前付きパイプ (FIFO) であれば真。
ファイル filename が存在し、そのセットユーザー ID (実行時ユーザー ID 設定) ビットが設定されていれば真。
ファイル filename が存在し、そのセットグループ ID (実行時グループ ID 設定) ビットが設定されていれば真。
ファイル filename が存在し、そのスティッキビットが設定されていれば真。
ファイル filename が存在し、サイズがゼロより大きければ真。
ファイル記述子番号が fildes (デフォルトは 1) であるファイルがオープンされていて、端末装置と対応していれば真。
文字列 s1 の長さがゼロであれば真。
文字列 s1 の長さがゼロ以外であれば真。
文字列 s1 と s2 が等しければ真。
文字列 s1 と s2 が等しくなければ真。
s1 が NULL の文字列でなければ真。
整数 n1 と n2 が代数的に等しければ真。
整数 n1 と n2 が代数的に等しくなければ真。
整数 n1 が整数 n2 よりも代数的に大きければ真。
整数 n1 が整数 n2 よりも代数的に大きいか等しければ真。
整数 n1 が整数 n2 よりも代数的に小さければ真。
整数 n1 が整数 n2 よりも代数的に小さいか等しければ真。
ファイル filename が存在し、シンボリックリンクであれば真。デフォルトでは、他のすべての基本式 (-h filename を除く) シンボリックリンクは真として扱われます。
上記の基本式は、次の演算子と組み合わせて使用することもできます。
単項否定演算子
2 項論理積演算子
2 項論理和演算子 (-a の優先順位は -o より上)
グループ化を表す括弧。括弧は、シェルに対して特別な意味を持っているので、引用符で囲む必要があります。
-f オプションの、ディレクトリではないという条件は、BSD アプリケーション用の移行のための対処であり、将来のリリースではサポートされない可能性があります。
-L オプションは、同様のオプションを使用する他のシェルのユーザー用の移行処置であり、将来のリリースではサポートされない可能性があります。
自分のファイルをテストした場合でも (-r、-w、または -x のテスト)、テストしたファイルのアクセス権に所有者ビットが設定されていない場合は、ファイルのアクセス権に「グループ」ビットまたは「その他」のビットが設定されていても、ゼロ以外 (偽) の終了ステータスが返されます。正しい終了ステータスが設定されるのは、ユーザーがスーパーユーザーの場合です。
= および != 演算子の優先順位は、-r から -n までの演算子より高く、= および != は、常に引数が必要です。したがって、= および != を、-r から -n までの演算子と一緒に使用することはできません。
-r から -n までの演算子の後に複数の引数を付けると、第 2 引数が -a または -o でないかぎり、最初の引数だけがテストの対象となり、他の引数は無視されます。
condition が真ならば、最初の else または then までの action を実行します。else if condition2 が真ならば、else if と次の else または then の間の action2 が実行されます。そうでなければ else と endifの間の action3 が実行されます。
if はその入力行に単独で指定するか、または else の後に指定しなければなりません。endif は 1 つだけ必要です。else と endif の前は、空白文字以外であってはいけません。else if . . . then . . . はいくつもの指定ができますが、else は 1 つだけの指定になります。
指定された式 condition が真ならば、action が示す単一のコマンドを引数を付けて実行します。action 上での変数置換を最初に実行し、同時に if コマンドの残りの部分を実行します。action は単純コマンドでなければならず、パイプライン、コマンドリスト、括弧付きコマンドリストは指定できません。なお condition が偽で action が実行されなくても、入出力先のリダイレクトが実行されてしまうので注意してください (これはバグ)。
if の直後の condition を実行し、終了ステータスが 0 であれば最初の then の直後の action を実行します。0 でなければ、elif の直後の condition2 を実行し、さらにその終了ステータスが 0 であれば次の then の後の action2 を、0 でなければ else action3 を実行します。else action も then action も実行されなかった場合には、if コマンドは終了ステータス 0 を返します。elif . . . then . . . はいくつもの指定ができますが、else は 1 つだけの指定になります。
test 組み込みコマンドについては、上記の Bourne シェルの test 組み込みコマンドと同様、ksh(1) の項の「条件式」と「算術評価」を参照してください。
condition はファイル属性、文字列条件、および複合の論理積 condition または論理和 condition を評価します。
基本式の要素と演算子はすべて、個別の引数として test に示さなければなりません。
condition を記述するために以下の基本式が使用できます。
ファイル file が存在すれば真。
ファイル file が存在し、ブロック型特殊ファイルであれば真。
ファイル file が存在し、文字型特殊ファイルであれば真。
ファイル file が存在し、ディレクトリであれば真。
ファイル file が存在すれば真。
ファイル file が存在し、通常ファイルであれば真。
ファイル file が存在し、セットグループ ID フラグが設定されていれば真。
ファイル file が存在し、スティッキビットが設定されていれば真。
string の長さがゼロでなければ真。
オプション option がついていれば真。
ファイル file が名前付きパイプ (FIFO) であれば真。
ファイル file が存在し、読み取り可能であれば真。
ファイル file が存在し、サイズがゼロより大きければ真。
ファイル記述子番号が file_descriptor であるファイルがオープンされていて、端末装置に対応していれば真。
ファイル file が存在し、セットユーザー ID フラグが設定されていれば真。
ファイル file が存在し、書き込み可能であれば真。真であっても、書き込みフラグが設定されていることを表すだけです。ファイルシステムが読み取り専用であれば、この条件が真であっても file は書き込み不可能です。
ファイル file が存在し、実行可能であれば真。真であっても、実行フラグが設定されていることを表すだけです。file がディレクトリの場合には、真は file が検索可能なことを表します。
文字列 string の長さがゼロであれば真。
ファイル file が存在し、シンボリックリンクであれば真。
ファイル file が存在し、プロセスの実効ユーザー ID が所有していれば真。
ファイル file が存在し、ファイルのグループがプロセスの実効グループ ID と一致していれば真。
ファイル file が存在し、ソケットであれば真。
ファイル file1 が存在し、file2 よりも新しい場合は真。
ファイル file1 が存在し、file2 よりも以前のファイルである場合は真。
ファイル file1 と file2 が存在し、同じファイルを参照している場合は真。
文字列 string が NULL の文字列でなければ真。
文字列 string が pattern と一致していれば真。
文字列 string が pattern と一致していなければ真。
文字列 string1 と string2 が等しければ真。
文字列 string1 と string2 が等しくなければ真。
ASCII コードの値で文字を比較して、string1 が string2 よりも前にあれば真。
ASCII コードの値で文字を比較して、string1 が string2 よりも後にあれば真。
整数 n1 と n2 が代数的に等しければ真。
整数 n1 が代数的に整数 n2 より大きければ真。
整数 n1 が代数的に整数 n2 より大きければ真。
整数 n1 が代数的に整数 n2 より大きいか等しければ真。
整数 n1 が代数的に整数 n2 より小さければ真。
整数 n1 が代数的に整数 n2 より小さいか等しければ真。
これらの基本式は、以下の演算子と組み合わせて指定できます。
条件 condition が偽であれば真。
以下の形式の要素 2 つからなる基本式は「単項基本式」と呼びます。
-基本演算子 基本式
基本式 -基本演算子 基本式 基本式 基本演算子 基本式
演算子の優先順位を決めるアルゴリズム、および生成される戻り値は、 testに渡す引数の数により異なります。ただし [. . .] 形式を使う場合、最終引数の右角括弧は、このアルゴリズムでは引数には含まれません。
以下のリストにおいて、$1、$2、$3、$4 は、test に渡す引数を表します。
偽 (1) で終了。
$1 が NULL でなければ真 (0) で終了。NULL なら偽。
$1 が ! のとき、 $2 が NULL なら真、$2 が NULL でなければ偽。
$1 が単項基本式のとき、単項テストの結果が真なら真、偽なら偽。
その他の場合、結果は不定。
$2 が 2 項基本式のとき、$1 と $3 を対象に 2 項テストを実行。
$1 が ! のとき、$2 と $3 の 2 つの引数に対するテストを否定形に。
その他の場合、結果は不定。
$1が ! のとき、$2、$3、$4 の 3 つの引数に対するテストを否定形に。
その他の場合、結果は不定。
基本式と演算子が混在しているような、ユーザーが用意した入力データを処理する際、スクリプト側では十分な注意が必要です。スクリプトに対して入力データが生成されるケースをアプリケーション作成者がすべて理解していない限り、
test "$1" -a "$2" |
test "$1" && test "$2" |
test expr1 -a expr2 |
test expr1 && test expr2 |
test expr1 -o expr2 |
test expr1 | | test expr2 |
シェルコマンド言語では、グループ分け用に小括弧と中括弧が使用できます。
sh を使うときは、小括弧はエスケープ付きで記述しなければなりません。次の例を見てください。
test \( expr1 -a expr2 \) -o expr3 |
( test expr1 && test expr2 ) | | test expr3 |
test "$1" test ! "$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" |
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 に含まれているか
ディレクトリが存在しなければ mkdir を実行する。
test ! -d tempdir && mkdir tempdir |
読み取り不可になるまで少し待つ。
while test -r thefile do sleep 30 done echo'"thefile" is no longer readable' |
引数の値が 3 つの文字列のいずれか (2 つは変形) であればコマンドを実行する。
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
Kornシェルでも Bourne シェルの if コマンドと test コマンドの両方の構文を使用できます。
if コマンドの中では括弧と括弧の中の文字との間に空白が必要です。
test の実行に影響を与える環境変数 LC_CTYPE、LC_MESSAGES、NLSPATH についての詳細は、environ(5) を参照してください。
以下の終了ステータスが返されます。
condition の評価結果は真だった。
condition の評価結果は偽だった、または condition が指定されていなかった。
エラーが発生した。
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWcsu |
sh と ksh では、if、for、while の組み込みコマンドの構文でセミコロンの代わりにキャリッジリターンが使用できます。
名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 注意事項