linux极简小知识:29、如何在shell下进行简单的数学计算【挑战最全方法介绍,欢迎指出遗漏的其他方法】

380 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

使用linux时,很有可能需要用到对某几个数据进行简单计算的需求。

可能是一个临时性的小计算、也可能是来自别处很简单的执行,如果这时可以顺手在shell上执行完,查看一下结果。就会很方便(不需要去笔算、去找计算器软件...)。

下面就介绍下shell中的一些基本运算!

介绍

在终端shell下提供了用于计算的运算符,这就属于shell编程的范畴了。

此外,还有直接用于运算的命令,如let,expr命令,和支持浮点数运算的bc命令。

let命令

let命令可以实现简单的算术以及逻辑运算。可以使用 help let 查看具体使用方法。

let命令的作用,就是将算术运算的结果,赋予一个变量。

let命令中的 运算符前后不能有空格。

如下,直接在shell终端中执行:

$ i=1
$ echo $i
1
$ let i=i+10
$ echo $i
11
$ let "i=i+100"
$ echo $i
111

也可以将其放在 shell 脚本文件中,如下:

#!/bin/sh

i=1
echo $i

let i=i+10 #11
echo $i

let "i=i+100" #111
echo $i

脚本名为 calc.sh

$ bash calc.sh
1
11
111

[]

[]相当于let命令。具体示例如下:

$ i=1
$ i=$[i+10]
$ echo $i
11
$ i=$[i+100]
$ echo $i
111

(())

(()) 等价于 []。用法如下:

$ i=1
$ i=$((i+10))
$ echo $i
11
$ i=$((i+100))
$ echo $i
111

expr 表达式

expr 是一款表达式计算工具,用以完成表达式的求值操作。

注意:expr 表达式需要放在反引号 ` 中,是反引号而不是单引号,且运算符的前后要有空格,否则无法执行运算。

$ i=`expr 1 + 10`
$ echo $i
11
$ i=`expr $i + 100`
$ echo $i
111
$ i=`expr 1 / 10`
$ echo $i
0

如果运算符前后没有空格,将会原样输出:

$ i=`expr 1+10`
$ echo $i
1+10

bc命令(支持任意精度的交互执行计算)

以上所有的计算,只适用于整数计算。如果想要进行小数、浮点数的运算,可以使用bc命令。

bc命令是一种支持任意精度的交互执行的计算器语言。

bash内置只支持整数的四则运算,并不支持浮点运算,而bc命令可以很方便的实现浮点运算。同时,还支持一些函数。

bc命令参数:

  • -i:强制进入交互式模式;

  • -l:定义使用的标准数学库;

执行 bc 时,指定 scale=integer 设置输出结果的小数位数,即精度。

bc 全称为 Binary Calculator。

默认运算

默认运算时,结果是和运算数一样的精度:

$ echo "1.212960*3" | bc
3.638880
$ echo "1.21296*3" | bc
3.63888
$ echo "1.21296*3+2" | bc
5.63888
$ echo "1.21295*2" | bc
2.42590

指定 scale 精度

指定 scale 精度:

$ echo "scale=7;3/8" | bc
.3750000
$ echo "scale=7;10/3" | bc
3.3333333

(使用反引号)获取 bc 的结果

使用反引号获取 bc 执行的结果:

$ i=10
$ j=3
$ n=`echo "scale=7; $i/$j" | bc`
$ echo $n
3.3333333

bc 命令中,运算符前后不需要有空格。

obase 进制转换

bc中,通过指定 obase 可以实现进制的转换

如下,将默认的十进制的192转为二进制的数值:

$ abc=192
$ echo "obase=2;$abc" | bc
11000000

二进制转十进制:

$ let abc=2#11000000
$ echo "obase=10;$abc" | bc
192

此处,需要通过 let 命令,将后面的二进制表示转换为一个变量。

计算平方和平方根

$ echo "10^10" | bc
10000000000
$ echo "sqrt(100)" | bc
10

参考

主要参考自:Shell编程——Shell中的数学运算bc命令,及一些其他资料。