書式
test [EXPRESSION]

書式
[ [EXPRESSION] ]

概要

test コマンドは与えられた式をテストし、 終了ステータス

  • 真ならばを0に
  • 偽ならば1に

設定します。

式は1つ以上の
演算子と引数から成り立っています。

fishでは最初の形式
test の方が好まれます。

他のシェルとの互換性のために、
2番目の形式が用意されています
( [ [EXPRESSION] ] )。

fishの test はほぼPOSIX互換です。

演算子

演算子が真になる条件です。

ファイルとディレクトリ関連

-b FILE
ブロックデバイス
-c FILE
キャラクタデバイス
-d FILE
ディレクトリ
-e FILE
存在する
-f FILE
通常のファイル
-g FILE
setgidアクセス権を持つ
-G FILE
存在し、ユーザと同じグループIDである
-L FILE
シンボリックリンク
-O FILE
存在し、ユーザ所有である
-p FILE
名前付きパイプ
-r FILE
読み込み可能
-s FILE
ファイルサイズが0より大きい
(空ファイルではない)
-S FILE
ソケット
-t FD
端末である
-u FILE
setuidアクセス権を持つ
-w FILE
書き込み可能。
ただし、ファイルシステムが
読み込み専用であることまではチェックしない
-x FILE
実行可能

文字列関連

STRING1 = STRING2
STRING1STRING2 が同じ
STRING1 ! STRING2=
STRING1STRING2 が異なる ·
-n STRING
空文字列ではない
-z STRING
空文字列である

整数関連

NUM1 -eq NUM2
NUM1NUM2 が同値
NUM1 -ne NUM2
NUM1NUM2 が同値ではない
NUM1 -gt NUM2
NUM1 > NUM2
NUM1 -ge NUM2
NUM1 ≧ NUM2
NUM1 -lt NUM2
NUM1 < NUM2
NUM1 -le NUM2
NUM1 ≦ NUM2

整数のみサポートしています。

有理数などより複雑な数値計算は、
env プログラムが役立ちます。
(これ原文おかしい!)

OSのドキュメント
を参照してください。

訳注: bc とかでは?
他にもプログラミング言語
インタプリタが使えます。

式を組み合わせる

COND1 -a COND2
COND1COND2 の両方が真
COND1 -o COND2
COND1COND2 のどちらかが真

! 演算子で
条件式の真偽を反転できます。

! EXPRESSION
EXPRESSION が偽

括弧で囲むことで
条件式をまとめられます。

( EXPRESSION )EXPRESSION の値を返します。

なお、 コマンド置換 として
解釈されるのを防ぐために、
\( とエスケープが必要になります。

実行例

以下の例では、
/tmp ディレクトリが存在するときに
/etc/motd/tmp にコピーする

if test -d /tmp
    cp /etc/motd /tmp/motd
end

以下の例では、
MANPATH が定義されて
空ではないときに、
その内容を表示します。

(MANPATH が未定義の場合、
クオートしないとゼロ引数に展開されます。)

if test -n '$MANPATH'
    echo $MANPATH
end

括弧と -o-a を組み合わせると、
より複雑な式を作成できます。

以下の例では、
/foo/bar ファイルがあり、
かつ /baz/bat ファイルがあるときに
Success と表示します。

if test \( -f /foo -o -f /bar \) -a \( -f /baz -o -f /bat \)
    echo Success.
end.

整数比較は
一方のオペランドが
整数ではないときには
失敗します。

if test 42 -eq 'The answer to life, the universe and everything'
    echo So long and thanks for all the fish  # 実行されない
end

$status との比較は一般的です。

if test $status -eq 0
    echo 'Previous command succeeded'
end

標準

test コマンドは
IEEE Std 1003.1-2008 (POSIX.1)の
サブセットを実装しています。

2つの例外があります。

文字列比較の <>
実装していません。

また、この test コマンドは
シェルのビルトインで、
スタンドアロンなユーティリティではないので、

標準入出力などの
特別なファイルディスクリプタに対して
-c を使っても、

パイプライン内から起動されたときと
別のシェルから
test ユーティリティを起動したときと
同じ結果を得られないことがあります。

以上のケースでは、
fishのビルトインの test ではなくて、
スタンドアロンの test ユーティリティを
使ってください。

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。