在Linux中直接使用数学运算符进行数学运算每每得不到咱们想要的计算结果。要在Shell中进行数学运算,咱们须要借助点小手段。目前,Linux Shell中进行数学运算的方法主要有三种:bc、expr、let。shell
在bash界面,直接输入bc或者bc -q,就能够进去bc的命令行,经过使用数学运算符可以获得咱们想要的结果:vim
1 [scott@centos1 ~]$ bc -q 2 3 2+4 4 5 6 6 7 2-4 8 9 -2 10 11 2*4 12 13 8 14 15 2/4 16 17 0 18 19 2%4 20 21 2 22 23 2^4 24 25 16 26 27 scale=2;2/4 28 29 .50 30 31 2%4 32 33 0 34 35 scale=0;2/4 36 37 0 38 39 2%4 40 41 2
输入运算数和运算符号,回车便可获得运算结果。经过设置scale,能够定义当前的小数点精度,对除法、取余和幂运算有效。centos
这种方式只能在bc的命令行中进行,在代码中固然不能这样干了。bash
1 [scott@centos1 ~]$ echo 2+3|bc 2 3 5 4 5 [scott@centos1 ~]$ echo 2-3|bc 6 7 -1 8 9 [scott@centos1 ~]$ echo 2*3|bc 10 11 6 12 13 [scott@centos1 ~]$ echo 2/3|bc 14 15 0 16 17 [scott@centos1 ~]$ echo 2%3|bc 18 19 2 20 21 [scott@centos1 ~]$ echo "scale=2;2/3"|bc 22 23 .66 24 25 [scott@centos1 ~]$ echo "scale=2;2%3"|bc 26 27 .02 28 29 [scott@centos1 ~]$ echo "scale=2;3/2"|bc 30 31 1.50 32 33 [scott@centos1 ~]$ echo "scale=2;3%2"|bc 34 35 0 36 37 [scott@centos1 ~]$ echo 2^3|bc 38 39 8
这种管道方式在shell中应用的更多一些,一样能够在运算的时候加上精度的限制。spa
1 [scott@centos1 ~]$ echo "ibase=10;15"|bc 2 3 15 4 5 [scott@centos1 ~]$ echo "ibase=8;15"|bc 6 7 13 8 9 [scott@centos1 ~]$ echo "ibase=16;F"|bc 10 11 15
上文的例子,是把几种进制都转化为10进制。命令行
1 [scott@centos1 ~]$ vim bc-test.bc 2 3 [scott@centos1 ~]$ bc -q bc-test.bc 4 5 3 6 7 -1 8 9 6 10 11 0 12 13 .75 14 15 0
其中,bc-test.bc的内容为:code
1+2 1-2 2*3 2/3 scale=2;3/4 scale=0;3/4
就是表达式的集合。blog
expr是个很强大的命令,能够进行数学运算,也能够进行字符串的操做等。先看下数学运算的功能。字符串
1 [scott@centos1 ~]$ expr 3+4 2 3 3+4 4 5 [scott@centos1 ~]$ expr 3 +4 6 7 expr: syntax error 8 9 [scott@centos1 ~]$ expr 3 + 4 10 11 7 12 13 [scott@centos1 ~]$ expr 3 * 4 14 15 expr: syntax error 16 17 [scott@centos1 ~]$ expr 3 \* 4 18 19 12 20 21 [scott@centos1 ~]$ expr 3 / 4 22 23 0 24 25 [scott@centos1 ~]$ expr 3 % 4 26 27 3
expr不支持浮点运算,不支持幂乘运算,在运算的时候可要注意运算符和运算数的分离,写在一块儿但是不识别的,另外,乘法有点特殊,须要转义。数学
下面看看expr的字符串操做。
1 [scott@centos1 ~]$ string=123456789asdfg 2 3 [scott@centos1 ~]$ expr length $string 4 5 14 6 7 [scott@centos1 ~]$ expr index $string '456' 8 9 4 10 11 [scott@centos1 ~]$ expr substr $string 7 4 12 13 789a 14 15 [scott@centos1 ~]$ expr substr $string 7 11 16 17 789asdfg
上例分别利用expr命令进行了计算字符串长度、获取字串或者字符的首次出现位置、取指定位置开始的限定长度的字符字串,须要注意的是expr中的下标是从1开始的。
1 [scott@centos1 ~]$ let a=2+3 2 3 [scott@centos1 ~]$ echo $a 4 5 5 6 7 [scott@centos1 ~]$ let a=2*3 8 9 [scott@centos1 ~]$ echo $a 10 11 6 12 13 [scott@centos1 ~]$ let a=2/3 14 15 [scott@centos1 ~]$ echo $a 16 17 0 18 19 [scott@centos1 ~]$ let a=2%3 20 21 [scott@centos1 ~]$ echo $a 22 23 2 24 25 [scott@centos1 ~]$ let a=2^3 26 27 [scott@centos1 ~]$ echo $a 28 29 1 30 31 [scott@centos1 ~]$ let a=2**3 32 33 [scott@centos1 ~]$ echo $a 34 35 8
须要注意的是,let命令里的幂乘运算不是^,而是**。
1 [scott@centos1 ~]$ echo $((3+5)) 2 3 8 4 5 [scott@centos1 ~]$ echo $((3*5)) 6 7 15 8 9 [scott@centos1 ~]$ echo $((3**5)) 10 11 243 12 13 [scott@centos1 ~]$ echo $((((3+5))*3)) 14 15 24 16 17 [scott@centos1 ~]$ echo `date` 18 19 Fri Aug 16 08:24:33 PDT 2013 20 21 [scott@centos1 ~]$ echo `date +%Y%m%d` 22 23 20130816