shell 計算器的實(shí)現(xiàn)示例
簡介
shell 編程中的 $(( )) 、$[ ] 和 expr 僅支持整數(shù)運(yùn)算,不支持小數(shù)運(yùn)算,如果除法的結(jié)果為小數(shù),那么按取整處理。小數(shù)計算需要依賴命令,這里介紹 bc、awk 兩個命令的計算方法。
1. 整數(shù)計算
常用符號如下:
+:加法
-:減法
*:乘法
/:除法
^:冪運(yùn)算
%:取余
shell 通過 $(( )) 或 $[ ] 來計算整數(shù),比如 1+1
echo $(( 1 + 1 )) echo $[ 1 + 1 ]

但如果將0作為除數(shù),那么直接報錯

如果計算中出現(xiàn)非變量的字母,那么這個字母會被當(dāng)做 0 處理

注意:$(( )) 和 $[ ] 不支持小數(shù)運(yùn)算,如果除法運(yùn)算的結(jié)果為小數(shù),那么系統(tǒng)自動取整
echo $(( 10 / 3 ))


括號中支持變量計算

對變量做運(yùn)算(修改變量)
# 定義一個變量
n=10
# 將變量+1
(( n++ ))
# 查看這個變量的結(jié)果
echo ${n}
直接對變量做計算可以直接使用 (( )),舉幾個常用的方法
(( n++ )) # 表示變量n+1 (( n-- )) # 表示變量n-1 (( n+=5 )) # 表示變量n+5 (( n-=5 )) # 表示變量n-5 (( n*=5 )) # 表示變量n*5 (( n1 = n2 + 1 )) # 表示變量n1 = 變量n2 + 1
所有的計算 n=n+1 都可以簡化成 n+=1,其他計算方式同理。
除了直接使用 $(( )) 或 $[ ] 來運(yùn)算,shell 還支持 expr 來運(yùn)算整數(shù)(方法都一樣)
expr [數(shù)字1] [運(yùn)算符號] [數(shù)字2]

2. 小數(shù)計算
由于 $(( )) 和 $[ ] 不支持小數(shù)運(yùn)算,我們需要借助其他命令來實(shí)現(xiàn)。這里介紹2個命令 bc 和 awk
2.1. bc 命令計算
bc 是 Linux 中一個用于計算的命令,支持高精度的數(shù)學(xué)計算,可以進(jìn)行大多數(shù)基本的數(shù)學(xué)運(yùn)算,包括加、減、乘、除、取模、指數(shù)、三角函數(shù)等。
執(zhí)行 bc 會出現(xiàn)一個交互界面(quit 退出)

在這個交互界面中可以執(zhí)行數(shù)學(xué)運(yùn)算,回車鍵表示 "="

在腳本中我們一般不會用到交互界面,那么可以使用 bc 結(jié)合 echo 來使用。比如計算 1+1
echo "1 + 1" |bc

使用 echo 輸出一串字符,再使用管道符傳遞給 bc 使其計算。就類似于這樣

如果不指定小數(shù)點(diǎn)位數(shù),除法的結(jié)果為小數(shù)也會直接取整
echo "10 / 3" |bc

如果需要顯示小數(shù)位數(shù),那么在 echo 中指定 scale=n(n表示位數(shù))
echo "scale=2; 10 / 3" |bc

2.2. awk 命令計算
awk 命令本身是用于文件操作,由于功能強(qiáng)大,但也支持計算。
比如計算:1 + 1
awk 'BEGIN{print 1 + 1}'
awk 本身是對文件操作,如果不指定文件需要加上 BEGIN 字符來實(shí)現(xiàn)計算。
awk 也支持小數(shù)(默認(rèn)保留5為)
awk 'BEGIN{print 10 / 3}'
指定2位小數(shù)
awk 'BEGIN{printf "%.2f", 10 / 3}'
使用變量
a=10
b=20
awk -v "a=${a}" -v "b=$" 'BEGIN{printf "%.2f", a / b}'
由于 awk 中使用的是單引號,無法轉(zhuǎn)譯變量,所以只能通過 -v 定義兩個屬于 awk 本身的變量,再執(zhí)行計算。也可以直接使用變量,但需要將 awk 外圍的單引號換成雙引號,里面的雙引號需要轉(zhuǎn)譯
a=10
b=20
awk "BEGIN{printf \"%.2f\", ${a} / $}"
也支持文件中的數(shù)據(jù)計算
【求和】
awk '{sum+=$1} END{print sum}' 文件名
【求平均數(shù)】
awk '{sum += $1} END{print sum/NR}' 文件
【求最大值】
awk 'NR==1 {max=$1} $1>max {max=$1} END{print max}' 文件
【求最小值】
awk 'NR==1 {min=$1} $1<min {min=$1} END {print min}' 文件名
【將第1列的所有值 +10 】
awk '{print $1 + 10}' 文件名
【讀取文件偶數(shù)行】
awk 'NR % 2 == 0' 文件名

到此這篇關(guān)于shell 計算器的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)shell 計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell 腳本中常用的內(nèi)置變量(Bash 內(nèi)置變量)
在 Bash 解釋器中,內(nèi)置了許多變量,這些變量的功能是解釋器自帶的,我們在編寫shell腳本時如果能靈活的使用它們,對腳本的編寫效率以及差錯大有幫助, 下面一一介紹這些變量,一起看看吧2021-05-05
Linux使用iptables實(shí)現(xiàn)屏蔽ip地址的示例詳解
netfilter/iptables(簡稱為iptables)組成Linux平臺下的包過濾防火墻,與大多數(shù)的Linux軟件一樣,這個包過濾防火墻是免費(fèi)的。本文就來利用iptables實(shí)現(xiàn)屏蔽ip地址,需要的可以參考一下2022-10-10
Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件
這篇文章主要介紹了Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件,本文先是用sed命令來實(shí)現(xiàn),發(fā)現(xiàn)不能完成需求,后使用for循環(huán)解決,需要的朋友可以參考下2015-01-01
Linux 下xargs命令詳解及xargs與管道的區(qū)別
在工作中經(jīng)常會接觸到xargs命令,特別是在別人寫的腳本里面也經(jīng)常會遇到,但是卻很容易與管道搞混淆,本篇會詳細(xì)講解到底什么是xargs命令,為什么要用xargs命令以及與管道的區(qū)別,本文通過實(shí)例給大家詳解,需要的的朋友參考下2017-04-04
利用expect命令實(shí)現(xiàn)Shell自動化交互的方法詳解
我們通過Shell可以實(shí)現(xiàn)簡單的控制流功能,如:循環(huán)、判斷等。下面這篇文章主要給大家介紹了關(guān)于利用expect命令實(shí)現(xiàn)Shell自動化交互的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12
linux shell進(jìn)度條實(shí)現(xiàn)方法
linux shell實(shí)現(xiàn)的一咱進(jìn)度條,代碼很簡單,供大家參考2013-11-11

