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