天天看點

Shell入門教程:算術運算

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"