通常我会在shell脚本中使用expr进行算术运算。
有没有一种方法可以在不使用expr的情况下在shell脚本中执行算术操作呢?
现代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
如果你正在使用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解释为算术表达式。
Shell内置命令$(( <expr> ))
的精度和范围取决于平台。在32位平台上,它仅限于32位整数(与expr
不同,后者似乎以一种独立于平台的方式支持更大的整数)。
请注意,虽然^
在大多数shell中是一个有效的运算符,但它并不意味着“乘方”,而是异或。
此外,有些shell在这方面更为详细。例如,Zsh允许浮点运算,如$(( 10/3.0 ))
bc
代替”不完全是你要找的答案... - Ignacio Vazquez-AbramsPI=$(echo "4*a(1)" | bc -l)
- glenn jackman