一般来说,我会在shell脚本中使用expr进行算术运算。
有没有一种方法可以在不使用expr的情况下在shell脚本中进行算术运算?
答案 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 ))