SHELL指令碼攻略(學習筆記)--1.6 數學運算和bc命令,shell--1.6

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.