EXPR(1) | FreeBSD General Commands Manual | EXPR(1) |
名称
expr — 式を評価する書式
expr | [ -e] expression |
解説
expr ユーティリティは、与えられた式 expression を評価し、その結果を標準出力に書き込みます。すべての演算子とオペランドは、個別の引数として渡す必要があります。演算子には、コマンドインタプリタにとって特別な意味を持つものがありますので、適切にクォートする必要があります。すべての整数オペランドは、10 進数として解釈され、 (厳密でない構文解析が FreeBSD の expr の前のバージョンとの後方互換性のために有効にされていないなら) 1 つ以上の数字が続いた省略可能な先導するマイナス記号だけから成らなければなりません。
算術演算は、C の intmax_t データ型 (利用可能な最も大きい符号付き整数型) にしたがって範囲がある符号付き整数計算を使用して実行されます。すべての変換と演算は、オーバフローがないかどうかチェックされます。プログラムのオーバフローの結果は、stdout へのエラーメッセージとエラー状態を付けて、終了します。
-e オプションは、以下で詳しく述べられるように、後方互換性の振る舞いを有効にします。
以下に、使える演算子を優先度の低い順に示します。すべて左結合です。同じ優先度の演算子は、シンボル‘ {
’と‘ }
’で括ってあります。
-
expr1
|
expr2 - 空の文字列でもなく、また 0 でもなければ、 expr1 の評価の値を返します。そうでなければ、空の文字列でなければ、 expr2 の評価の値を返します。そうでなければ、0 を返します。
-
expr1
&
expr2 - 式の評価が、空の文字列でも 0 でもない場合は、 expr1 を評価した結果を返し、さもなければ 0 を返します。
-
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 実装は、この構文を許しません。正しい解釈を保証する可搬性のある方法については、後述の使用例を参照してください。“expr
”) の
utility 引数を付けた)
check_utility_compat(3) 関数は、後方互換性のモードが有効にされるべきかどうかを決定するために使用されます。可搬的でない使用方法を避けるように簡単にできないような複雑なスクリプトで
expr が使用されている場合に、移行とデバッグのためにこの機能を使用することを意図しています。また、後方互換性のモードを有効にすると、これは、
FreeBSD の
expr の歴史的な振る舞いに一致するので、
-e オプションを暗黙のうちに有効にします。このオプションは、数値の構文解析を厳密でないようにし、先導する空白類と省略可能な先導するプラス記号を許可します。さらに、空のオペランドには、数値の文脈で 0 の値を意味します。また、歴史的な理由で、環境変数
EXPR_COMPAT を定義すると、後方互換性モードを有効にします。
環境変数
- EXPR_COMPAT
- 設定するなら、後方互換性モードを有効にします。
終了ステータス
expr ユーティリティは、次の値の 1 つで終了します:- 0
- 式は、空文字列でも 0 でもない。
- 1
- 式は、空文字列か、0 です。
- 2
- 式が無効です。
使用例
- ( sh(1) 構文での) 以下の例は、変数 a に 1 を加えます:
a=$(expr $a + 1)
- a の値が負数だと、これは、失敗します。 a が負数の場合に expr コマンドへのオプションだと解釈されないようにするには、この式を次のようにする必要があります:
a=$(expr 1 + $a)
- より一般的には、負数となる可能性のある値は、括弧で括ります:
a=$(expr \( $a \) + 1)
- シェル演算で、エスケープは、必要ではありません:
a=$((a + 1))
- 以下の例は、変数 a に設定されたパス名のうち、ファイル名に当たる部分を表示します。 a は、パス / を表現している可能性があるので、これが割り算の演算子として解釈されないようにする必要があります。
//
文字がこの曖昧性を解決します。expr "//$a" : '.*/\(.*\)'
- 最新の sh(1) 構文で、
"${a##*/}"
以下の例は、変数 a に含まれる文字の数を返します。再び、 a がハイフンで始まるかもしれないなら、 expr へのオプションとして解釈されることを防ぐ必要があり、 a は、演算子として解釈されるかもしれません。
- これのすべてを処理するために、複雑なコマンドが必要です:
expr \( "X$a" : ".*"\) - 1
- 最新の sh(1) 構文で、はるかに容易に、これを行うことができます:
${#a}
規格
expr ユーティリティは、後方互換性モードが有効にされいなら、 IEEE Std 1003.1-2008 (“POSIX.1”) に適合しています。後方互換性モードは、数値引数の厳密でないチェックを実行します:
- 空のオペランドの文字列は、0 として解釈されます。
- 先導する空白類そして/または、ほかの有効な正の数値オペランドの前のプラス記号は、許可され、そして、無視されます。
拡張演算範囲とオーバフローチェックは、符号付き long の使用が、未定義の動作を与える場合の結果に相違が生じるだけであるので、演算が符号付き long を使用して行われるという POSIX の要件と衝突しません。
POSIX 規格にしたがって、文字列引数 length, substr, index または match の使用は、未定義の結果を生じます。 expr のこのバージョンでは、これらの引数は、それらのそれぞれの文字列値として単に処理されます。
-e フラグは、拡張機能です。
February 25, 2012 | FreeBSD |