1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

整数計算のためのShell exprコマンドの実装

2022-02-07 07:07:21

Shell exprは、整数計算だけでなく、文字列の長さ計算、文字列比較、文字列照合、文字列抽出などのオプションで文字列を扱うことができる強力で複雑なコマンドです。

ここでは、exprを整数演算にのみ使用し、文字列処理には使用しませんので、興味のある方はご自身でお調べください。

シェルexprは、以下のように整数演算に使用します。

expr Expressions

exprは、式の書式について、いくつかの特別な要求があります。

  • 式中に現れる演算子、数値、変数、括弧は、式の左右に少なくとも1つの空白がなければならず、そうでない場合はエラーが報告されます。
  • 特殊記号の中には、乗算記号*や括弧()のように、バックスラッシュ(Backslash)でエスケープ(特殊な意味を隠す)しなければならないものがありますが、これらは" \"でエスケープしないとShellが正規表現の記号として誤判断します(*はワイルドカード、()はグループと対応します)。

接頭辞が$の変数を使用する。

[例1】Expr 整数計算の簡単な例です。

[jb51.net]$ expr 2 +3 #Error: no space before the plus sign and 3
expr: syntax error
[jb51.net]$ expr 2 + 3 #This is the correct one
5
[jb51.net]$ expr 4 * 5 #Error: multiplication sign is not escaped
expr: syntax error
[jb51.net]$ expr 4 \* 5 # This is correct after using \ escaping
20
[jb51.net]$ expr ( 2 + 3 ) \* 4 # The parentheses need to be escaped too
bash: syntax error near unanticipated symbol `2'
[jb51.net]$ expr \( 2 + 3 \) \* 4 # Use the \ escape to be correct
20
[jb51.net]$ n=3
[jb51.net]$ expr n + 2 # Add $ when using variables
expr: non-integer argument
[jb51.net]$ expr $n + 2 # Add $ to be correct
5
[jb51.net]$ m=7
[jb51.net]$ expr $m \* \( $n + 5 \)
56


上記の例では、exprコマンドを直接使用しているので、計算結果がそのまま出力されます。もし、計算結果を変数に代入したい場合は、式全体をバッククォート ``(Tabキーの上にある)で囲む必要があります。

[例2】exprの計算結果を変数に代入する。

[jb51.net]$ m=5
[jb51.net]$ n=`expr $m + 10`
[jb51.net]$ echo $n
15


Exprを使って計算をするのはとても面倒で、細かいところまで気を配らなければならないので、私は息を潜めて(())やlet、$[]を使うことをお勧めしますよ。

整数計算のためのShell exprコマンドについての説明は以上です。Shell exprの整数計算については、過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。