expr コマンド

目的

引数を式として評価します。

構文

expr Expression

説明

expr コマンドは、Expression パラメーターを読み取り、それを評価して、結果を標準出力に書き出します。

Expression パラメーターに対しては、次の規則が適用されます。

  • 各項目はブランクで区切ります。
  • シェル専用の文字の前には、¥ (円記号) を付けます。
  • ブランクやその他の特殊文字を含む文字列は、引用符で囲みます。

整数の前には、単項のハイフンを付けることができます。 内部では、整数は 32 ビットの 2 の補数として処理されます。

注: expr コマンドは、 null 列ではなく、ゼロの値を示す 0 を戻します。

次の項目は、Expression パラメーターの演算子およびキーワードを記述しています。 エスケープする必要のある文字の前には、¥ (円記号) が付いています。 項目のリストは、優先順位が高い順に並んでおり、同じ優先順位の演算子は {} (中括弧) で囲んでグループ化されています。

項目 説明
Expression1 ¥| Expression2 null でも 0 でもない場合は、Expression1 を戻します。それ以外の場合は、Expression2 を戻します。
Expression1 ¥& Expression2 Expression1 と Expression2 の値が null でも 0 でもない場合は、Expression1 を戻します。それ以外の場合には値 0 を戻します。
Expression1 { =, ¥>, ¥>=, ¥<, ¥<=, != } Expression2 両方の式が整数の場合、整数の比較結果を戻します。その他の場合は、文字列の比較結果を戻します。
Expression1 {+, - } Expression2 整数値の引数を加算または減算します。
Expression1 { ¥*, /, % } Expression2 乗算、除算を行うか、または整数値の引数の除算の剰余を算出します。
Expression1 : Expression2 Expression1 の計算結果を Expression2 の計算結果から得られた正規表現パターンと比較します。 正規表現の構文は ed コマンドの場合と同じですが、すべてのパターンは文字列の先頭に置かれていなければなりません (つまり、文字列の先頭文字から始まるシーケンスのみが、正規表現によってマッチングされます)。 したがって、^ (脱字記号) は、このコンテキストでは特殊文字ではありません。

一般に、照合演算子は、一致した文字の数を戻します (突き合わせが失敗すると 0)。 パターンに次のサブ式


¥( Expression ¥)

が含まれている場合は、実際に一致した文字が入っている文字列が戻されます。

照合シーケンスでは、文字範囲で使用する等価クラスを定義できます。 照合シーケンスと等価クラスについて詳しくは、「ナショナル・ランゲージ・サポート ガイドおよびリファレンス」の『ロケール環境変数について』のセクションを参照してください。

注: 次の引数の文字列は、標準の引数を超えた拡張機能です。その動作はオペレーティング・システムによって異なる場合があります。これらの引数の文字列は移植可能ではありません。

項目 説明
match String1 String2 Expression1 : Expression2 と同じです。
length String1 String1 の長さを戻します。
index String1 String2 String2 内のいずれかの文字が存在する String1 内の最初の桁を戻します。
substr String1 StartPosition Length                        String1 内の StartPosition の桁にある文字で始まり、Length の文字数まで続く文字列を戻します。

終了状況

このコマンドは次の終了値を戻します。

項目 説明
0 Expression パラメーターは、null でも 0 でもありません。
1 Expression パラメーターは、null か 0 です。
2 Expression パラメーターは無効です。
>2 エラーが発生しました。

注: シェルがパラメーターを処理した後は、expr コマンドは値による場合を除いて演算子とオペランドを区別することができません。したがって、$a の値が j の場合、コマンド


expr $a = j

は、シェルがこの引数を expr コマンドを渡した後、


expr j = j

のようになります。また、次のコマンドも真になります。

