Shell 和其它編程語言不同,Shell 不能直接進行算數運算,必須使用數學計算命令
要想讓數學計算發揮作用,必須使用數學計算命令,Shell 中常用的數學計算命令如下表所示。
運算操作符/運算命令 | 說明 |
---|---|
(( )) | 用于整數運算,效率很高,推薦使用。 |
let | 用于整數運算,和 (()) 類似。 |
[$] | 用于整數運算,不如 (()) 靈活。 |
expr | 可用于整數運算,也可以處理字符串。比較麻煩,需要注意各種細節,不推薦使用。 |
bc | Linux下的一個計算器程序,可以處理整數和小數。Shell 本身只支持整數運算,想計算小數就得使用 bc 這個外部的計算器。 |
declare -i | 將變量定義為整數,然后再進行數學運算時就不會被當做字符串了。功能有限,僅支持最基本的數學運算(加減乘除和取余),不支持邏輯運算、自增自減等,所以在實際開發中很少使用。 |
一、Shell (( )) 的用法
雙小括號 (( )) 的語法格式為:
((表達式))
通俗地講,就是將數學運算表達式放在((
和))
之間。
表達式可以只有一個,也可以有多個,多個表達式之間以逗號,
分隔。對于多個表達式的情況,以最后一個表達式的值作為整個 (( )) 命令的執行結果。
可以使用$
獲取 (( )) 命令的結果,這和使用$
獲得變量值是類似的。
運算操作符/運算命令 | 說明 |
---|---|
((a=10+66) ((b=a-15)) ((c=a+b)) | 這種寫法可以在計算完成后給變量賦值。以 ((b=a-15)) 為例,即將 a-15 的運算結果賦值給變量 c。 注意,使用變量時不用加$ 前綴,(( )) 會自動解析變量名。 |
a=((10+66)b=((10+66) b=((10+66)b=((a-15)) c=$((a+b)) | 可以在 (( )) 前面加上$ 符號獲取 (( )) 命令的執行結果,也即獲取整個表達式的值。以 c=((a+b))為例,即將a+b這個表達式的運算結果賦值給變量c。注意,類似c=((a+b))這樣的寫法是錯誤的,不加‘((a+b)) 為例,即將 a+b 這個表達式的運算結果賦值給變量 c。 注意,類似 c=((a+b)) 這樣的寫法是錯誤的,不加`((a+b))為例,即將a+b這個表達式的運算結果賦值給變量c。注意,類似c=((a+b))這樣的寫法是錯誤的,不加‘`就不能取得表達式的結果。 |
((a>7 && b==c)) | (( )) 也可以進行邏輯運算,在 if 語句中常會使用邏輯運算。 |
echo $((a+10)) | 需要立即輸出表達式的運算結果時,可以在 (( )) 前面加$ 符號。 |
((a=3+5, b=a+10)) | 對多個表達式同時進行計算。 |
在 (( )) 中使用變量無需加上
$
前綴,(( )) 會自動解析變量名,這使得代碼更加簡潔,也符合程序員的書寫習慣。
二、Shell let命令:對整數進行數學運算
let 命令和雙小括號 (( )) 的用法是類似的,它們都是用來對整數進行運算,讀者已經學習了《Shell (())》,再學習 let 命令就相當簡單了。
注意:和雙小括號 (( )) 一樣,let 命令也只能進行整數運算,不能對小數(浮點數)或者字符串進行運算。
Shell let 命令的語法格式為:
let 表達式
或者
let "表達式"
或者
let '表達式'
它們都等價于((表達式))
。
當表達式中含有 Shell 特殊字符(例如 |)時,需要用雙引號" "
或者單引號' '
將表達式包圍起來。
和 (( )) 類似,let 命令也支持一次性計算多個表達式,并且以最后一個表達式的值作為整個 let 命令的執行結果。但是,對于多個表達式之間的分隔符,let 和 (( )) 是有區別的:
- let 命令以空格來分隔多個表達式;
- (( )) 以逗號
,
來分隔多個表達式。
另外還要注意,對于類似let x+y
這樣的寫法,Shell 雖然計算了 x+y 的值,但卻將結果丟棄;若不想這樣,可以使用let sum=x+y
將 x+y 的結果保存在變量 sum 中。
這種情況下 (( )) 顯然更加靈活,可以使用$((x+y))
來獲取 x+y 的結果。請看下面的例子:
[c.biancheng.net]$ a=10 b=20
[c.biancheng.net]$ echo $((a+b))
30
[c.biancheng.net]$ echo let a+b #錯誤,echo會把 let a+b作為一個字符串輸出
let a+b