数学运算

原生bash不支持直接的数学运算

1
2
3
4
5
6
7
8
# 若直接执行以下脚本
#! /bin/bash

var=$(3 + 4)
echo "两数之和为${var}"

# 执行脚本,得到下面报错信息
command not found

虽然不支持直接的数学运算,但是可以通过命令来实现数学运算。通常使用expr 命令来进行数学运算,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

1
2
3
4
5
6
7
8
# 执行以下脚本
#! /bin/bash

var=$(expr 3 + 4)
echo "两数之和为${var}"

# 执行脚本,得到以下结果
两数之和为 : 7

需要注意的是:

  • 表达式和运算符之间要有空格,例如 3+4 是不对的,得出来的结果是“两数之和为 : 3+4”必须写成 3 + 4才能得到正确的运算结果;
  • 表达式要被$() 或者 (反引号)包含,表示执行这一运算操作。

算术运算符

与我们平时使用的运算符相同

  • 加法 +
  • 减法 -
  • 乘法 *
  • 除法 /
  • 取余 %
  • 赋值 =
  • 相等 ==
  • 不相等 !=

使用算术运算符时也需要注意以下几点:

  • 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ];
  • 乘号(*)前边必须加反斜杠(\ )才能实现乘法运算,[ 4 \ * 5 ];

关系运算符

重点来啦

运算符 作用
-eq 判断两个数是否相等,相等返回 true
-ne 判断两个数是否不相等,不相等返回 true
-gt 判断左边的数是否大于右边的,如果是,则返回 true
-lt 判断左边的数是否小于右边的,如果是,则返回 true
-ge 判断左边的数是否大于等于右边的,如果是,则返回 true
-le 判断左边的数是否小于等于右边的,如果是,则返回 true

注意,以上关系运算符只支持数字或者值为数字的字符串,不支持除了值为数字以外的字符串。

布尔运算符

运算符 作用
非运算,表达式为 true 则返回 false,否则返回 true
-o 或运算,有一个表达式为 true 则返回 true
-a 与运算,两个表达式都为 true 才返回 true

实例:

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
#! /bin/bash

value1=0
value2=5
value3=10

if [ ! ${value1} ]
then
echo "! 起作用啦"
else
echo "! 没有起作用"
fi

if [ ${value2} -o ${value1} ]
then
echo "${value1} 或 ${value2} 为真"
else
echo "${value1} 或 ${value2} 为假"
fi

if [ ${value1} -a ${value2} ]
then
echo "${value1} 与 ${value2} 为真"
else
echo "${value1} 与 ${value2} 为假"
fi

if [ ${value1} -a ${value3} == ${value2} ]
then
echo "${value1} 与 ${value3} 为真"
else
echo "${value1} 与 ${value3} 为假"
fi


# 结果为
! 没有起作用
0 或 5 为真
0 与 5 为真
0 与 10 为假

从结果可以看出,这与我们平时 ! 运算的要求不大一样,平时编程时 !0 即为真,但在shell里,0 为字符串,真实存在的即为真,所以 !0 为假。因此只有通过其他运算符判断为假的表达式和!共用才能整体判断为真。如if [ ${value1} -a ${value3} == ${value2} ]例子所示。

字符串运算符

运算符 作用
= 判断两个字符串是否相等,相等返回 true
!= 判断两个字符串是否相等,不相等返回 true
-z (zero)判断字符串长度是否为0,为0返回 true
-n 判断字符串长度是否为0,不为0返回 true
$ 判断字符串是否为空,不为空返回 true

与上面布尔运算符不同,字符串运算符的两边为字符串,布尔运算符的两边为判断结果为true 或 false 的布尔变量。

逻辑运算符

与Java相同,&& 表示 逻辑与,|| 表示逻辑或