連載
» 2017年12月28日 05時00分 公開

Linux基本コマンドTips(171):【 expr 】コマンド――計算式や論理式を評価する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、式を評価する「expr」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、式を評価する「expr」コマンドです。

exprコマンドとは?

 「expr」は、「式」を評価するコマンドです。結果の出力先は標準出力です。

 整数の四則演算や正規表現を使ったパターン判定が可能なため、コマンドラインでちょっとした計算や正規表現パターンを確認する際にも活用します ※1。シェルスクリプトの中でも役立ちます。

※1 exprコマンドの名前は、expression(式)に由来する。同じくシェルスクリプトで式の評価に使用するtestコマンドやletコマンド、第170回で取り上げたevalコマンドはbashのビルトインコマンドだが、exprコマンドは外部コマンド(/usr/bin/expr)だ。





exprコマンドの書式

expr 式

※[ ]は省略可能な引数を示しています。




exprの主なオプション

 exprのオプションは、使い方を表示する「--help」と、バージョンを表示する「--version」のみです。

exprコマンドが評価できる式(比較) ※2

出力
引数1 < 引数2 引数1が引数2より小さい場合は「1(TRUE、以下同じ)」、それ以外は「0(FALSE、以下同じ)」
引数1 <= 引数2 引数1が引数2より小さいか等しい場合は「1」、それ以外は「0」
引数1 > 引数2 引数1が引数2より大きい場合は「1」、それ以外は「0」
引数1 >= 引数2 引数1が引数2より大きいか等しい場合は「1」、それ以外は「0」
引数1 = 引数2 引数1と引数2が等しい場合は「1」、それ以外は「0」(「==」も利用可能)
引数1 != 引数2 引数1と引数2が等しくない場合は「1」、それ以外は「0」

※2 exprコマンドは2つの引数が整数と解釈できるかどうかをまず調べ、文字列だった場合は、「辞書並び」で比較する。



exprコマンドが評価できる式(文字列)

出力
文字列1 : 正規表現1 文字列1が正規表現1に合致する場合は合致した文字数(合致しない場合は0)※3
match 文字列1 正規表現1 「文字列1 : 正規表現1」と同じ
substr 文字列1 位置 長さ 文字列1の部分文字列を返す。指定した文字列1のうち、指定した位置(先頭が1)から指定した長さの文字列を返す(「expr substr abcde 3 2」なら、「cd」を返す)
index 文字列1 文字列2 文字列2に含まれるどれか1文字が見つかった文字列1の最も前方の位置を返す(先頭が1、見つからない場合は0)
length 文字列1 文字列1の長さ
+ 文字列1 文字列1が"match"や"/"のような演算子でも文字列として解釈する

※3 文字列1の先頭から合致するかどうかを調べる。途中から一致しても0を返す。例えば「expr abcd : b」は「0」となる。



exprコマンドが評価できる式(四則演算)※4

出力
引数1 + 引数2 引数1と引数2を足した結果
引数1 - 引数2 引数1から引数2を引いた結果
引数1 * 引数2 引数1と引数2を掛けた結果
引数1 / 引数2 引数1を引数2で割った結果の整数部分
引数1 % 引数2 引数1を引数2で割った余り

※4 演算の優先順位も考慮する。例えば「expr 10 + -2 "*" 3 + 5」は「9」となる。



exprコマンドが評価できる式(その他)

出力
引数1 | 引数2 引数1がNULL(例えば"")または0のとき以外は引数1、そうではないときは引数2
引数1 & 引数2 両方の引数が空または0ではないときは引数1、そうではないときは0
( 式1 ) 式1の値


四則演算を実行する

 「expr 100 + 20」で足し算、「expr 100 "*" 20」で掛け算を実行します(画面1)。数字も演算子も全てexprコマンドの引数なので、演算子の前後には空白が必要です。

 「*」のようにシェルで特別な意味を持つ記号を使う場合は、引用符でくくるか「expr 100 \* 20」のようにエスケープする必要があります(この場合は「*」の直前にバックスラッシュを付けています)※5。

 割り算では注意が必要です。「expr 100 / 3」で求まるのは結果の整数部分のみです。小数点以下の結果も必要な場合はbcコマンド(第121回)を使用するとよいでしょう。

 exprコマンドでは、複数の四則演算を組み合わせて使用できます。

※5 比較演算を実行するときも「expr 1 "<" 2」または「expr \< 2」のように実行する。「|」「&」「(」「)」を利用するときも同様だ。



コマンド実行例

expr 100 + 20

(100と20を足した結果を出力)(画面1

expr 100 "*" 20

(100と20を掛けた結果を出力)

expr 100 / 3

(100を3で割った結果のうち整数部分のみを出力)


画面1 画面1 四則演算を実行したところ


正規表現を確かめる

 「expr 文字列 : 正規表現」または「expr match 文字列 正規表現」で、文字列が正規表現に当てはまっているかどうかを調べます(画面2)。

 主にシェルスクリプトで使用します。書き下した正規表現が正しいかどうかを確認したい場合にも役立ちます。当てはまっている場合はその部分の文字数、そうではない場合は0を出力します。

 この他、substrで部分文字列、lengthで長さを求めます。

コマンド実行例

expr 文字列 : 正規表現

(文字列が正規表現に合致する場合その文字数を出力)

expr match 文字列 正規表現画面2

(文字列が正規表現に合致する場合その文字数を出力)


画面2 画面2 正規表現を確認したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。