シェル・スクリプト・リファンレス |
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス |
複雑な計算を行う「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 < |
とできる。複雑な処理を行う場合は「<<」のリダイレクトを利用するとよい。
シェル・スクリプトとの値のやり取り |
シェル・スクリプトから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などの条件式としては利用できない。
関連事項 |
bc,整数計算を行う「expr」 |