shell 計算器的實現(xiàn)示例
簡介
shell 編程中的 $(( )) 、$[ ] 和 expr 僅支持整數(shù)運算,不支持小數(shù)運算,如果除法的結(jié)果為小數(shù),那么按取整處理。小數(shù)計算需要依賴命令,這里介紹 bc、awk 兩個命令的計算方法。
1. 整數(shù)計算
常用符號如下:
+:加法
-:減法
*:乘法
/:除法
^:冪運算
%:取余
shell 通過 $(( )) 或 $[ ] 來計算整數(shù),比如 1+1
echo $(( 1 + 1 )) echo $[ 1 + 1 ]
但如果將0作為除數(shù),那么直接報錯
如果計算中出現(xiàn)非變量的字母,那么這個字母會被當(dāng)做 0 處理
注意:$(( )) 和 $[ ] 不支持小數(shù)運算,如果除法運算的結(jié)果為小數(shù),那么系統(tǒng)自動取整
echo $(( 10 / 3 ))
括號中支持變量計算
對變量做運算(修改變量)
# 定義一個變量 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,其他計算方式同理。
除了直接使用 $(( )) 或 $[ ] 來運算,shell 還支持 expr 來運算整數(shù)(方法都一樣)
expr [數(shù)字1] [運算符號] [數(shù)字2]
2. 小數(shù)計算
由于 $(( )) 和 $[ ] 不支持小數(shù)運算,我們需要借助其他命令來實現(xiàn)。這里介紹2個命令 bc 和 awk
2.1. bc 命令計算
bc 是 Linux 中一個用于計算的命令,支持高精度的數(shù)學(xué)計算,可以進行大多數(shù)基本的數(shù)學(xué)運算,包括加、減、乘、除、取模、指數(shù)、三角函數(shù)等。
執(zhí)行 bc 會出現(xiàn)一個交互界面(quit 退出)
在這個交互界面中可以執(zhí)行數(shù)學(xué)運算,回車鍵表示 "="
在腳本中我們一般不會用到交互界面,那么可以使用 bc 結(jié)合 echo 來使用。比如計算 1+1
echo "1 + 1" |bc
使用 echo 輸出一串字符,再使用管道符傳遞給 bc 使其計算。就類似于這樣
如果不指定小數(shù)點位數(shù),除法的結(jié)果為小數(shù)也會直接取整
echo "10 / 3" |bc
如果需要顯示小數(shù)位數(shù),那么在 echo 中指定 scale=n(n表示位數(shù))
echo "scale=2; 10 / 3" |bc
2.2. awk 命令計算
awk 命令本身是用于文件操作,由于功能強大,但也支持計算。
比如計算:1 + 1
awk 'BEGIN{print 1 + 1}'
awk 本身是對文件操作,如果不指定文件需要加上 BEGIN 字符來實現(xiàn)計算。
awk 也支持小數(shù)(默認保留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 計算器的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)shell 計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux 分區(qū)初始化為物理卷,把物理卷加入卷組的方法
下面小編就為大家?guī)硪黄狶inux 分區(qū)初始化為物理卷,把物理卷加入卷組的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法
這篇文章主要介紹了編寫shell腳本將VPS上的數(shù)據(jù)備份到Dropbox網(wǎng)盤的方法,注意Dropbox在國內(nèi)訪問的網(wǎng)絡(luò)相關(guān)問題,需要的朋友可以參考下2015-07-07在linux上定期執(zhí)行命令、腳本(cron,crontab,anacron)
在linux下,如果想要在未來的某個時刻執(zhí)行某個任務(wù),并且在未來的每一個這樣的時刻里都要執(zhí)行這個任務(wù)。這篇文章主要介紹了在linux上定期執(zhí)行命令、腳本(cron,crontab,anacron)的相關(guān)知識,需要的朋友可以參考下2018-07-07