標籤:使用 檔案 資料 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