expr(1)

名前
expr - 式を評価する

書式
expr expression...

expr [--help] [--version]

説明
expr は式を評価し、その結果を標準出力に書き出す。 式のトークン (token) はそれぞれ別々の引数で与える必要がある。

オペランド (operand) は数字または文字列である。 expr はオペランドの位置に現れたものを、それに対して行われる演算に応じて 整数または文字列に変換する。 文字列は expr ではクォートしなくてよいが、 シェルから保護するための引用符が必要かもしれない (スペースなど)。

演算子は 2 項間に挿入されるシンボルとして、 または前置されるキーワードとして与えられる。 括弧も通常のようにグループ化に利用できる (しかしシェルによる解釈を避けるためには括弧をクォートしなければならない)。

expr は以下の終了ステータスを返す:
0: 式がナルでも 0 でもない
1: 式がナルまたは 0
2: 式が正しくない

演算子 (優先度順)

  関係演算

|   左項がナルでも 0 でもなければ左項を返す。 ナルや 0 だった場合は右項を返す。 これは通常の `or' 演算にあたる。

&   左項、右項ともナルでも 0 でもなければ左項を返す。 それ以外の場合は 0 となる。

<  <=  =  ==  !=  >=  >
    両項を比較し、関係が真なら 1、偽なら 0 を返す (== は =と同義）。 expr はまず両方の項を数値に変換し、 数値的な比較を行おうとする。 どちらかの引数が数値に変換できなかった場合は辞書的な比較を行う。

  数値演算

+  -
    代数的な加減算を行う。 左右の項は数値に変換され、失敗した場合はエラーとなる。

*  /  %
    代数的な乗算・除算・剰余演算を行う (`%' は C の場合と同じく剰余演算に対応する)。 左右の項は数値に変換され、これに失敗した場合はエラーとなる。

  文字列演算

string : regex
    パターンマッチを実行する。 左右の項は文字列に変換され、 右項は (grep(1) の使う基本的な) 正規表現として扱われる。 右項には暗黙のうちに先頭に `^' が自動的に付加され、 左項がその正規表現にマッチするかのテストが行われる。 マッチが成功した場合、 正規表現の一部が `\(' と '\)' で囲われていれば、 : 演算子は string のうち、 副表現 (subexpression) にマッチした部分を返す。 それ以外の場合はマッチした部分の文字数が返される。 マッチに失敗した場合、 `\(' と `\)' が使われていた場合にはナル文字列が、 そうでない場合には 0 が返される。 `\(' と `\)' のペアのうち、最初のものだけが返り値に影響する。 それ以外のペアは、正規表現の演算子をグループ化するという意味だけを持つ。 他の expr と異なり、`+' (1 つ以上)、`?' (0 または 1)、`|' (or 接続) もマッチング演算子として認識される。

さらに、以下のキーワードも認識される:

index string charset
    charset にあるどれかの文字が string に見付かれば、 その最初に見付かった位置を返す。どの文字も見付からなければ 0 を返す。

length string
    string の長さを返す。

match string regex
    パターンマッチを行う別のやり方。 これは ``string : regex'' と同じ。

quote string
    string を (演算子またはキーワードが含まれていても) 通常の文字列とみなす。 環境変数 POSIXLY_CORRECT が設定されていると無効になる。

substr string position length
    string の部分文字列を返す。 部分文字列は string の position から始まり、 最大 length の長さを持つ。 position や length が正でなかったり数値でなかった場合は、 ナル文字列を返す。

括弧は通常のグループ化の意味に用いることができる。 キーワード (match, substr, index, length) は文字列として用いることはできない。

オプション
GNU expr が引数 1 つだけで起動された場合には、 以下のオプションが認識される:

--help
    標準出力に使用方法のメッセージを出力して正常終了する。

--version
    標準出力にバージョン情報を出力して正常終了する。

例

シェル変数 foo に 1 を加える:

    foo=`expr $a + 1`

変数 bar に格納されているファイル名のうち、 ディレクトリ以外の部分を表示する (bar の値には `/' が含まれていなくても良い):

    expr $bar : '.*/\(.*\)' '|' $a

文字列 `abc' に文字 `b' をマッチさせる:

    expr abc : 'a\(.\)c'

文字列 `abcdef' に `c' または `z' のいずれかが存在している位置を探す:

    expr index abcdef cz

キーワード (index) を文字列として用いている誤った例:

    expr index index a

キーワード (index) を文字列として用いている正しい例:

    expr index quote index d

注意
プログラムのバグについては bug-sh-utils@gnu.org に報告してください。 ページの更新は Ragnar Hojland Espinosa <ragnar@ragnar-hojland.com> が行っています。