Shell脚本算术运算

6

通常我会在shell脚本中使用expr进行算术运算。

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


我想,“使用bc代替”不完全是你要找的答案... - Ignacio Vazquez-Abrams
@ignacio...你能否举个例子说明如何使用bc吗? - Vijay
PI=$(echo "4*a(1)" | bc -l) - glenn jackman
3个回答

5

现代shell(符合POSIX标准=我看来是现代的)支持有符号长整型变量+ - / * 的算术运算,范围为+/- 2147483647。

使用awk进行双精度计算,支持15位有效数字,还可以进行平方根运算。

使用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具有一些已定义的函数和扩展精度,可通过-l选项使用:

bc -l

例如:

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

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将其参数评估为简单的算术表达式。例如:

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

上述表达式也可以写成以下形式:
   $ echo $(($MYVAR+45))
   101
   $

$((和))之间的任何内容都会被Korn shell解释为算术表达式。


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 - zed_0xff
公平地说,ksh的手册页并不是很有帮助。 甚至ksh88的手册页也会误导人,例如在解释_变量时,它们告诉你它与MAILPATH有关,但并没有清楚地解释它是什么。(在Solaris 9、HPUX 11.0和11i上)如果有影响的话,它是先前输入命令的参数。 - jim mcnamara

0

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

请注意,虽然^在大多数shell中是一个有效的运算符,但它并不意味着“乘方”,而是异或。

此外,有些shell在这方面更为详细。例如,Zsh允许浮点运算,如$(( 10/3.0 ))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接