shell脚本算术运算

时间:2010-06-10 05:21:47

标签: unix shell ksh

一般来说,我会在shell脚本中使用expr进行算术运算。

有没有一种方法可以在不使用expr的情况下在shell脚本中进行算术运算?

3 个答案:

答案 0 :(得分:4)

现代shell(在我看来,POSIX compliance = modern)支持算术运算: + - / *有符号长整数变量+/- 2147483647.

使用awk表示双精度,15个siginificant数字它也使用sqrt。

使用bc -l扩展精度最多20位有效数字。

您已经看到的shell的语法(zed_0xff):

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

awk本地执行双精度 - 浮点 - 算术运算。 它也有sqrt,cos,sin ....见:

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

bc有一些定义的函数和扩展的presision,可以使用-l选项:

bc -l <​​/ p>

示例:

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

答案 1 :(得分:3)

如果您使用ksh,您是否尝试过阅读“man ksh”?

例如,“man bash”有关于使用bash进行算术运算的足够信息。

命令typeset -i可用于指定必须将变量视为整数,例如typeset -i MYVAR指定变量MYVAR是整数而不是字符串。在typeset命令之后,尝试为变量分配非整数值将失败:

   $ 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 shell解释为算术表达式

答案 2 :(得分:0)

shell内置$(( <expr> ))的精度和范围取决于平台。在32位平台上,它仅限于32位整数(与expr不同,它似乎以一种看似独立于平台的方式支持更大的整数。)

(N.B-请注意,虽然^在大多数shell中都是有效的运算符,但它并不意味着&#39;的功能,而是XOR。)

此外 - 在这方面,一些炮弹更为明显。例如,Zsh允许浮点运算,例如$(( 10/3.0 ))