2010-06-10 192 views
4

一般我會用shell腳本中的expr來做算術運算。shell腳本算術運算

有沒有一種方法,我們可以拿出一個shell腳本中的算術運算而不使用expr?

+0

我想「使用'bc'而不是*相當*你正在尋找的答案... – 2010-06-10 05:23:47

+0

@ignacio ...你能否願意一個如何使用bc的例子? – Vijay 2010-06-10 05:25:39

+0

'PI = $(echo「4 * a(1)」| bc -l)' – 2010-06-10 13:57:19

回答

3

如果您使用ksh,您是否嘗試閱讀「man ksh」?例如,「man bash」具有足夠的關於用bash進行運算的信息。

命令typeset -i可用於指定變量必須被視爲整數,例如typeset -i MYVAR指定變量MYVAR是整數而不是字符串。繼排版指令,嘗試分配非整數值變量將失敗:

$ typeset -i MYVAR 
    $ MYVAR=56 
    $ echo $MYVAR 
    56 
    $ MYVAR=fred 
    ksh: fred: bad number 
    $ 

開展對變量或shell腳本中的算術運算,使用let命令。讓我們將它的參數評估爲簡單的算術表達式。例如:

$ let ans=$MYVAR+45 
    echo $ans 
    101 
    $ 

以上也可寫爲表達式如下:

$ echo $(($MYVAR+45)) 
    101 
    $ 

任何內$((和))包圍由Korn外殼解釋爲一個算術表達式

+0

我在man page中沒有找到任何東西。 – Vijay 2010-06-10 05:48:59

+1

http://osr507doc.sco.com/en/OSUserG/_math_on_var_in_ksh.html http://www.bo.infn.it/alice/alice-doc/mll-doc/impgde/node18.html – 2010-06-10 06:13:13

+0

感謝您的支持正確的方向zed – Vijay 2010-06-10 06:38:19

4

現代外殼(在我看來POSIX兼容=現代)支持算術運算: + -/*在帶符號的長整數變量+/- 2147483647上。

使用awk來實現雙精度,15個siginificant數字它也有sqrt。

使用bc -l可獲得最多20位有效數字的擴展精度。

殼的語法(zed_0xff)你已經看到:

a=$((13 * 2)) 
a=$(($2/2)) 
b=$(($a - 1)) 
a=(($a + $b)) 

awk進行雙精度 - 浮點 - 算術運算本身。 它也有開方,COS,罪惡....看到:

http://people.cs.uu.nl/piet/docs/nawk/nawk_toc.html

BC有一些定義的功能和擴展presision它們可與-l選項:

BC -l

例如:

echo 'sqrt(.977)' | bc -l 
0

精度和外殼的範圍內建$((<expr>))取決於平臺。在32位平臺上,它僅限於32位整數(與expr不同,它似乎支持更大的整數,看起來與平臺無關)。

(N.B - 當心,雖然^在大多數炮彈的有效運營,這並不意味着「給力」,而是XOR)

而且 - 一些炮彈在這方面更加積極。例如,Zsh允許浮點運算,如$((10/3.0))