小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
使用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命令,及一些其他资料。