Linux Shell 脚本(2)——算术运算

说明

  在上一篇中,我们介绍了Shell脚本的基本结构,本篇着重点在于简单的加减乘除和求余这几个算术运算。


expr 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
### expr 算术运算 ###
a=60
b=20
echo --------expr 命令---------
echo "初始值:a=${a} b=${b}"
echo -n '直接执行:expr ${a} + ${b}: '
expr ${a} + ${b} # 这里会直接输出 a+b 的结果
echo -n '先执行 c=`expr $a + $b`,再输出 $c:'
c=`expr ${a} + ${b}` # 这里会先执行 a+b,并将结果赋值给 c
echo ${c}
echo -n a+b=
expr ${a} + ${b}
echo -n a-b=
expr ${a} - ${b}
echo -n a*b=
expr ${a} \* ${b} # 乘法运算必须将*使用反斜杠\转义出来
echo -n a/b=
expr ${a} / ${b}
echo -n c%a=
expr ${c} % ${a}

  expr命令格式为:expr ${var1} op ${var2}。要求var1var2都必须是整数,op为算术运算符,支持:+ - * / %,其中乘法运算需要添加转义字符\,每个字段之间都必须由空格隔开。


let 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
a=60
b=20
echo --------let 命令---------
echo "初始值:a=$a b=$b"
echo let 命令通常用于运算后直接赋值
let c=$a+$b
echo 'after let c=a+b, c == '$c
let c=$a-$b
echo 'after let c=a-b, c == '$c
## let 命令在执行乘法运算时乘号可以不转义
let c=$a\*$b
echo 'after let c=a\*b, c == '$c
let c=$a*$b
echo 'after let c=a*b, c == '$c
let c=$a/$b
echo 'after let c=a/b, c == '$c
let c=$a+$b
echo -e -n "before: c=$c, a=$a\t"
let c=c%a
echo 'after let c=c%a, c == '$c

  let命令格式为:let result=${var1}op${var2}或者let result=var1opvar2。要求var1var2都是整数,否则计算结果不正确。其中参与运算的值可以不使用${}括起来,乘法运算符可以直接使用。


$((expression))命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
a=60
b=20
echo --------$((expression)) 命令---------
echo "初始值:a=$a b=$b"
echo '$((expression)) 命令通常用于运算后直接赋值'
c=$(($a+$b))
echo 'after c=$(($a+$b)), c == '$c
c=$((a-b))
echo 'after c=$((a-b)), c == '$c
c=$((a*b))
echo 'after c=$((a*b)), c == '$c
c=$((a/b))
echo 'after c=$((a/b)), c == '$c
c=$((a+b))
echo -e -n "before: c=$c, a=$a\t"
c=$((c%a))
echo 'after c=$((c%a)), c == '$c

  $((expression))是一种比较简洁的算术运算实现,其格式为:result=$((${var1}op${var2}))或者result=$((var1opvar2))


累加计算

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
## 判断参数1是否是整数,是的话返回 true,否的话返回 false
function isNumber() {
if expr $1 + 0 &>/dev/null; then
return 0
else
return 1
fi
}
## 验证参数1是否是数字,如果不是的话返回 10,是的话返回该值
function validate() {
if [ $# -eq 1 ]
then
if isNumber $1; then
return $1
fi
fi
return 10
}
## 通过 expr 命令实现累加
function exprAccumulate() {
validate $1
num=$?
index=1
while [ ${index} -le ${num} ]
do
echo ${index}
index=`expr ${index} + 1`
done
return 0
}
## 通过 let 命令实现累加
function letAccumulate() {
validate $1
num=$?
index=1
until [ ${index} -gt ${num} ]
do
echo $index
let index+=1
done
return 0
}
## 通过 $((expression)) 命令实现累加
function dollarAccumulate() {
validate $1
num=$?
index=1
while [ ${index} -le ${num} ]; do
echo $index
index=$((index+1))
done
}
echo '使用 expr 命令实现 1 累加到 5'
exprAccumulate 5
echo '使用 let 命令实现 1 累加到 6'
letAccumulate 6
echo '使用 $((expression)) 命令实现 1 累加到 7'
dollarAccumulate 7
exit 0

  本文简单介绍了Shell脚本基本算术运算的三种实现,个人推荐使用第三种$((expression))

编写日期:2017-05-23
发布日期:2017-05-23