コマンドライン(Bash)で簡単な整数の計算を行うには、「$((算術式))」を使います。
$ echo $((1 + 1)) # 足し算
2
$ echo $((2 - 1)) # 引き算
1
$ echo $((10 * 10)) # かけ算
100
$ echo $((6 / 2)) # 割り算(割り切れない場合は小数以下が消える)
3
$ echo $((7 % 3)) # 剰余
1
$ echo $((10 ** 10)) # 階乗
10000000000
「$((算術式))」は「算術式展開」と呼ばれ、Bashが算術式を解釈→計算する→計算結果に置き換えてコマンドを実行する、という動作をします。なので、実行するコマンドを問わず用いることができます。たとえば、実用的な例ではありませんが、以下のように実行することもできます。
$ ls test$((1 + 1)).sh
test2.sh
この時、Bashは「$((1 + 1))」を計算し、「2」に置き換えて実行します。なので、「ls test2.sh」と実行していることと同じ、というわけです。
以下のシェルスクリプトのように、「$((算術式))」の中で変数を使うこともできます。
#!/bin/bash
DIV_NUM=7
i=0
for i in $(seq 0 10000) # 「$(コマンド)」はコマンドの出力と置き換えられる(コマンド置換)
do
if [[ $((i % DIV_NUM)) -eq 0 ]]; then
echo $i を $DIV_NUM で割るとちょうど $((i / DIV_NUM)) になります。
fi
((i++)) # 頭に「$」を付けない場合は計算結果が展開されない
done
「$((算術式))」の中では、上の例のように変数の頭の「$」を省略できます(書いても構いません)。また、例の中にある「((i++))」のように、頭に「$」をつけずに「((算術式))」と記述することもできます(算術式評価)。この場合、算術式は実行されますが、結果は展開されません。上の例だと、変数iをインクリメント(プラス1)します。
なお「$[算術式]」と記述することもできます。しかし、これは古い書き方で、将来的に使えなくなる可能性もあります。なので、「$((算術式))」を用いるようにしたほうが良いでしょう。
コマンドラインで計算を行う方法として、「expr 算術式」が紹介されることもあります。しかし、「$((算術式))」を用いたほうが高速です。とくに、上の例のようにループで何度も計算を行う場合、大きな差が出てきます。そのため、通常は「$((算術式))」使ったほうが良いでしょう。
ただし、「$((算術式))」だと小数を含む計算はできません。より複雑な「bc」コマンドを使ってください。以下の記事で解説しています。
コメント
誤: 少数
正: 小数
ですよ。
ご指摘ありがとうございます。修正しました。