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

 複雑な計算を行う「bc」

 exprでは,整数の四則演算や数値判別といった簡単な処理しか行えない。小数点を利用するなどより複雑な処理を行いたい場合は,bcを利用する。bcはexprとは違い,ファイルやパイプなどで引き渡された値を処理する。

 たとえば,「1+1」という計算を行う場合は,


$ echo "1+1" | bc 
2

のように,文字列をパイプで引き渡すか,


1+1

というファイル(たとえばcal.bc)を作成し,


$ bc cal.bc 
2

のように実行する必要がある。


 bcでの計算

 bcでは表で示した計算式や論理式を利用できる。


意味
scale=桁 小数点以下の桁を指定する。初期値は0
length=桁 有効桁数を指定する
length ( 数値 ) 指定した数値の有効桁数を返す
scale ( 数値 ) 指定した数値の小数点以下の桁数を返す
ibase=基数 入力の基数を指定する。初期値は10
obase=基数 出力の基数を指定する。初期値は10
last 最後にbcが出力した値
( 式 ) 括弧内の式を先に計算する
変数 ++ 指定した変数に1を足す
変数 -- 指定した変数から1を引く
数値1 + 数値2 数値1と数値2を足し合わせる
数値1 - 数値2 数値1から数値2を引く
数値1 * 数値2 数値1と数値2を掛け合わせる
数値1 / 数値2 数値1から数値2を割る
数値1 % 数値2 数値1から数値2を割った余り
数値1 ^ 数値2 数値1の数値2乗
s ( 数値 ) sin (数値はラジアン)
c ( 数値 ) cos (数値はラジアン)
a ( 数値 ) atan (結果の単位はラジアン)
l ( 数値 ) log
e ( 数値 ) exp
sqrt ( 数値 ) 指定した数値の平方根を返す
数値1 == 数値2 数値1と数値2が等しいなら「1」を返す
数値1 != 数値2 数値1と数値2が等しくないなら「1」を返す
数値1 < 数値2 数値1が数値2より小さいなら「1」を返す
数値1 <= 数値2 数値1が数値2より小さいまたは等しいなら「1」を返す
数値1 > 数値2 数値1が数値2より大きいなら「1」を返す
数値1 >= 数値2 数値1が数値2より大きいまたは等しいなら「1」を返す
!式 式の論理的に反対を返す
式1 && 式2 式1と式2が共に真ならば「1」を返す
式1 || 式2 式1と式2のいずれかが真ならば「1」を返す
return ( 戻り値 ) 関数から戻る
quit bcを終了する
if (条件式) 分岐を行う
while (条件式) 繰り返しを行う
for (初期処理;条件;繰り返しごとの処理) 指定した回数繰り返す

 たとえば,1/3を計算して,小数点以下5桁まで表示したい場合は,


$ echo "scale=5; 1/3" | bc 
.33333

のようにする。「scale=5」は小数点以下の桁数を設定する。また,複数の命令を1行で書く場合は,命令の区切りとして「;」を付ける必要がある。

 さらに,bc内で変数を利用することもできる。たとえば,


$ bc <
> scale=5
> r = 2.54       ←  rに2.54を代入している
> pi = 3.14
> r ^ 2 * pi     ←  円の面積の計算
> EOF            ←  入力の終端
20.25802

とできる。複雑な処理を行う場合は「<<」のリダイレクトを利用するとよい。


 シェル・スクリプトとの値のやり取り

 シェル・スクリプトからbcに計算式を送るには,echoとパイプを利用して送る必要がある。たとえば,以下のようなシェル・スクリプト「calc1.sh」があったとする。


#!/bin/sh

echo -n "L = 2 * $1 * PI : Ans. "
echo "scale=3; 2*$1*3.14" | bc

 これは引数に与えた数を半径とした,円周の長さを算出するものだ。計算にはechoで計算式を作成してからパイプでbcコマンドで引き渡す。これを実行すると,次のようになる。


$ ./calc1.sh 10 
L = 2 * $1 * PI : Ans. 62.80

 計算の結果をシェル変数に代入したい場合は,echoからbcまでをバック・クォーテイションでくくって,それを変数に代入すればよい。たとえば,以下のようなシェル・スクリプト「calc2.sh」のようにする。


#!/bin/sh

L=`echo "scale=3; 2*$1*3.14" | bc`

echo "2 * $1 * PI = $L "

 もし,複雑な計算をしたい場合は,リダイレクション<<を利用してbcに引き渡すとよい。たとえば,たとえば,以下のようなシェル・スクリプト「calc3.sh」のようにする。


#!/bin/sh
a=$1
b=$2
c=$3

bc <
	

 ただし,bcの終了コードはbcが正常に終了した場合に0,エラーを発生した場合は1を返すため,exprのようにifなどの条件式としては利用できない。