Write by lyc at 2018-10-18
Update by lyc at 2021-3-17:整理自己早期的word版本到markdown

shell变量的数值计算

1.shell中常见的算术运算符号

shell算术运算符 说明
+ - * / % ** 加,减,乘,除,取余(取模),幂运算
++ -- 自增自减,可前置也可放在变量结尾
! && || 逻辑非(取反)、逻辑与(and)、逻辑或(or)
< <= > >= 比较符号(小于、小于等于、大于、大于等于)
== != = 比较符号(相等、不等,对于字符串“=”也可以表示相当于)*
<< >> 向左移位、向右移位
~ | & ^ 按位取反、按位异或、按位与、按位或
= += -= \*= /= %= 赋值运算符

例:shell算术运算符号计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ cat test.sh
#!/bin/sh
a=$1
b=$2
[ $# -ne 2 ] && {
echo "ERROR:Please enter 2 args"
exit 1
}
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a/b=$(($a/$b))"
echo "a**b=$(($a**$b))"
echo "a%b=$(($a%$b))"

# 执行结果
$ sh test.sh 2 2
a-b=0
a+b=4
a*b=4
a/b=1
a**b=4
a%b=0

2.shell中常见的算术运算命令

shell运算操作符与运算命令 说明
(()) 用于整数运算的常用运算符,效率很高。
let 用于整数运算,类似于 (())
expr 用于整数运算,但还有很多其他的额外功能
bc linux下的一个计算器程序(合适整数及小数运算)
$[] 用于整数运算
awk awk 既可以用于整数运算,也可以用于小数运算
declare 定义变量值和属性,-i 参数可以用于定义整形变量

2.1 (()) 运算符

1
2
3
4
$ i=1
$ i=$((i+8))
$ echo $i
9

2.2 let 命令

let 后面的赋值表达式可以不加 $

1
2
3
4
$ i=1
$ let i=i+8
$ echo $i
9

2.3 expr 命令

运算符及用于计算的数字左右都至少有一个空格,否则会报错。

使用乘号时,必须用反斜线屏蔽其特定含义,因为shell可能会误解星号的含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1.expr 基本用法
$ expr 2 + 2
4
$ expr 2 * 2
expr: 语法错误
$ expr 2 \* 2 # 乘号需要加\转义,否则系统认为星号
4
$ expr 2 / 2
1
$ expr 2+ 2 # 符号前后至少要有一个空格。
expr: 语法错误

# 2.expr 配合变量计算
$ i=5
$ i=`expr $i + 6`
$ echo $i
11

# 3.expr length 计算字符串长度
$ s1=oldboy
$ expr length $s1 # 速度较慢
6
$ echo $s1|wc -L # 效率最慢
6
$ echo ${#s1} # 效率最快
6

多用系统内置命令或函数,效率高;少用管道,效率低。它们之间的执行速度会差距上百倍。

2.4 bc 命令

bc 作为计算器来使用

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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'.
1
1
1+1
2
2*2
4
6/3
2

bc 作为命令来使用

1
2
3
4
5
6
7
8
$ echo 3+5|bc
8
$ echo 3.2-3.1|bc
.1
$ echo 2.2*2|bc
4.4
$ echo "scale=2;2.20*2.00"|bc # scale=2 结果保留2位小数
4.40

例:通过一条命令计算输出1+2+3+4+5+6+7+8+9+10=55

1
2
3
4
5
6
7
# 方法1:
$ echo "`seq -s "+" 10`=`seq -s "+" 10|bc`"
1+2+3+4+5+6+7+8+9+10=55

# 方法2:
$ echo "`seq -s "+" 10`="$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55

2.5 awk 命令

awk 运算很精确,可以用于整数或小数计算。

1
2
3
4
5
6
$ echo "6 2"|awk '{print $1-$2}'
4
$ echo "6.2 2.1"|awk '{print $1-$2}'
4.1
$ echo "6.2 2.1"|awk '{print $1*$2}'
13.02

2.6 $[ ] 运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ i=5
$ i=$[i+6]
$ echo $i
11

$ echo $[2*3]
6

$ echo $[2**3]
8

$ echo $[3/5]
0

$ echo $[3%2]
1

$ echo $[ 5 % 3]
2