數學運算在編程中也很重要,shell對它的支持並不算好,本文整理一下shell進行數學運算的途徑,各種方法的缺點。
一、 expr命令
shell最開始處理數學表達式的命令,可以在命令行做算術運算,參數與運算符間一定要有空格,否則無法識別
expr arg1 運算符 arg2
可以將數學表達式結果賦值給一個變量
對於Linux的一些特殊字符,它無法識別,需要使用轉義字符。
由於expr命令比較笨拙,經常無法識別符號,bash引入了一種更簡單的方法執行數學表達式
二、 使用$[]做算術運算
將數學表達式放在$[]中,bash便不會將其識別爲特殊符號。
但bash shell有一個致命的缺點,它只支持整數運算,使用浮點數會報錯
三、 bash計算器bc
有幾種解決方案能處理bash只支持整數運算的問題,其中最常用的是內建bash計算器bc。
1. bc的基本用法
bc實際上是一種編程語言,它允許在命令行中輸入浮點表達式,然後解釋並計算表達式,最後返回結果。
bc能夠識別:數字(整數與浮點數)、變量、註釋、表達式、編程語句(如if-then)、函數
浮點運算由內建變量scale控制,表示希望在計算結果中保留的小數位數。如果不設置,可能會得到錯誤結果。
bc中支持定義和使用變量,可使用print命令顯示變量值,但變量僅在bc內可見
2. 在腳本中使用bc
利用管道 | 將表達式傳送給bc,並將計算結果賦值給變量
var=$(echo "options; expression" | bc)
#或
var=`echo "options; expression" | bc`
#例如
var=$(echo "scale=2; 5/2" | bc)
echo $var
也可以直接計算變量值,例如 $var1 * $var2 + $var3 * $var4
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(echo "scale=2; $var1*$var2+$var3*$var4" | bc)
echo The final answer is $var5
3. 使用內聯輸入重定向
對於複雜運算,可以使用內聯輸入重定向,直接在命令行中重定向數據,更加清晰明瞭。
var=$(bc << EOF
options
statements
expression
EOF
)
例如
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer is $var5
參考:《Linux命令行與shell腳本編程大全》