シェル・スクリプト・リファンレス
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス

 整数計算を行う「expr」

 整数計算を行う場合に利用できるのが「expr」だ。exprの利用法を表に示す。


数式 意味
( 数式 ) 括弧内の計算を先に行う。ただし,カッコの前にバック・スラッシュ「\」を付ける必要がある
数値1 + 数値2 数値1と数値2をたす
数値1 - 数値2 数値1から数値2を引く
数値1 * 数値2 数値1と数値2を掛け合わせる。ただし,「*」の前にバック・スラッシュ「\」を付ける必要がある
数値1 / 数値2 数値1から数値2を割る。ただし,余りは切り捨てられる
数値1 % 数値2 数値1から数値2を割った余り

 たとえば,足し算を行う場合は,


$ expr 1 + 2 
3

とする。ただし,カッコとかけ算は記号の前にバック・スラッシュを付ける必要がある。


$ expr \( 1 + 2 \) \* 5 
15

 変数を利用した計算も行える。たとえば,変数aとbを掛け合わせて変数cに代入するには,


$ a=5 
$ b=2 
$ c=`expr $a \* $b`
$ echo $c 
10

とする。計算結果を変数に代入する場合はexprをバック・クォーテイションでくくる必要がある。


 数値の条件判別の可能

 ifなどで条件を判別するにはtestを利用した。また,exprを利用しても数値の判別が行える。表のようなものを利用して判別を行える。


判別式 意味
数値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)を返す。ただし,「>」の前にバック・スラッシュ「\」を付ける必要がある
数値1 >= 数値2 数値1が数値2より大きいまたは等しいなら「1」(終了コードは0)を返す。ただし,「>」の前にバック・スラッシュ「\」を付ける必要がある
式1 & 式2 式1と式2が共に真ならば「1」(終了コードは0)を返す。ただし,「&」の前にバック・スラッシュ「\」を付ける必要がある
式1 | 式2 式1と式2のいずれかが真ならば「1」(終了コードは0)を返す。ただし,「|」の前にバック・スラッシュ「\」を付ける必要がある

 たとえば,2つの変数が等しいか確かめるなら,


$ a=1 
$ b=2 
$ expr $a = $b 
0

とする。この場合は等しくないので,「0」が返される。

 ただし,終了コードが返される値と逆になるようにできている。たとえば,条件判別が正しい場合は「1」を返すが,終了コードが「0」を返すようになっている。こうすることで,ifやwhileの条件判別にも利用できる。

 たとえば,以下のようなシェル・スクリプト「cp_file.sh」があったとする。


#!/bin/sh

if `expr $# = 2 > /dev/null`
then
	cp $1 $2
else
	echo "Usage : cp_file.sh SOURCE DEST"
fi

 このスクリプトでは「expr $# = 2」で引数を2つ与えていることを確認してから,コピーコマンドを実行している。リダイレクトで/dev/nullに送っているのは,exprの実行結果を表示しないようにするためだ。