シェルスクリプトにおける数値計算
[履歴] [最終更新] (2020/05/12 23:24:14)

概要

シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。

整数同士の計算

整数同士の四則演算にはexprコマンドを使用します。

sample.sh

#!/bin/sh
expr 1 + 1
expr 1 - 1
expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります
expr 1 / 1
expr 1 % 1

実行例

$ sh sample.sh 
2
0
1
1
0

大小比較

大小比較にはtestコマンドを使用します。

sample.sh

#!/bin/sh
CNT=0
while [ $CNT -ne 10 ]  # "ne:!=", "eq:==", "lt:<", "le:<=", "gt:>", "ge:>="
do
    CNT=`expr $CNT + 1`
    echo $CNT
done

実行例

$ sh sample.sh 
1
2
3
4
5
6
7
8
9
10

小数を含む計算

小数を含む計算のためにはbcコマンドを使用します。echoで計算時のオプション等を指定してパイプで計算式を渡します。

sample.sh

#!/bin/sh
echo "scale=3; 10/3" | bc # scaleで少数第何位まで出力するか指定可能
echo "3.0*3.333" | bc # *のクォーテーションは不要

実行例

$ sh sample.sh 
3.333
9.999

m進数からn進数への変換

m進数からn進数への変換にもbcコマンドを利用できます。echoでmおよびnを指定してパイプで変換式を渡します。

sample.sh

#!/bin/sh
echo "ibase=10; obase=2; 7" | bc # 10進数から2進数への変換

実行例

$ sh sample.sh 
111

bash 数値計算

bash の場合は expr の代わりに $(()) が利用できます。

echo $((1 * 2))
echo $((1 + 2))

set -e している場合expr の結果が 0 になるとスクリプトが停止してしまう問題を回避できます。expr の終了ステータスは、結果が 0 の場合は 1 です。

expr 1 - 1
0

echo $?
1
関連ページ
    コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin