2010-06-10 139 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))