Bash的算術運算有以下幾種方法:
序号 | 名稱 | 文法 | 範例 |
1 | 算術擴充 | $((算術式)) | r=$((2+5*8)) |
2 | 使用外部程式 | expr 算術式 | r=`expr 4 + 5` |
3 | 使用 $[] | $[算術式] | r=$[4+5] |
4 | 使用内置指令 declare | declare -i 變量=算式式 | declare -i r=8+16 |
5 | 使用内置指令 let | let 算術式 | let r=8+16 |
第一節:算術擴充
算術擴充文法:$((算術式))
如果表達式中有變量,該變量名稱之前最好不要加$這個符号,以免該變量不存在時,造成文法的錯誤。
例如:
unset i
echo $((12+$i))
由于變量i不存在(行1),是以行2會變成:echo $((12+)),這樣文法就錯了。
但如果寫成:
echo $((12+i))
這樣可正确執行,因為 12+i 在$(())中是一個合法的算術表達式,就算變量i不存在,仍然可正确計算(結果為 12)。
如果表達式中有“變量擴充”,則要加上$,例如: echo $((${j:-8}+2))。
這裡強化一下印象:
$((12+i)) | 正确範例 |
$((12+$i)) | 當i不存在時,文法錯誤,不建議使用 |
$((12+${i})) | |
$((${j:-8}+2)) | 表達式中有“變量擴充”的正确範例 |
以下是各種簡單的算術運用:
1、加 r=$((6+5)):r的值為11。
2、減 r=$((6-5)):r的值為1。
3、乘 r=$((6*5)):r的值為30。
4、除 r=$((6/5)):r的值為1。注意,這是整除。
5、求餘數 r=$((32%3)):r的值為2。
6、遞增 1
r=6
r=$((++r))
行2,r的值加1後,在指派給r,是以,r的值遞增1,變成7。
7、遞減1
r=6
r=$((--r))
行2,r的值減1後,再指派給r,是以,r的值遞減1,變成5.
8、運算後減1
m=6
r=$((4+m--))
行2,m的值先代入6,和4做加法運算,得值為10,再指派給r。接着,m的值減1。運算結果:r=10,m=5。
如果要對變量本身做單元的算術運算,可使用 (()) 含括,這一點和 C 語言的文法很像。
如下所示:
1、指定運算
((i=168))
設定變量i的值為168
2、後置式遞增
i=168
((i++))
i的值加1,變成169。
第2行改成前置式遞增 ((++i)) 也可以。
3、後置式遞減
i=168
((i--))
i的值減1,變成167.
第2行改成前置式遞減 ((--i)) 也可以。
4、+= , -= , *= , /= 等 指派運算
i=168
((i+=60))
i+=60 的意思同于 i=i+60,即i加上60後,把運算結果再指派給i,i的值變成228。
5、三元表達式
i=168
((n=i<100?50:80))
echo $n
(()) 的使用者其實和 let 的效果是一樣的,例如:((i++)) 和 let "i++" 執行結果相同。可以把上述的 (())的用法都改用 let 來做。
第二節:使用外部程式 expr 做算術運算
外部程式 expr 本來作用,是在“标準輸出”顯示表示式的值。文法為:
expr '算術式'
例如:
expr 3 + 2
它會在螢幕上顯示 5。
利用這個特性,expr 就可以拿來當做一種算術運算的工具。而且,由于它是外部程式,和Shell的版本沒什麼關系,幾乎在各種作業系統平台上都可以執行。是以,如果注重跨平台、可移植性,在script程式的開發上可以使用expr替代其他算術方法。
在使用expr時,要特别注意“算術式”中是否含有bash shell的特殊字元,如 *、|、<、>、!、&、(、)等。如果有的話,要用 \ 予以轉義,否則會出現奇怪的錯誤資訊。
另外,在“算術式”中,運算符合操作數之間,至少要有一個以上的空格符隔開。
以下是 expr 的範例(請注意,這裡是使用一對 ` 符号含括,而不是單引号):
1、r=`expr 參數1 \| 參數2`
| 代表“或”之意。如果“參數1”存在、非空、不是0,則傳回“參數1”的值,否則,傳回“參數2”的值。由于 | 是特殊字元,是以要寫成轉義字元 \| 。
用例:
r=`expr 3 \| 0`
r的值為3。
r=`expr 0 \| 2`
r的值為2。
2、r=`expr 參數1 \& 參數2`
如果“參數1”和“參數2”皆存在、非空、不是0,則傳回“參數1”的值,否則傳回0。
r=`expr 3 \& 0`
3、加
r=`expr 4 + 5`
r的值為9。
4、減
r=`expr 4 - 5`
r的值為-1。
5、遞減1
r=5
r=`expr $r + 1`
第三節:使用$[]做算術運算
使用$[]做算術運算和$(())類似。
文法:r=$[算術式]
以下列出簡單的算術運用:
1、加:r=$[4+5]
2、減:r=$[4-5]
3、乘:r=$[4*5]
4、除:r=$[22/5] (整除)
5、求餘數:r=$[100%43],r的值為14。
6、遞增1
r=5
r=$[r+1]
第四節:使用内置指令 declare 做算術運算
文法:declare -i 變量=算式式
declare -i k
k=8+16
echo $k
行1,使用declare事先設定變量k的屬性為“整數”。
行2,由于k是整數,8+16就不再是字元串,而是一個算式,是以,bash會對它進行運算,最後把結果24指派個k。
必須注意的是:
- 算式中,運算符和操作數之間不可以有空格符,要緊密連接配接。
- 特殊符号不必使用 \ 轉義。例如:乘法*,乘法**。
- 算式中,可包含其他變量,變量之前不必加上$。
使用 declare -i 設定變量之後,加減乘除等運算,就非常直覺了:
declare -i k
k=8+16
k=16-8
k=5*3
k=22/5
k=2**3
k=100%43
declare -i j
j=k+1 #或 j=$k+1
echo $j
行3~8,分别是加、減、乘、除、乘方、求餘數等運算。
行10,設定變量j也是整數。
行11,算式中可以包含變量,但不必加上‘$’;k的變量值代入其中,加1後,指派給變量j。
第五節:使用内置指令 let 做算術運算
let 的用法也很簡單,其注意事項同 declare。
以下是let的範例:
let k=8+16
let k=16-8
let k=5*3
let k=22/5
let k=2**3
let k=100%43
let j=k+1
其意自明,這裡就不再贅述了。
另外,可以使用“空格符”讓表達式可讀性高一些,但這時,必須使用“引号”含括表達式才行,比如:
let "k = k + 5"