LinuxやUNIXのシェルでよく利用されるbashで、四則演算や割り算のあまりを求めるといったやり方について。
bashでは、「$(( 計算文 ))」のように記述することで、簡単な計算を行うことができる。

四則演算

$(( 値1 + 値2 )) # 足し算
$(( 値1 - 値2 )) # 引き算
$(( 値1 * 値2 )) # 掛け算
$(( 値1 / 値2 )) # 割り算
[root@BS-PUB-CENT7-01 ~]# #足し算
[root@BS-PUB-CENT7-01 ~]# echo $(( 20 + 2 ))
22
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 引き算
[root@BS-PUB-CENT7-01 ~]# echo $(( 20 - 2 ))
18
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 掛け算
[root@BS-PUB-CENT7-01 ~]# echo $(( 20 * 2 ))
40
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 割り算
[root@BS-PUB-CENT7-01 ~]# echo $(( 20 / 2 ))
10

割り算のあまり(剰余)を求める

剰余を求める場合は、「$(( 値1 % 値2))」と記述することで、値1を値2で割ったときの余りを求めることができる。

$(( 値1 % 値2 ))
[root@BS-PUB-CENT7-01 ~]# # 剰余を求める
[root@BS-PUB-CENT7-01 ~]# echo $(( 20 % 3 ))
2
[root@BS-PUB-CENT7-01 ~]# echo $(( 21 % 4 ))
1

階乗を求める

階乗を求める場合は、以下のように「$(( 値1 ** 値2 ))」と記述することで求めることができる。

$(( 値1 ** 値2 ))
[root@BS-PUB-CENT7-01 ~]# echo $(( 3 ** 2 ))
9
[root@BS-PUB-CENT7-01 ~]# echo $(( 3 ** 4 ))
81

偶数か奇数かを判定する

対象の数字が偶数か奇数かを判定場合は、以下のように「$(( 値1 & 1 ))」と記述することで、奇数は1、偶数は0として返ってくる。

$(( 値1 & 1 ))
[root@BS-PUB-CENT7-01 ~]# echo $(( 3 & 1 ))
1
[root@BS-PUB-CENT7-01 ~]# echo $(( 195 & 1 ))
1
[root@BS-PUB-CENT7-01 ~]# echo $(( 192 & 1 ))
0

その他、コマンドでこういった計算をする場合は、以下のコマンドが使える。

exprコマンド

簡単な計算であれば、exprコマンドを使うことで行うことができる。
基本的な書き方はbashでの計算方法と同じだ。

[root@BS-PUB-CENT7-01 ~]# # 足し算
[root@BS-PUB-CENT7-01 ~]# expr 20 + 2
22
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 引き算
[root@BS-PUB-CENT7-01 ~]# expr 20 - 2
18
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 掛け算
[root@BS-PUB-CENT7-01 ~]# expr 20 \* 2
40
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 割り算
[root@BS-PUB-CENT7-01 ~]# expr 20 / 2
10
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 割り算の余り(剰余)
[root@BS-PUB-CENT7-01 ~]# expr 19 % 4
3

bcコマンド

より複雑な計算をさせたい場合なら、書き方は多少面倒にはなるがbcコマンドを利用するとよいだろう。
bcで計算を行うには、bcを引数なしで実行し対話モードで計算式を渡すか、echoで計算式を出力してそれをパイプで渡してやるとよいだろう。

[root@BS-PUB-CENT7-01 ~]# # 足し算
[root@BS-PUB-CENT7-01 ~]# echo "20 + 2" | bc
22
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 引き算
[root@BS-PUB-CENT7-01 ~]# echo "20 - 2" | bc
18
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 掛け算
[root@BS-PUB-CENT7-01 ~]# echo "20 * 2" | bc
40
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 割り算
[root@BS-PUB-CENT7-01 ~]# echo "20 / 2" | bc
10
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 割り算の余り(剰余)
[root@BS-PUB-CENT7-01 ~]# echo "19 % 4" | bc
3

上のような簡単な計算のほか、length()やsin()といった関数を用いて数字の桁数や小数点以下の値の桁数、sinやcosといった値についても求めることができる。

2016/11/02 追記

bashでは、「$(( ~ ))」の代わりに、「$[ ~ ]」で計算することもできる。
(zshでも同様のことができる。なお、dashおよびkshではできなかった。)

blacknon@BS-PUB-UBUNTU-02:~$ echo $0
-bash
blacknon@BS-PUB-UBUNTU-02:~$ echo $[ 1 + 2 + 3 ]
6