在shell脚本中计算一般会涉及到let、$(())、$[]、bc(另扩展expr)。其中let、$(())、$[]都是用来做基本整数运算,bc可以用来做浮点运算。
(1).let、$(())、$[]
因为这三个基本等价,所以放在一起说明。
首先来看下let命令
[xf@xuexi ~]$ num=10
[xf@xuexi ~]$ echo $num
10
[xf@xuexi ~]$ let num=$num+6;echo $num
16
[xf@xuexi ~]$ let num=num-6;echo $num //let命令中等号右边可以没有美元符号
10
[xf@xuexi ~]$ let num+=6;echo $num //+=、-=、*=、/=分别是自加、自减、自乘、自除
16
[xf@xuexi ~]$ let num-=6;echo $num
10
再看$(())
[xf@xuexi ~]$ num=10
[xf@xuexi ~]$ echo $num
10
[xf@xuexi ~]$ num=$((num+6));echo $num //也可以num=$((num+=6))
16
[xf@xuexi ~]$ num=$((num-6));echo $num
10
最后看$[]
[xf@xuexi ~]$ num=10
[xf@xuexi ~]$ echo $num
10
[xf@xuexi ~]$ num=$[num+6];echo $num
16
[xf@xuexi ~]$ num=$[num-6];echo $num
10
注意:$(())和$[]可以直接使用在命令中,而let则不行
[xf@xuexi ~]$ num=10
[xf@xuexi ~]$ echo $((num+6))
16
[xf@xuexi ~]$ echo $[num+6]
16
(2).bc
bc命令是用来做浮点运算,也就是小数点运算。
[xf@xuexi ~]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. //以上抬头可以使用-q命令省略
num =10 //bc命令里可以另外定义变量
num*5
50 5/3
1 //这里之所以为整数,是因为没有设置小数位数
scale=2 //设置小数的位数为2位
5/3
1.66 quit //退出
上面都是在命令行中使用,如果想要使用到脚本当中需要借助echo命令来使用,如下:
[xf@xuexi ~]$ vim a.sh
[xf@xuexi ~]$ cat a.sh
#!/bin/bash
num=10
echo "scale=2;$num/3" | bc
[xf@xuexi ~]$ sh a.sh
3.33
(3).扩展expr
expr可以对数字进行基本运算,也可以做比较,还可以对字符串进行操作。
首先使用expr进行基本运算,注意乘号(*)需要转义,数字与符号之间必须使用空格隔开
[xf@xuexi ~]$ expr 5 + 2
7
[xf@xuexi ~]$ expr 5 - 2
3
[xf@xuexi ~]$ expr 5 * 2
expr: 语法错误
[xf@xuexi ~]$ expr 5 \* 2
10
[xf@xuexi ~]$ expr 5 / 2
2
//下面是错误的格式
[xf@xuexi ~]$ expr 5+1
5+1
[xf@xuexi ~]$ expr 5 * 1
expr: 语法错误
接着进行数字的比较,注意输出0表示假(错误),输出1表示真(正确),大小于号需要转义,数字与符号之间一样需要用空格隔开
[xf@xuexi ~]$ expr 5 \> 1
1
[xf@xuexi ~]$ expr 5 \< 1
0
[xf@xuexi ~]$ expr 5 = 1
0
[xf@xuexi ~]$ expr 5 != 1
1
//下面是错误的格式
[xf@xuexi ~]$ expr 5 > 1
[xf@xuexi ~]$ expr 5\>1
5>1
最后看对字符串的处理,可以使用"length [字符串]"来统计字符串长度;也可以使用"substr [偏移量] [长度]"截取指定的字符,偏移量从1开始;
[xf@xuexi ~]$ expr length "hello world"
11
[xf@xuexi ~]$ expr substr "hello world" 2 3 //2表示从第2位开始,3表示截取3位字符
ell