贝壳
在最简单的CLI钙是CLI(壳)本身(如果IFS
是默认值):
$ echo $(( 22 + 333 ))
355
空格可以省略:
$ echo $((22*333))
7326
由于它是POSIX的一部分,所以 几乎所有的外壳都具有它。并且它包括大多数 C语言数学功能(除了zsh的优先级不同之外,请设置C_PRECEDENCES以将其恢复为兼容值):
$ echo $((22*333^2))
7324
和一些贝壳有大部分C语言的语法,数学(包括逗号)的:
$ echo $((a=22,b=333,c=a*b,c))
7326
但这在某些shell中只是整数数学(在当今的OS中通常小于2 63):
$ echo $((1234/3))
411
$ zsh -c 'echo $((2**63))'
-9223372036854775808
一些shell可以进行浮动数学运算:
$ ksh -c 'echo $((1234/3.0))'
411.333333333333333
$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21
避免使用zsh(zcalc存在类似问题):
$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259
我建议您避免使用expr
,有时它需要奇怪的转义:
$ expr 22 \* 333
7326
公元前
在下一级是也是POSIX)bc
(RPN的表弟dc
)
$ echo '22*333' | bc
7326
$ echo '22 333 * p' | dc
7326
的 dc
是 POSIX,但在2017年被删除了。
如果您的外壳支持,则更短:
$ bc <<<'22*333'
7326
甚至:
$ <<<'22*333' bc
7326
两者都是具有一些内部数学函数的任意精度计算器:
$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376
$ echo 's(3.1415/2)' | bc -l # sine function
.99999999892691403749
awk
在使用了那些真正基本的计算工具之后,您需要使用其他语言
$ awk "BEGIN {print (22*33)/7}"
103.714
$ perl -E "say 22*33/7"
103.714285714286
$ python3 -c "print(22*33/7)"
103.71428571428571
$ php -r 'echo 22*33/7,"\n";'
103.71428571429
功能
您可以定义以上任何选项的功能:
c ()
{
local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}
并使用:
$ c 22* 33 /7 # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714
quit
到bc
; 按ctrl-D
会做,因为它会在任何互动节目。