[Shell] Shell 中的算術

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   io   for   ar   

  Shell 指令碼變數預設是作為字串處理,而不是數字,這使得在 Shell 指令碼做數學運算顯得較為複雜。在保持指令碼編程規範和更好的算術支援方便,Perl 和 Python 會是更好的選擇。但是你仍然可以選擇在 Shell 中進行算術。事實上,過去許多年來,Unix 已經增加多種特性來支援數文書處理。

備忘:正如下文所示,一些協助處理數位命令在某些方便表現仍不夠完善,例如運算子周圍的空格。

 

declare

  在 Shell 中你無需提前聲明變數,但如果你提前聲明一個整型變數,那麼以下樣本將展示整型變數是如何工作的:

$ n=6/3$ echo $n6/3$ declare -i n$ n=6/3$ echo $n2

 

  如果你決定使用一個已有的程式或者內建命令來處理算術,那麼你完全可以不用 declare 語句。

 

expr

   expr 是一個比較老的 Unix 程式可以用來算術求值。expr 在 Bourne Shell 時期開始廣為人知,因為 Bourne Shell 不支援算術。但在 Bash 和 Korn Shell 中,一般不再使用它。使用 expr 時,仍然是把變數當作一個字串來處理,並且它對空格處理也不夠靈活,要求在運算式中使用空格分隔變數。

$ z=5$ z=`expr $z+1`   ---- Need spaces around + sign.$ echo $z5+1$ z=`expr $z + 1`$ echo $z6

 

let

   Bash 和 Korn Shell 內建處理算術的命令是 let。它對空格處理也有點不靈活,和 expr 相反,它要求變數之間不能使用空格。

$ let z=5$ echo $z5$ let z=$z+1$ echo $z6$ let z=$z + 1     # --- Spaces around + sign are bad with let-bash: let: +: syntax error: operand expected (error token is "+")$let z=z+1         # --- look Mom, no $ to read a variable.$echo $z7

 

  如果不想為空白格煩擾,那麼請使用雙括弧來包裹整個語句,這樣有無空格都可以順利求值。

$ ((e=5))$ echo $e5$ (( e = e + 3 ))$ echo $e8$ (( e=e+4 ))  # -- spaces or no spaces, it doesn‘t matter$ echo $e12

 

bc

    如果要處理浮點數字或者更複雜一點的運算怎麼辦?let 命令不能支援浮點數字,因此需要使用 bc 命令,但是你必須將整個運算運算式當作一個字串來交給 bc 處理。

 

  如果你使用 let 命令處理浮點會得到以下錯誤樣本:

$let r=3.5-bash: let: r=3.5: syntax error in expression (error token is ".5")$(( r = 3.5 ))-bash: ((: r = 3.5 : syntax error in expression (error token is ".5 ")

 

  bc 命令可以處理任意精度的數學運算。bc 有互動模式和 shell 指令碼命令兩種模式。在互動模式下,使用 cntrl-d(EOF) 或者 quit 指令退出。

 

  互動模式:

$ bcbc 1.06Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty‘.3 + 25obase=2121100<cntrl-d>

 

  指令碼模式:

$r=3.5$s=`echo "$r + 2.2" | bc`$echo $s5.7$ z = `echo $z + 1 | bc`-bash: z: command not found                # -- spaces around = sign are bad                                (shell thing, not bc)$ z=`echo "$z + 1" | bc`$ echo $z8$ z=`echo "$z+1" | bc`  -- spaces don‘t matter with bc$ echo $z9

 

數字布爾值運算式

    INTEGER1 -eq INTEGER2  : INTEGER1 等於 INTEGER2

  INTEGER1 -ge INTEGER2  : INTEGER1 大於或等於 INTEGER2

  INTEGER1 -gt INTEGER2  : INTEGER1 大於 INTEGER2

  INTEGER1 -le INTEGER2  : INTEGER1 小於或等於 INTEGER2

  INTEGER1 -lt INTEGER2  : INTEGER1 小於 INTEGER2

  INTEGER1 -ne INTEGER2  : INTEGER1 不等於 INTEGER2

 

  以下兩個 if 語句是等效的:

if (( x < y )); then    statementsfiif [ $x -lt $y ]; then    statementsfi

 

  對於浮點算術,bc 返回 1 表示真,0 表示假:

if [ $( echo "$t < 3.4" | bc ) -eq 1 ]; then    statementsfi

 

 

參考一

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.