shell數值計算相關命令:bc、expr、let
let、expr無法進行浮點運算;bc、awk可以進行浮點運算,bc的除法是地板除,awk的除法是精確的。
bc、expr可直接顯示計算結果;let丟棄計算結果,可傳遞結果到變量。
數字和運算符之間有無空格,expr->必須有空格,let->不能有空格,bc->有無空格均可
1)expr
@數字和運算符之間要有空格
[root@xxx ~]# expr 200+1
200+1
[root@xxx ~]# expr 200/1
200/1
@加減乘除,注意乘法"\*"
[root@xxx ~]# expr 200 + 1
201
[root@xxx ~]# expr 200 - 1
199
[root@xxx ~]# expr 200 * 2
expr: syntax error
[root@xxx ~]# expr 200 \* 2
400
[root@xxx ~]# expr 200 / 2
100
[root@xxx ~]# expr 200 + 2 \* 2
204
@運算數得是整數
[root@xxx ~]# expr 20.0 + 2 \* 2
expr: non-integer argument
2)bc
@加減乘除
[root@xxx ~]# echo 30+1 | bc
31
[root@xxx ~]# echo 30-1 | bc
29
[root@xxx ~]# echo 30*2 | bc
60
[root@xxx ~]# echo 30/2 | bc
15
@可以進行浮點運算
[root@xxx ~]# echo 30.2+1 | bc
31.2
@除法是地板除
[root@xxx ~]# echo 30.2/2+1 | bc
16
[root@xxx ~]#
3)let
@數字和運算符之間不能有空格
[root@xxx ~]# let i=40 + 3
-bash: let: +: syntax error: operand expected (error token is "+")
[root@xxx ~]# let i= 40+3
-bash: let: i=: syntax error: operand expected (error token is "=")
@加減乘除
[root@xxx bin]# let i=40+3
[root@xxx bin]# echo $i
43
[root@xxx bin]# let i=40-3
[root@xxx bin]# echo $i
37
[root@xxx bin]# let i=40*3
[root@xxx bin]# echo $i
120
[root@xxx bin]# let i=40/3
[root@xxx bin]# echo $i
13
@運算數得是整數
[root@xxx bin]# let i=40.3/3
-bash: let: i=40.3/3: syntax error: invalid arithmetic operator (error token is ".3/3")
[root@xxx bin]#
4)awk
[root@xxx ~]# i=20
[root@xxx ~]#
[root@xxx ~]# i=$(echo "$i 6" | awk '{print $1+$2;}')
[root@xxx ~]#
[root@xxx ~]# echo $i
26
[root@xxx ~]# i=$(echo "$i 6" | awk '{print $1+$2}')
[root@xxx ~]# echo $i
32
[root@xxx ~]# i=$(echo "$i 6.6" | awk '{print $1+$2}')
[root@xxx ~]# echo $i
38.6
[root@xxx ~]#
5)shell腳本中,給變量賦值可以使用反引號或者$()
test.sh內容如下,
echo "initial value for i is 1."
echo "case1"
i=1
echo $i+1
echo "case2-1"
i=1
i=`expr $i+1`
echo $i
echo "case2-2"
i=1
i=$(expr $i+1)
echo $i
echo "case3-1"
i=1
i=`expr $i + 1`
echo $i
echo "case3-2"
i=1
i=$(expr $i + 1)
echo $i
echo "case4"
i=1
((i=$i+1))
echo $i
echo "case5"
i=1
((i++))
echo $i
echo "case6"
i=1
let i=i+1
echo $i
echo "case7"
i=1
let i++
echo $i
echo "case8"
i=1
i=$[i+1]
echo $i
執行結果如下,
[root@xxx ~]# ./test.sh
initial value for i is 1.
case1
1+1
case2-1
1+1
case2-2
1+1
case3-1
2
case3-2
2
case4
2
case5
2
case6
2
case7
2
case8
2