簡介 Bash所支持的算術運算和C語言是一樣的,這裡指的是操作符(operator)以及它們的優先順序(precedence)、結合性(associativity)和值,詳見Shell Arithmetic (Bash Reference Manual)。 註意:如果乘號“*”在某些場景中失效,有可能 ...
簡介
Bash所支持的算術運算和C語言是一樣的,這裡指的是操作符(operator)以及它們的優先順序(precedence)、結合性(associativity)和值,詳見Shell Arithmetic (Bash Reference Manual)。
註意:如果乘號“*”在某些場景中失效,有可能是它被解釋成了通配符,可嘗試對其轉義。
1+2=3
在上面這個簡單的算術運算中,1和2叫做操作數/運算元(operand),“+”加號叫做操作符/運算符(operator),1+2整個叫做算術表達式(arithmetic expression),對於算術表達式的求值過程叫做evaluate。
在bash腳本編程中,變數的預設類型是字元串型,因此是無法直接執行算術運算的。
[root@c7-server ~]# num1=3 [root@c7-server ~]# num2=4 [root@c7-server ~]# echo $num1+$num2 3+4
即便是使用declare命令顯式聲明變數為整型,也是不行的。
[root@c7-server ~]# declare -i num1=3 [root@c7-server ~]# declare -i num2=4 [root@c7-server ~]# echo $num1+$num2 3+4
在bash中,想要支持算術運算有以下四種方式:
方法一:內置命令let
let arg [arg ...]
每個arg,都是一個算術表達式。
[root@c7-server ~]# num1=5 [root@c7-server ~]# num2=10 [root@c7-server ~]# let sum=$num1+$num2 [root@c7-server ~]# echo $sum 15
一般都會使用一個變數來存儲算術表達式的結果,let命令本身是不會將算術表達式的結果返回的。
[root@c7-server ~]# let $num1+$num2
[root@c7-server ~]#
方法二:$[ARITHMETIC EXPRESSION]
這種方式,馬哥有提到,但是在bash的手冊中似乎沒找到。應該是一種非官方的方式,慎用。
[root@c7-server ~]# sum=$[$num1+$num2] [root@c7-server ~]# echo $sum 15
方法三:Bash算術展開
這個是bash自身支持的shell展開中的一種。Arithmetic Expansion (Bash Reference Manual)
$(( ARITHMETIC EXPRESSION ))
[root@c7-server ~]# sum=$(($num1+$num2)) [root@c7-server ~]# echo $sum 15
方法四:外部命令expr
需要使用命令替換的方式來賦值。
[root@c7-server ~]# expr $num1 + $num2 15 [root@c7-server ~]# sum=$(expr $num1 + $num2) [root@c7-server ~]# echo $sum 15
操作符的兩邊需要有空格,不然操作符無法被正確解釋。
[root@c7-server ~]# expr $num1+$num2 5+10
總結
內置命令let和shell展開中的算術展開是bash所自帶的算術運算方式,比較推薦使用這類方式;外部命令expr是來自於CentOS所提供的程式包coreutils;最後的$[...]沒有找到其來源,可以不使用它。
在本實例中只展示了簡單的加法運算,在實際使用當中會比較複雜,建議用戶可使用一種方式(如算術展開)來熟練即可。