shell使用数学运算

1 bc
1.1 命令行方式

在bash界面,直接输入bc或者bc -q,就可以进去bc的命令行,通过使用数学运算符能够得到我们想要的结果:

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,可以定义当前的小数点精度,对除法、取余和幂运算有效。

这种方式只能在bc的命令行中进行,在代码中当然不能这样干了。


1.2 管道方式

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中应用的更多一些,同样可以在运算的时候加上精度的限制。


1.3 进制转换

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.4 表达式运算

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的内容为:

1+2

1-2

2*3

2/3

scale=2;3/4

scale=0;3/4

就是表达式的集合。


2 expr

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开始的。


3 let

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命令里的幂乘运算不是^,而是**。


4 其他方式

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

posted @ 2015-05-04 14:40  侠客书生  阅读(131)  评论(0编辑  收藏  举报