EXPR(1)

名称
expr - 式を評価する

書式
expr [-e] expression

解説
すべての演算子およびオペランドは個別の引数として渡す必要があります。 演算子にはコマンドインタプリタにとって特別な意味を持つものがありますので、 適切にクォートする必要があります。 整数オペランドはすべて基数 10 として解釈されます。

数値演算は、符号付き整数計算で行われます。 -e フラグを指定すると、演算は C の intmax_t データ型 (使用可能な最大整数型) を使用し、 expr は数値あふれを検出するとエラー表示を返します。 整数に変換するとあふれるような大きさの数値オペランドが指定されると、 これは代りに文字列として解釈されます。 -e を指定しないと、数値演算および整数引数の解釈は、 long データ型を使用し、C 標準のルールに従って黙って桁あふれを起します。

以下に、使える演算子を優先度の低い順に示します。 すべて左結合です。 同じ優先度の演算子は、{ } で括ってあります。

expr1 | expr2
    expr1 が空の文字列でも 0 でもない場合は expr1 を評価した結果を返し、さもなければ expr2 を評価した結果を返します。

expr1 & expr2
    expr1 と expr2 の各々の評価結果が、ともに空の文字列でも 0 でもない場合は expr1 を評価した結果を返し、さもなければ 0 を返します。

expr1 {=, >, >=, <, <=, !=} expr2
    expr1 と expr2 がともに整数ならば整数としての比較結果を返し、さもなければ 文字列とみなして、ロカールに従った照合方法を用いた比較結果を 返します。 いずれの場合も、指定された関係が「真」ならば 1 を、「偽」ならば 0 を返します。

expr1 {+, -} expr2
    整数値の引数に関して、加算あるいは減算した結果を返します。

expr1 {*, /, %} expr2
    整数値の引数に関して、乗算、整数除算、または剰余の結果を返します。

expr1: expr2
    “”: 演算子は、 expr1 と expr2 のパターンマッチを行います。 expr2 は、正規表現でなければなりません。 またこの正規表現は、暗黙のうちに “^” が仮定されることにより、文字列の先頭から比較を始めることに なります。

    パターンマッチが成功した場合、もし正規表現中に少なくとも1つ “\(...\)” の形の部分正規表現が含まれていたならば、このうち “\1” に相当する文字列を返します。 このような部分正規表現が含まれていなければ、マッチした文字列の 長さを返します。 またパターンマッチが失敗した場合、もし部分正規表現が含まれて いたならば空の文字列を返し、含まれていない場合は 0 を返します。

丸括弧 “()” は通常と同じくグループ分けに用いることができます。

expr ユーティリティは、 演算子かもしれない引数とオペランドかもしれない引数を字句的には区別しません。 字句的に演算子と等しいオペランドは、構文エラーと解釈されます。 回避方法については、後述の使用例を参照してください。

一般に expr コマンドの構文は、歴史的なもので不便です。 新規アプリケーションでは、 expr の代りにシェルの数値演算を使用することをお勧めします。

  以前の実装との互換性
FreeBSD 4.x 互換性が有効にならない限り、本バージョンの expr は、 POSIX Utility Syntax Guidelines を支持します。 このガイドラインでは、マイナス記号が付いている先行引数は、 プログラムに対するオプションとみなすことが必要です。 標準の - - 構文を使用し、このような解釈を避けられます。 しかしながら、以前の FreeBSD バージョンを含む多くの歴史的な expr 実装は、この構文を許しません。 正しい解釈を保証する可搬性のある方法については、 後述の使用例を参照してください。 check_utility_compat(3) 関数 ( utility 引数を “expr” にします) を使用して、互換モードを有効にすべきかどうか判定できます。 可搬的でない使用方法を避けるように簡単にできないような複雑なスクリプトで expr が使用されている場合に、 移行およびデバッグのためにこの機能を使用することを意図しています。 互換モードを有効にすると、暗黙的に -e オプションを有効にします。 これは、 FreeBSD における歴史的な expr の動作に合致するからです。 歴史的な理由で、環境変数 EXPR_COMPAT を定義しても互換モードが有効になります。

環境変数

EXPR_COMPAT
    設定すると、互換モードが有効になります。

使用例

•   ((sh) 1 構文での) 以下の例は、変数 a に 1 を加えます:
        a=$(expr $a + 1)

•   a の値が負数だと、これは失敗します。 a が負数の場合に expr コマンドへのオプションだと解釈されないようにするには、 この式を次のようにする必要があります:
        a=$(expr 1 + $a)

•   より一般的には、負数となる可能性のある値は括弧で括ります:
        a=$(expr \( $a \) + 1)

•   以下の例は、変数 a に設定されたパス名のうち、 ファイル名に当たる部分を表示します。 a はパス / を表現している可能性があるので、 これが割り算の演算氏として解釈されないようにする必要があります。 // 文字がこの曖昧性を解決します。
        expr //$a : '.*/\(.*\)'

以下の例は、変数 a に含まれる文字の数を返します。 繰り返しになりますが、 a がハイフンで開始する可能性がある場合、 expr へのオプションとして解釈されることを避ける必要があります。

•   expr コマンドが p1003.1-2001 に適合している場合、これは単純です:
        expr -- $a : .*

•   一方、古いシステムへも可搬とするためには、より複雑なコマンドが必要となります:
        expr \( X$a : .* \) - 1

診断
expr ユーティリティは、以下の値のうち1つを返して終了します。
0   式は空文字列でも 0 でもない
1   式は空文字列か、0 であった
2   式が無効だった

関連項目
sh(1), test(1), check_utility_compat(3)

規格
expr ユーティリティは、互換モードが有効でない場合には、 p1003.1-2001 に適合します。 -e フラグは拡張です。