expr X$a = Xj

  1. シェル変数を変更するには、次のように入力します。
    COUNT=`expr $COUNT + 1`
    これによって、シェル変数 $COUNT1 が追加されます。expr コマンドがバッククォートで 囲まれることにより、expr コマンドからの標準出力は、 シェルによって COUNT= コマンドに置換されます。$COUNT 変数は使用前に初期化されなければなりません。
  2. シェル変数 $STR の長さを知るには、 次のように入力します。
    LENGTH=`expr $STR : ".*"`
    これによって、LENGTH 変数が: (コロン) 演算子で指定された値に設定されます。パターン .* (ドット、アスタリスク) は初めから終わりまでどの文字列とも一致します。したがって、コロン演算子は一致した文字の数として $STR 変数の長さを与えます。 シェルが .* (ドット、アスタリスク) をパターン・マッチング文字として処理しないようにするために、 .* を引用符で囲まなければならないことに注意してください。引用符はパターンの一部ではありません。

    $STR 変数が null 文字列に設定されるか、ホワイト・スペース (ブランクまたはタブ) を含んでいると、コマンドは、「expr: syntax error」というエラー・メッセージを表示します。これは、シェルが、通常、null 文字列をコマンドに渡さないことが原因で発生します。この場合、expr コマンドでは、次の内容しか認識できません。

    
    :.*
    シェルは単一引用符も除去します。コロン演算子は 2 つの値を必要とするので、これは機能しません。 この問題は、シェル変数を次のように二重引用符で囲めば解決できます。
    LENGTH=`expr "$STR" : ".*"`
    これで、$STR 変数の値が null の場合、LENGTH 変数の値は 0 に設定されます。一般的には、シェル変数を二重引用符で囲むことをお勧めします。シェル変数を単一引用符で囲まないように注意してください。
  3. 文字列の一部を使用するには、次のように入力します。
    FLAG=`expr "$FLAG" : "-*¥(.*¥)"`
    これによって、先行ハイフンがシェル変数 $FLAG から除去されます。コロン演算子によっては ¥( と ¥) (円記号と左小括弧、および円記号と右小括弧) の文字で囲まれたサブ式と一致する、FLAG 変数の一部が得られます。¥( と ¥) のサブ式の文字を省略すると、コロン演算子は一致した文字の数を与えます。

    $FLAG 変数が - (ハイフン) に設定されている場合、コマンドは、構文エラー・メッセージを表示します。 これは、expr コマンドを実行する前に、 シェルが $FLAG 変数の値を置き換えるために発生します。expr コマンドはハイフンが変数の値であることを認識しません。 expr コマンドには次のようにしか見えません。

    
    - : -*¥(.*¥)
    そして、最初のハイフンを減算の演算子と解釈します。この問題を解決するには、次のように入力します。
    FLAG=`expr "x$FLAG" : "x-*¥(.*¥)"`
  4. if ステートメントで、 expr コマンドを使用する場合は、次のように入力します。
    if expr "$ANSWER" : "[yY]" >/dev/null
    then
    echo ANSWER begins with "y" or "Y"
    fi
    $ANSWER 変数が y、 または Y で始まる場合は、 if ステートメントの then 部分が実行されます。マッチングが正常に行われると、 式の結果は 1 になり、expr コマンドは 終了値 0 を戻します。if ステートメントはこれを論理値が真であると認識します。 マッチ・ファイルが失敗すると、結果は 0 となり、終了値 1 (偽) が戻されます。

    expr コマンドの標準出力を /dev/null スペシャル・ファイルにリダイレクトすると、式の結果は破棄されます。 リダイレクトしなければ、結果は標準出力に書き出されます。通常、標準出力はワークステーションのディスプレイです。

  5. 次の式について考えてみましょう。
    expr "$STR" = "="
    $STR 変数に = (等号記号) が含まれている場合、シェルがこのコマンドを処理した後、expr コマンドは式を次のように認識します。
    = = =
    expr コマンドは、これを行内の 3 つの = 演算子と解釈して、構文エラー・メッセージを表示します。 シェル変数の値が expr 演算子の 1 つと同じであると、このメッセージが必ず表示されます。この問題は、次のように式を記述すれば解決できます。
    expr "x$STR" = "x="
  6. $SHELL 環境変数 /usr/bin/ksh の長さを戻すには、 次のように入力します。
    
    expr length $SHELL
    次のように表示されます。
    12
  7. "abcdef" の中の文字列 "de" のどちらか最初にある文字の桁を戻すには、 次のように入力します。
    expr index abcdef de
    次のように表示されます。
    4
  8. "abcdef" の中の文字列 "fd" のどちらか最初にある文字の桁を戻すには、 次のように入力します。
    expr index abcdef fd
    次のように表示されます。
    4
  9. 文字列 "Goodnight Ladies" の中で、11 桁目から始まり長さが 6 の文字列を戻すには、 次のように入力します。
    expr substr "Goodnight Ladies" 11 6
    次のように表示されます。
    Ladies

ファイル

項目 説明
/usr/bin/expr expr コマンドが入っています。