總第6篇
Bash中的數學運算并不如其他語言般簡便,因為Bash把所有變量都視作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2。
為了解決這一問題,有如下幾種方案。
## 運算符[ ]
~~~
a=2
b=3
c=$[a+b]
d=$[a-b]
e=$[a*b]
f=$[a/b]
g=$[a%b]
~~~
$符只是取變量值的意思。中括號和里面的表達式可以視作一個變量。在中括號中引用變量可以直接使用變量名,也可以使用$加變量名。比如:
`c=$[$a+$b] `
當然,你可以直接使用字面值:
~~~
c=$[2+3]
d=$[2-3]
e=$[2*3]
f=$[2/3]
~~~
需要注意的是:
- 該運算只支持整數,如果a或者b是小數,則會報錯。運算結果是小數的也會自動取整。
- 該運算[ ]的操作符(+-*/)和變量之間可以有空格。即可寫作c=$[a + b]
## 運算符(())
其用法和[ ]類似,注意事項也差不多。
## expr及其反引用
### 普通計算
expr是一個外部命令(非Bash本身的命令),所以它是獨立與Bash的,同樣可以在其他Shell中使用。
~~~
a=2
b=3
expr $a + $b
expr $a - $b
expr $a \* $b
expr $a / $b
expr $a % $b
~~~
需要注意的是:
- 操作符和操作數之間**一定要**有空格間隔
- 操作數(即變量)前必須有$符
- 乘號*,要用反斜杠\進行轉義
- 該命令會將計算結果打印到標準輸出
- 僅支持整數運算
- 也可以直接使用數字的字面值
expr除了支持以上運算外,還支持其他運算,大家可以自行 man expr來查看。
### 賦值
那么如何將expr的計算結果賦值給一個變量呢?答案是:反引用。
我在[《變量及其初始化》](http://blog.csdn.net/guodongxiaren/article/details/38402577#t8)一節中介紹過用命令替換初始化的概念了。反引用只是命令替換方式的一種而已。
~~~
c=`expr $a + $b`
~~~
## 用bc進行浮點數運算
### 基本格式
以上我們介紹的各種數值計算方案,不管是shell內部的還是外部的,都有一個問題,那就是不支持小數運算。這應該是shell本身的使用環境所決定的,實際在腳本中進行小數運算的情況可能并不多。
如果我們想進行浮點數的運算該怎么辦呢?答案是利用外部工具(或者說命令)bc。bc是一個交互式的計算器。你可以在shell中鍵入bc來進入bc的命令提示符。但同樣bc也支持寫入到腳本中來進行數值計算。這需要用到管道,所謂管道就是將前一個命令的標準輸出,作為標準輸入傳遞給后面的命令。關于管道的更多概念,在以后講IO操作的時候會提及。
~~~
echo '45.36-22.33'|bc
~~~
單引號雙引號,這里無所謂。實現的過程就是將一個數學表達式傳遞給bc這個計算器。然后bc會將結果打印到標準輸出。
### 設置精度
浮點運算,有一個很重要的概念就是精度。bc這里的精度指的的是小數的位數。在使用bc來進行除法運算的時候,你會發現默認是取整的,即沒有小數部分。
比如:echo '2/3'|bc,它輸出的是0。因為bc的默認精度是0。你可能會想到的解決方案是:echo '2.0/3'|bc。但是輸出結果依舊是0。
其他運算,比如加、減和乘。都會自動取操作數中的最大精度為輸出結果的精度。
~~~
echo '2.0*3.00'|bc
echo '2.25+4.5'|bc
echo '5.66-7.888'|bc
~~~
輸出結果為:
~~~
6.00
6.75
-2.228
~~~
但是除法不行,你必須手動設置。
~~~
echo 'scale=3;2/3'|bc
.666
~~~
.666為輸出的結果。因為設置了精度scale=3。前導0會被忽略。
bc功能強大,你甚至能直接利用bc來進行進制轉換。
### 進制轉換

obase為輸出的進制,ibase為輸入的進制。
## 自增自減
C類語言中都支持自增自減操作。即a++,b--,c+=2,d-=3這種類型的計算。其含義就不再介紹了。
進行自增自減運算需要注意的有兩點:
1. 操作數必須是變量
1. 操作數必須是整數
Bash中要實現這一功能需要借助命令***let***(內部命令)。

本系列(玩轉Bash腳本)更多文章,請訪問:[http://blog.csdn.net/column/details/wanbash.html](http://blog.csdn.net/column/details/wanbash.html)