一 概述
算術運算子指的是可以在程式中實現加、減、乘、除等數學運算的運算子。Shell中常用的數學運算子如下所示。
+:對兩個變數做加法。
-:對兩個變數做減法。
*:對兩個變數做乘法。
/:對兩個變數做除法。
**:對兩個變數做冪運算。
%:模數運算,第一個變數除以第二個變數求餘數。
+=:加等於,在自身基礎上加第二個變數。
-=:減等於,在第一個變數的基礎上減去第二個變數。
*=:乘等於,在第一個變數的基礎上乘以第二個變數。
/=:除等於,在第一個變數的基礎上除以第二個變數。
%=:模數賦值,第一個變數對第二個變數模數運算,再賦值給第一個變數。
在使用這些運算子時,需要注意到運算順序的問題。例如輸入下面的命令,輸出1+2的結果。echo 1+2
Shell並沒有輸出結果3,而是輸出了1+2。在shell中有三種方法可以更改運算順序。
— 用expr改變運算順序。可以用echo `expr 1 + 2`來輸出1+2的結果,用expr表示後面的運算式為一個數學運算。需要注意的是,`並不是一個單引號,而是“Tab”鍵上面的那個符號。
— 用$(())表示數學運算。可以先將運算的結果賦值給變數b,運算命令是b=$((1 + 2))。然後用echo $b來輸出b的值。將會輸出結果3。
— 用$[]表示數學運算。將一個數學運算寫到$[]符號的中括弧中,中括弧中的內容將先進行數學運算。例如命令echo $[1+2],將輸出結果3。
二 使用探索
運算式替換$[ ] 和 $(())
運算式操作命令expr
(1)有關空格
$[]表示形式告訴 shell 對方括弧中的運算式求值,也可以使用$(())
echo $[ 2 + 3 ]在方括弧中的空格並不影響對錶達式的理解即其可以寫為$[2+3],$[ 2+3],$[2 + 3],$[5**3]等形式
但expr使用時請注意空格:
如echo `expr 8 / 2` 只有這種情況加空格是對的,在緊挨著符號``的兩邊加空格也是允許的
傳回值:當運算式退出不是空null也不是0,傳回值為0
當運算式是空null或0時,傳回值為1
當運算式在文法上(或語句構成上)無效時,傳回值為2
當運算式有發生錯誤時,傳回值為3
(2)有關連續四則運算
$[ 2 +4*2 /3 ],$((2*3-5+3/2 )),`expr 8 / 2 + 3`都是對的
(3)加入改變優先順序的括弧
$[ ((2 +4)*2 -10) /5 ]可以像寫普通算式一樣使用小括弧
$((2*(5-(5+3)/2 )))也可以像寫普通算式一樣使用小括弧
,但expr是絕對不能在裡面加上括弧的,例echo ` expr ( 8 / 2 ) `是錯誤的,應這樣使用如`expr 8 / /( 2 + 2 /)`,即在()前加反斜線進行轉義
(4)兩種格式功能一樣,所有的 shell 的求值都是用整數完成
即不接受小數,如$[2.5*2]或$((3.3-2))或expr 2.5 * 3的形式,否則會給出語法錯誤
(5)$[ ] 可以接受不同基數的數字
$[ 0xa+ 071-3]使用了十六進位的0xa和八進位的071,而預設的為十進位數3
而expr不接受其它進位的數,雖然以下命令`expr 071 + 3`可以文法通過並計算,但值卻為74,即將原意輸入為八進位的71,理解為十進位數,而十六進位數直接進行語法錯誤的提示
(6)以上都是常量進行算術四則運算時的操作,對於變數的四則運算操作則如下:
foo=0;
foo=`expr $foo + 1`;echo "foo is $foo";
fly=$[3+5];
fly+=$[ $foo + 1];
fly2=$(($foo+1));
echo "foo is $foo,fly is $fly,fly2 if $fly2";
可見,$[],$(())和expr都可以對變數進行操作。
注意1:無論是左邊的變數還是右邊的運算式與等號之間不能有空格,即使是+=類的組合賦值符號與變數和運算式之間也不能有空格。
注意2:括在(( ))中的變數不需要使用美元符$,即fly2=$((foo+1));也是對的。
(7)對字元操作
expr與$[]和$(())最大的不同就是能接受字元,可以對字元進行處理如以下的三條命令
expr aaa : 'a/+'
expr abc : 'a/(./)c'
expr index abcdef cz
(8)對各別運算子號的特別處理
expr在使用乘法時,應使用如expr 8 /* 8的方式才是對的,即在shell編程和shell的終端輸入時都需要反斜線對*號進行轉義,才能正常使用乘符號。
還有冪運算子**,即使這樣的形式`expr 8 /*/* 2`也不能正常使用,我還沒找到在expr中正確的冪運算子的辦法,有哪位大俠知道,請不吝賜教!
(9)有關浮點數的計算
bash只具備基本的數學計算能力,不支援浮點數的計算,expr和let等都只支援整型計算。若需要浮點數的計算,可藉助如bc,awk或perl等工具。
使用bc,其格式為variable=$(echo "OPTIONS; OPERATIONS" | bc) ,以下有幾個例子:
1。echo "3.22*4.32" | bc
2. echo "size=4;2.34*6.77" | bc
3. xx=3.45;yy=$(echo "$xx"| bc);echo "the result is $yy";
bc,也可以有-l參數,表明調用數學庫,如術。4;漢。6;echo "$s+0.5^$i"|bc -l
做了歸納總結這後,發現原來[]即是test,而(())操作即是let操作,下面有對二者的總結性描述:
單方括弧的test命令通常用內建的test命令來測試運算式值,test命令也被連結到方括弧上。這樣,既可以使用單獨的test命令,也可以通過把表
達式用單方括弧括起來,來測試運算式的值。在用test命令或方括弧測試運算式時,運算式中的shell元字元不會被擴充。由於要對變數進行單詞分離,因
此包含空白符的字串必須用引號括起來。
雙方括弧的test命令2.x版bash中,用雙方括弧[[
]](內建的test複合命令)來測試運算式的值,其中,對變數不進行單詞分離,但可以通過元字元擴充進行模式比對。包含空白符的字串必須用引號括起
來。如果一個字串(不管含不含空白符)僅僅是在運算式中作為一個一般字元串,而不是一個模式的一部分,則它也必須用引號括起來。邏輯操作符&
&(與)和| | (或)代替了與test命令一起使用的-a和-o選項
let命令和帶雙圓括弧的算術運算 雖然test命令可以計算算術運算式的值,但讀者可能更願意使用let命令,因為let命令帶有豐富的類C操作符(bash 2.x)。let命令可以將運算式包含在一組圓括弧中來表達不同的含義。
不管使用的是test命令、複合命令還是let命令,運算式的結果都會被測試。返回零表示成功,而返回非零狀態表示失敗
這裡提到了複合test運算(雙方括弧),例子如下:
varh="hello";if [ $varh == "hello" ];then echo "hi";else echo "bye";fi;
varh="hello";if [[ $varh == "hello" ]];then echo "hi";else echo "bye";fi;
當這種情況時,雙括弧與單括弧同義,可以互換使用。
但下面情形則不可以互換:
varh="hello";if [[ $varh == [Hh]ell? ]];then echo "hi";else echo "bye";fi;
雙方括弧可以進行模式比對,它可以進行元字元的括展,也就是說可以使用元字元如*?[]等等進行模式比對。
參考文獻:
Shell編程筆記(1)-變數和運算子http://unix-cd.com/unixcd12/article_5727.html
完全手冊Linux系統下C程式開發詳解http://book.csdn.net/bookfiles/730/10073022532.shtml
test與let。http://blog.chinaunix.net/u2/81377/showart_1287413.html