expr を用いた数学演算
expr 演算子の一覧
大小比較: 整数のみ比較可能で、スペースが必要。Linuxの予約語はエスケープが必要です。
a=10
b=20
expr $a \> $b
前のコマンドの実行結果を確認します。
echo $?
0が成功、それ以外は失敗を意味します。
小なり、小なりイコール、大なりイコール
expr $a \< $b
expr $a \<= $b
expr $a \>= $b
演算: 加算、減算、乗算、除算
# 加算
x=8
y=3
expr $x + $y
# 減算
z=`expr $x + $y`
echo $z
expr $x - $y
# 乗算
expr $x \* $y
# 除算
expr $x / $y
# 剰余
expr $x % $y
注意点:
二重括弧 $(()) を使った計算は、変数に代入しないとエラーになります。
# 直接出力するとエラー
$(($x+$y))
# 変数に代入する必要がある
total=$(($x+$y))
echo $total
total=$(($x*$y))
echo $total
total=$(($x-$y))
echo $total
total=$(($x/$y))
echo $total
$(()) では一部の演算子がサポートされていないため、比較演算時は expr を使用することが推奨されます。
val1=7
val2=2
val3=$(($val1=$val2))
expr $val1 = $val2
練習例
ユーザーに正の整数 num を入力させ、1+2+3+...+num の値を計算します。num が正の整数でない場合は、再入力を促します。
正の整数かどうかを判断する方法:
exprは整数のみ計算可能なので、exprを使って計算し$?の値を取得することで整数かどうかを判断できます。expr $num1 \\> 0を使って0より大きいかどうかを判断します。
# 整数でない値を expr で計算するとエラーになる
num1=12.34
expr $num1 + 1
sum.sh
#!/bin/bash
#
while true
do
read -p "正の整数を入力してください: " input_num
# 整数かどうかを判断
expr $input_num + 1 &> /dev/null
if [ $? -eq 0 ];then
# この整数が0より大きいかどうかを判断。大きい場合は1を返す
if [ `expr $input_num \> 0` -eq 1 ];then
# $total は初期化されていないため、デフォルトで0
for((j=1;j<=$input_num;j++))
do
total=`expr $total + $j`
done
echo "1+2+3+...+$input_num = $total"
# 計算が終わったらスクリプトを終了
exit
fi
fi
echo "エラー: 不正な入力です"
continue
done
スクリプトの実行
sh sum.sh
bc を用いた数学演算
bc の紹介:
bcはbashに組み込まれた計算ツールで、浮動小数点数の演算をサポートします。- 組み込み変数
scaleで精度を設定でき、デフォルトは 0 です。
bc 演算子の一覧
インタラクティブなテスト
スクリプト内でパイプラインを使って計算する
echo "15.5 * 2" | bc
精度を保持する scale=4; で区切る
echo "scale=3;10.0/3.0" | bc
bc のサンプルスクリプト
calc_bc.sh
#!/bin/bash
#
read -p "数値1: " first_num
read -p "数値2: " second_num
#num3=`echo "scale=4;$first_num/$second_num" | bc`
result=`echo "scale=4;$first_num/$second_num" | bc`
echo "$first_num / $second_num = $result"
実行
sh calc_bc.sh