shell中的數學運算

來源:互聯網
上載者:User

標籤:使用   檔案   資料   os   問題   for   

expr命令
=======

最開始,Bourne shell提供了一個特別的命令用來處理數學運算式。expr命令允許在命令列上處理數學運算式,但是特別笨拙:

$ expr 1 + 5
6

expr命令能識別一些不同的數字和字串操作符,如下表:

=======================================================================
操作符 描 述
-----------------------------------------------------------------------
ARG1 | ARG2 如果沒有參數是null或0,返回ARG1;否則返回ARG2
ARG1 & ARG2 如果沒有參數是null或0,返回ARG1;否則返回0
ARG1 < ARG2 如果ARG1小於ARG2,返回1;否則返回0
ARG1 <= ARG2 如果ARG1小於或等於ARG2,返回1;否則返回0
ARG1 = ARG2 如果ARG1等於ARG2,返回1;否則返回0
ARG1 != ARG2 如果ARG1不等於ARG2,返回1;否則返回0
ARG1 >= ARG2 如果ARG1大於或等於ARG2,返回1;否則返回0
ARG1 > ARG2 如果ARG1大於ARG2,返回1;否則返回0
ARG1 + ARG2 返回ARG1和ARG2的算術運算和
ARG1 - ARG2 返回ARG1和ARG2的算術運算差
ARG1 * ARG2 返回ARG1和ARG2的算術乘積
ARG1 / ARG2 返回ARG1和ARG2的算術商
ARG1 % ARG2 返回ARG1和ARG2的算術餘數
STR : EXP 如果EXP匹配到STR的某個模式,返回該模式比對
match STR EXP 如果EXP匹配到STR的某個模式,返回該模式比對
substr STR POS LEN 返回起始位置為POS(從1開始計數)、長度為LEN個字元的字串
index STR CHARS 返回在STR中找到CHARS字串的位置;否則,返回0
length STR 返回字串STR的數值長度
+ TOKEN 將TOKEN解釋成字串,即使是個關鍵字
(EXPRESSION) 返回EXPRESSION的值
=======================================================================

儘管標準操作符在expr命令中工作得很好,但在指令碼或命令列上使用它們時仍有問題出現。許多expr命令操作符在shell中有其他意思(比如星號)。在expr命令中使用它們會得到一些詭異的結果:

$ expr 5 * 2
expr: syntax error
$

要解決這個問題,在傳給expr命令前,你需要使用shell的逸出字元(反斜線)來識別容易被shell錯誤解釋的任一字元:

$ expr 5 \* 2
10
$

不過,bash shell有一個針對處理數學運算子的改進,請看下面。

使用方括弧
========

bash shell為了保持跟Bourne shell相容而包含了expr命令,但它同樣也提供了一個執行數學運算式更簡單的方法。在bash shell中,在將一個數學運算結果賦給某個變數時,你可以用美元符和方括弧($[ operation ])將數學運算式圈起來:

$ var1=$[1 + 5]
$ echo $var1
6
$ var2=$[$var1 * 2]
$ echo $var2
12
$

用方括弧來執行shell數學運算比用expr命令方便很多,這種技術在shell指令碼中也能工作。同樣,在使用方括弧來計算公式時,不用擔心shell會誤解乘號或其他符號。shell知道它不是萬用字元,因為它在方括弧內。
但是,bash shell數學運算只支援整數運算。如果要計算浮點,請往下看。

浮點解決方案
==========

有幾種解決方案能夠解決bash中數學運算的整數限制。最常見的解決方案是有內建的bash計算機,稱作bc。

###bc的基本用法

bash計算機其實是允許你在命令列輸入浮點運算式、解釋運算式、計算並返回結果的一種程式設計語言。bash計算機能夠識別:

- 數字(整數和浮點數)
- 變數(簡單變數和數組)
- 注釋(以#開始的行或者C語言中的/* */對)
- 運算式
- 編程語句(例如if-then)
- 函數

你可以在shell提示符下通過bc命令訪問bash計算機:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘.
12*5.4
64.8
quit

輸入計算公式,bc會自動返回答案,退出輸入quit。

浮點運算是由一個內建的稱為scale的變數控制的。你必須將這個值設定為結果是你想要的小數後的位元。

bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘.
3.44 /5
0
scale=4
3.44 /5
.6880
quit

###在指令碼中使用bc

你可以使用反引號或者$()來運行bc命令並將輸出賦給一個變數。基本格式是這樣的:

variable = `echo "options; expression" | bc`

第一部分options允許你來設定變數。如果你需要設定不止一個變數,可以用分號來分開它們。expression變數定義了通過bc執行的數學運算式。例子:

#!/bin/bash
var1=`echo "scale=4; 3.44 / 5" | bc`
echo The answer is $var1

結果是: The answer is .6880

這種方法適用於較短的運算,但有時你會更多地和你自己的數字打交道。如果你有很多運算,在同一個命令列中列出多個運算式就會有點麻煩。
針對這個問題有個解決辦法。bc命令能識別輸入重新導向,允許你將一個檔案重新導向到bc命令來處理。然後,這同樣會叫要困惑,因為你必須將運算式儲存到檔案中。
最好的辦法是使用內聯輸入重新導向,允許你直接在控制台重新導向資料。在shell指令碼中,你可以將輸出賦給一個變數:

variable=`bc << EOF
options
statements
expressions
EOF
`

EOF檔案字串標識了內聯重新導向資料的開始和結尾。記住仍然需要反引號來將bc命令的輸出賦給變數。例如:

#!/bin/bash

var1=10.46
var2=43.67
var3=33.2
var4=71

var5=`bc << EOF
scale = 4
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
`

echo The final answer for this mass is $var5

相關文章

聯繫我們

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