SHELL指令碼攻略(學習筆記)--1.6 數學運算和bc命令,shell--1.6
本文目錄:
1.6.1 基本整數運算
1.6.2 bc命令進階算術運算
使用let、$(())或$[]進行基本的整數運算,使用bc進行進階的運算,包括小數運算。其中expr命令也能進行整數運算,還能判斷參數是否為整數,具體用法見expr命令全解。
1.6.1 基本整數運算
[root@xuexi tmp]# str=10[root@xuexi tmp]# let str=str+6 # 等價於let str+=6[root@xuexi tmp]# let str-=5 # 等價於let str=str-5[root@xuexi tmp]# echo $str11
如果想在命令列中做計算,則可以使用$(())或$[]。
[root@xuexi ~]# str=10[root@xuexi ~]# echo $((str+=6))16[root@xuexi ~]# echo $[str=str-6]10
當然,在為變數賦算術值的時候也可以使用$(())和$[]。
[root@xuexi ~]# str=10[root@xuexi ~]# str=$((str+=6));echo $str16[root@xuexi ~]# str=$[str-=6];echo $str10
其實,在算數計算過程中,等號右邊的變數是可以帶上$符號的,但等號左邊的變數不允許帶上$符號,因為它是要操作的變數,不是引用變數。例如:
[root@xuexi ~]# let str=$str-1 # 等價於let str=str-1[root@xuexi ~]# str=$(($str-1)) # 等價於str=$((str-1))[root@xuexi ~]# srt=$[$str-1] # 等價於str=$[str-1][root@xuexi ~]# echo $((str=$str-1)) # 等價於echo $((str=str-1)),但不能寫成echo $(($str=str-1))[root@xuexi ~]# echo $[str=$str-1] # 等價於echo $[str=str-1],但不能寫成echo $[$str=str-1]
還可以自增、自減運算。"++"和"--"表示變數自動加1和減1。但是位置不同,返回的結果是不同的。
x++:先返回結果,再加1
++x:先加1再返回結果
x--:先返回結果,再減1
--x:先減1再返回結果
假如x的初始值為10,則echo $[x++]將顯示10,但在顯示完後(即返回結果之後),x的值已經變成了11,再執行echo $x將返回11。
[root@xuexi ~]# x=10;echo $((x++));echo $x1011
如果此時再echo $[x++]仍將返回11,但此時x已經是12了。
[root@xuexi ~]# echo $((x++));echo $x1112
再將x變數的初始值初始化為10,則echo $[++x]將顯示11,因為先加1後再賦值給x,echo再顯示x的值。++x完全等價於x=x+1,它們都是先加1後賦值。
[root@xuexi ~]# x=10;echo $((++x));echo $x1111
同理自減也是一樣的。
因此,在使用自增或自減進行變數賦值時,需要注意所賦的值是否加減立即生效的。例如:
[root@xuexi ~]# x=10;y=$((x++));echo $y;echo $y1010
因為y=$((x++))賦給y的值是加1前的值,雖然賦值結束後,$((x++))已經變成11,但這和y無關。
所以,對於自增自減類的變數賦值應該使用先計算再顯示的"++x"或"--x"的方式。
[root@xuexi ~]# x=10;y=$((++x));echo $y;echo $y1111
總結下數值變數的賦值運算的方法:
let i=i-1
let i=$i-1
let i-=1
i=$((i-1))
i=$(($i-1))
i=$[ i - 1 ]
i=$[ $i - 1 ]
echo $((i=i-1))
echo $((i=$i-1))
1.6.2 bc命令進階算術運算
bc可用於浮點數的計算,是linux中的計算機。
以下是一個基本的功能樣本:
[root@node1 ~]# bcb 1.06.95 # 首先輸出bc的版本資訊,可以使用-q選項不輸出頭部資訊Copyright 1991-1994, 197, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'.pie=3.1415 # 可以變數賦值pie*3*3 # 運算時不需要空格28.2735r=3pie*r*r28.2735pie*r^2 # 可以使用冪次方28.2735r=3 /* 將半徑設定為3 */ # 還可以使用C語言風格的注釋
輸入quit命令可以退出bc計算機。
還支援自增和自減的功能。
[root@node1 ~]# bc -qr=3r++3r++4++r6++r7--r6
bc運算器有一個內建的變數scale,用於表示計算的精度,預設精度為0,所以除法運算的預設結果是整數。
13/(1+3)3scale=313/(1+3)3.250
更人性化的功能是可以通過命令替換來實現批處理模式的計算。
它的一般格式參考如下:
var=`echo "option1;option2;...;expression"|bc`
其中options部分一般設定精度scale,和變數賦值,expression部分是計算運算式,最後將它們放在反引號中賦值給變數。如:
[root@node1 ~]# area=`echo "scale=2;r=3;3.1415*r*r"|bc`[root@xuexi ~]# echo $area28.2735
由於是在命令列中指定,所以這樣的使用方式限制較多。bc接受使用here string和here document的方式接收參數。最常做法是將它們放置於指令碼中。
#!/bin/bash# script for calculate something var1=hahavar2=hehe value=`bc<<EOF # 在反引號中使用here string的方式scale=3r=33.1415*r*rEOF`echo $value
以下是計算1+2+...+10的幾種不同方式,要求輸出在螢幕上的結果為"1+2+3+4+5+6+7+8+9+10=計算結果",這是非常不錯的例子。
[root@node1 tmp]# echo $(seq -s "+" 10)=`seq -s "+" 10|bc`1+2+3+4+5+6+7+8+9+10=55
[root@node1 tmp]# echo $(seq -s "+" 10)=$((`seq -s "+" 10`))1+2+3+4+5+6+7+8+9+10=55
[root@node1 tmp]# echo $(seq -s "+" 10)=$(seq -s " + " 10|xargs expr) # 注意"+"和" + "1+2+3+4+5+6+7+8+9+10=55
回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7231870.html