bashだけで四則演算をする方法

こんにちは。先日bashスクリプトを書いていて、ふと疑問に思いました。

Rubyとかで普通にできる四則演算は、bashではどうするのか?

例えば1+2を計算したりするには、別のコマンドを使わなければならないのか、とても気になったので調べてみました。

$(()) を利用すると四則演算ができる

結論からいうと、$(())を使えば計算できるようです。

echo $((1+2)) # 3 と表示される

いろんな書き方を試してみました

echo $((1 + 2)) # 3 と表示される
echo $(( 1 + 2 )) # 3
echo $((1 + 2.0))
# bash: 1 + 2.0 : syntax error: invalid arithmetic operator (error token is ".0")

echo $(( 4 - 3 )) # 1
echo $(( 4 * 3 )) # 12
echo $(( 4 / 3 )) # 1
echo $(( 4 / 3.0 ))
# bash: 4 / 3.0 : syntax error: invalid arithmetic operator (error token is ".0 ")

echo $(( 2 ** 1 )) # 2
echo $(( 2 ** 2 )) # 4
echo $(( 2 ** 3 )) # 8
echo $(( 2 ** 4 )) # 16

echo $(( 2 ** 0.5 ))
# bash: 2 ** 0.5 : syntax error: invalid arithmetic operator (error token is ".5 ")

bashでは、整数計算はできるのですが、小数を扱うことはできないようです。

(bashで小数を扱う方法は後述します)

zshで再チャレンジ

上記と同じこと(+α)を、zshでやってみます。

echo $((1 + 2)) # 3 と表示される
echo $(( 1 + 2 )) # 3
echo $((1 + 2.0)) # 3.

echo $(( 4 - 3 )) # 1
echo $(( 4 * 3 )) # 12
echo $(( 4 / 3 )) # 1
echo $(( 4 / 3.0 )) # 1.3333333333333333
echo $(( 4.0 / 3 )) # 1.3333333333333333
echo $(( 4 / 3. )) # 1.3333333333333333

echo $(( 4 / 0.3 )) # 13.333333333333334
echo $(( 4 / .3 )) # 13.333333333333334

echo $(( 2 ** 1 )) # 2
echo $(( 2 ** 2 )) # 4
echo $(( 2 ** 3 )) # 8
echo $(( 2 ** 4 )) # 16

echo $(( 2 ** 0.5 )) # 1.4142135623730951
echo $(( 3 ** 0.5 )) # 1.7320508075688772
echo $(( 5 ** 0.5 )) # 2.2360679774997898

echo $(( 1.0 + 4.0 / 2.0 )) # 3.
echo $(( (1.0 + 4.0) / 2.0 )) # 2.5
echo $(((1.0+4.0)/2.0)) # 2.5

こういう面でもzshは便利ですね。

bashで小数計算をするには、bcコマンドを使う

zshと同じことをbashで行うには、bcというコマンドを使います。

echo "1 + 2" | bc # 3 と表示される
echo "1 + 2" | bc # 3
echo "1 + 2.0" | bc # 3.

echo "4 - 3" | bc # 1
echo "4 * 3" | bc # 12

echo "4 / 3" | bc # 1
echo "4 / 3.0" | bc # 1
echo "4 / 3.0" | bc -l # 1.33333333333333333333
echo "scale=0; 4 / 3.0" | bc # 1
echo "scale=1; 4 / 3.0" | bc # 1.3
echo "scale=2; 4 / 3.0" | bc # 1.33
echo "scale=3; 4 / 3.0" | bc # 1.333

echo "4.0 / 3" | bc -l # 1.33333333333333333333
echo "4 / 3." | bc -l # 1.3333333333333333

echo "4 / 0.3" | bc -l # 13.33333333333333333333
echo "4 / .3" | bc -l # 13.33333333333333333333

echo "2 ^ 1" | bc # 2
echo "2 ^ 2" | bc # 4
echo "2 ^ 3" | bc # 8
echo "2 ^ 4" | bc # 16

echo "2 ^ 0.5" | bc -l
# Runtime warning (func=(main), adr=8): non-zero scale in exponent

echo "sqrt(2)" | bc -l # 1.41421356237309504880

echo "1.0 + 4.0 / 2.0" | bc -l # 3.00000000000000000000
echo "(1.0 + 4.0) / 2.0" | bc -l # 2.50000000000000000000
echo "(1.0+4.0)/2.0" | bc -l # 2.50000000000000000000

bcは他にもいろんなことができるのですが、それはまた別の機会にしたいと思います。

※補足: bcで「2^0.5」を計算するには

指数計算を対数を使った式に置き換えることで計算可能です。詳しくは以下の記事を参考にしてください。

http://d.hatena.ne.jp/takehikom/20090327/1238101551