在腳本的編寫過程當中,最經常使用的恐怕就是$(())了。它能夠執行多種基本算術運算。這個表達式很是有用,特別是增長計數器時;而且它支持+ - * / %運算,不過不是全部的整數和小數都行。好比,下面的命令返回的是0,而不是0.5: shell
echo $((1/2))
因此當一個計算結果須要更高的精度時,這也就意味着你接受了一個挑戰。在命令行下沒有幾個好用的計算程序。除了,好比說,bc,一個不多有Unix用戶學習的怪異程序。bc程序會把本身看成一個任意精度的計算器,它使用隱晦的錯誤信息追溯到Unix的開頭,而且徹底沒有提示,並且,一旦你使用它,它就假定你已經很是明瞭你正在作什麼。但這一切都沒有關係,咱們能夠搞定。 學習
代碼: ui
#!/bin/sh # scriptbc.sh -- 返回計算結果的'bc'封裝器 if [ $1 = "-p" ]; then precision=$2 shift 2 else precision=2 # 默認爲小數點後2位 fi bc -q << EOF scale=$precision $* quit EOF exit 0
腳本如何工做:
這個腳本使用了here document方法,這個方法頗有用。標記符號<<容許你在腳本中包含後續輸入,這些後續的輸入就好像直接從輸入流中得到的同樣,在本例中,也就是容許用一種簡單的機制讓bc程序來處理命令。這一樣也是咱們第一次闡述:在一個腳本內,如何利用命令的參數來加強一個命令的靈活性。這裏,若是調用腳本時用了-p選項,它就會容許你給出一個你想要的精度。若是沒有給出,程序就默認使用scale=2。 spa
當使用bc時,明白長度(length)和精度(scale)之間的區別尤爲重要。對於bc來講,length是數字中的總的個數,而scale則是小數點後的數字個數。所以,10.25的length是4,scale是2,而3.14159的length是6,scale是5。 命令行
默認狀況下,bc的length是一個變量,但因爲它的scale是0,因此若是不加任何設置的話,bc的工做方式和$(())看起來如出一轍。幸運的是,若是你在bc中設置了scale的話,你就會發現它有許多隱藏的力量,好比: code
bc #命令行上鍵入bc bc 1.06 #輸出的bc版本 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. #系統信息 This is free software with ABSOLUTELY NO WARRANTY. #系統信心 For details type `warranty'. #系統信息 scale=10 #設置精度 (2002-1962)*365 #給出計算表達式 #上面算式的結果 /7 #再給出一個算式 .7142857142 #上面算式的結果 quit # 退出bc程序
爲了容許從命令行訪問bc,封裝腳本必須禁止Copyright內容的輸出。就算他們的輸入不是來自終端(標準輸入),大部分bc版本也知道應該禁止頭部Copyright的輸出。封裝器還將scale設置爲一個明確的值,給bc程序傳了表達式,而後使用quit命令退出。 ip
運行腳本:
要運行這個腳本,只要給腳本程序一個數學表達式做爲參數便可。 ci
運行結果: 數學
scriptbc.sh 14600/7 2085.71 scriptbc.sh -p 10 14600/7 2085.7142857142