ユーニックス総合研究所

  • home
  • archives
  • bash-arithmetic

Bashで四則演算を計算する

  • 作成日: 2020-08-21
  • 更新日: 2023-12-24
  • カテゴリ: Bash

Bashで四則演算を計算する

Bash(バッシュ)で計算、演算をする方法を解説します。
Bashでは計算式を算術式と言います。

算術式は↓のように書きます。

((算術式))  

または  

$((算術式))  

この記事ではBashの算術式について具体的に↓を見ていきます。

  • Bashとは?
  • 算術とは?
  • 算術式の実行
  • 算術式の展開
  • 算術式の使用例

Bashとは?

この記事ではBash(バッシュ)の計算、算術式を扱います。
そもそもBashとはいったいなんなのか? というところの話になります。

Bashとはシェルです。
そして、BashスクリプトというのはBashの文法で書かれたプログラムのことです。

シェルとは開発者が対話的に操作して、OSに命令を送るソフトウェアのことです。
命令とはたとえばファイルを開けとか、ファイルの名前を変更しろ! とか、ネットワーク通信してデータ取ってこい! とかそういう命令です。
シェルが立ち上がるとコマンドの入力を促されます。
このコマンドがシェルに送る命令です。

シェルはいくつもありますが、Bashはその数あるシェルの中の1つです。
Shというシェルがあって、それをパワーアップさせたのがBashです。

Bourne-again shell(ボーン・アゲイン・シェル )の頭文字をとってBashと付けられました。
「生まれ変わったシェル」という意味ですね。

シェルは関数を定義したりfor文でループを書いたり、変数を定義したりできます。
いわばそういった言語機能が本体で、対話的な操作の画面はおまけみたいなところがありますが、言語の機能を使ってBashのスクリプトを書くことが可能です。
今回紹介する算術式はそういったBashの言語機能の1つです。

算術とは?

算術とは計算のことです。
プログラムでは、数値計算を必要によって行う必要があります。
計算内容は足し算だったり、引き算だったり、掛け算だったり、割り算だったりします。

パソコンは計算機なので、パソコンを操るプログラミング言語で計算ができないというのはナンセンスな話になります。
多くのプログラミング言語ではこの計算を行うための機能がそなわっています。

Bashはシェルでありスクリプト言語ですが、もちろんこのBashにも計算を行う機能がそなわっています。
Bashの算術は一般的なプログラミング言語のそれに比べると変わった書き方をします。
しかし慣れるとすぐに使えるようになります。

Bashで計算が行えるようになると、いろいろなスクリプトを書けるようになります。
コマンドを使うだけだったスクリプトから、少し高度な計算処理を行うスクリプトを書けるようになります。
Bashスクリプトを扱う開発者としては、ぜひとも覚えておきたい機能の1つです。

今回あつかう基本的な算術は↓のとおりです。

  • 足し算
  • 引き算
  • 掛け算
  • 割り算
  • 剰余
  • 階乗
  • インクリメント
  • デクリメント

↑の算術はどれもプログラミングではよく使う算術です。
これらの算術を押さえておくことでBashスクリプトの書き方がまた一歩うまくなるでしょう。

算術式の実行

Bashでは式を(())で囲むと計算することが出来ます。

((1 + 1))  # 足し算  
((2 - 3))  # 引き算  
((3 * 3))  # 掛け算  
((4 / 2))  # 割り算(割り切れない場合は小数点以下がなくなる)  
((5 % 2))  # 剰余  
((10 ** 2))  # 階乗  

↑のように(())で式を囲むと、その(())の中の式が実行されます。
↓のように変数に対する計算も可能です。

a=1  
b=2  
((a + b))  
((a++))  
((b--))  

(()), $(())内の変数の参照は変数の$を省略することができます。
$をつけてもかまいません。
かまいませんが、変数の頭に$を付けると、変数のインクリメントなどでパースが失敗することがあるので、つけないほうがいいでしょう。

算術式の展開

(())だけでは計算結果は参照できません
計算結果を参照するには$(())を使います。
↓が$(())で計算結果を参照している例です。

echo $((1 + 1))  # 足し算  
# 2  

echo $((2 - 3))  # 引き算  
# -1  

echo $((3 * 3))  # 掛け算  
# 9  

echo $((4 / 2))  # 割り算(割り切れない場合は小数点以下がなくなる)  
# 2  

echo $((5 % 2))  # 剰余  
# 1  

echo $((10 ** 2))  # 階乗  
# 100  

↑のように$(())を使うと(())内の計算結果を参照できます。
↑の例ではechoで計算結果を参照して出力しています。

$(())を使う場合は計算結果を変数に入れることが出来ます。

a=1  
b=$((++a))  
echo $b  
# 2  

exprコマンドで計算することもできますが、こちらは(())$(())に比べて動作が遅いため(プロセスを起動しているからですね)、なるべくこちらの算術を使うようにした方が良いでしょう。

算術式の使用例

(()), $(())の使用例です。
Bashスクリプトで算術式が使えると、書けるスクリプトがぐっと多くなります。

for文を回してターゲットを見つける

target=2  

for ((i=0; i<4; )); do  
    same=$((i == target))  
    if [ $same -ne 0 ]; then  
        echo ターゲット$iが見つかりました   
    fi  
    ((i++))  
done  
# ターゲット2が見つかりました  

$((i == target))という算術式展開で、for文の添字とtarget変数を比較しています。
比較演算の結果は、真が1, 偽が0になります。

if文で$same変数が0じゃない、つまり真のときに「ターゲット$iが見つかりました」と表示します。

↑の場合、後置インクリメントは無理やり使ってる感があります。
for文の中に入れるのが普通と言えます。

1~100の総和を計算する

1~100までの総和を計算します。

sum=0  

for i in $(seq 1 100); do  # $(コマンド)でコマンドの出力を取得する(コマンド置き換え)  
    ((sum += i))  
done  

echo $sum  

$(seq 1 100)というのはコマンドseqの結果を$()で参照しています。
これを「コマンド置き換え」と言います。
置き換えられた結果、for文には1から100までの値が渡されて、ループが回ります。
その添字の値を変数sumに加算して総和を求めています。

問題

Q1: Bashの計算で、算術式を展開するときに使うものを答えよ

  1. <<>>
  2. (())
  3. $(())

Q2: Bashの計算で、(())$(())違いを答えよ

  1. 計算結果を展開する
  2. 計算結果をファイルに保存する
  3. 計算結果を指定ホストに送信する

Q3: $(())exprコマンドではどちらのほうが速いか答えよ

  1. expr
  2. $(())
  3. どちらも同じ速度

答え

Q1: 3
Q2: 1
Q3: 2