Shell运算符
Shell 支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
1、算数运算符
bash默认是字符串,原生的shell不支持数值运算,如果要进行数值运算时需要进行转化,通常由三种方式可以进行转化:
- expr 表达式,注意空格,即表达式和运算符之间要有空格,完整的表达式要被 ` 包含,注意这个字符不是常用的单引号。
$
((运算式))或$[运算式]- declare -i
- let
案例
分别用以上四种方式求两数之和
#使用expr
[root@root test02]# vim test.sh
#进入vim编辑器
num1=10
num2=12
sum=`expr $num1 + $num2 `
echo "两数的和为:$sum"
#测试
[root@root test02]# ./test.sh
两数的和为:22
#使用$((运算式))或$[运算式]
[root@root test02]# vim test.sh
#进入vim编辑器
num1=10
num2=12
sum=`expr $num1 + $num2 `
echo "两数的和为:$sum"
echo "两数之和为($(())):$(($num1+$num2))"
echo "两数之和为($[]):$[$num1+$num2]"
#测试
[root@root test02]# ./test.sh
两数的和为:22
两数之和为(0):22
两数之和为(0):22
#使用declare
[root@root test02]# a=1
[root@root test02]# b=2
[root@root test02]# c=$a+$b
[root@root test02]# echo $c
1+2
[root@root test02]# declare -i c=$a+$b
[root@root test02]# echo $c
3
运算符归类
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b |
- | 减法 | expr $a - $b |
* | 乘法 | expr $a \* $b |
/ | 除法 | expr $b / $a 。 |
% | 取余 | expr $b % $a |
= | 赋值 | a=$b ,把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] ,注意空格 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] |
案例
假设两个数a=12,b=21,分别求两个数的和差积商余
#进入vim编辑器进行编辑
[root@root test02]# vim test.sh
a=12
b=21
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
#测试
[root@root test02]# ./test.sh
a + b : 33
a - b : -9
a * b : 252
b / a : 1
b % a : 9
a 不等于 b
注意:
- 乘号
*
前边必须加反斜杠\
才能实现乘法运算. - 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的
*
不需要转义符号\
。
2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
。
运算符 | 解释 | 举例 |
---|---|---|
-eq | 检测两个数是否相等 | [ $a -eq $b ] |
-ne | 检测两个数是否不相等 | [ $a -ne $b ] |
-gt | 检测左边的数是否大于右边的 | [ $a -gt $b ] |
-lt | 检测左边的数是否小于右边的 | [ $a -lt $b ] |
-ge | 检测左边的数是否大于等于右边的。 | [$a -ge $b ] |
-le | 检测左边的数是否小于等于右边的 | [ $a -le $b ] |
注 :在运算符两边要有空格。
案例
随机输入两个数字,分别求两个数的关系
[root@root test02]# vim test03.sh
echo "游戏开始"
read -p "请输入第一个数字a=" a
read -p "请输入第二个数字b=" b
if [ $a -eq $b ]
then
echo "你和我输入的数字一样,都是$a"
elif [ $a -gt $b ]
then
echo "我输入的数字大于你输入的数字"
elif [ $a -lt $b ]
then
echo "我输入的数字小于你输入的数字"
elif [ $a -ge $b ]
then
echo "我输入的数字大于等于你输入的数字"
elif [ $a -le $b ]
then
echo "我输入的数字小于等于你输入的数字"
elif [ $a -ne $b ]
then
echo "我输入的数字不等于你输入的数字"
else
echo "对不起,输入错误,无法比较"
fi
echo "游戏结束"
#测试
[root@root test02]# ./test03.sh
游戏开始
请输入第一个数字a=12
请输入第二个数字b=21
我输入的数字小于你输入的数字
游戏结束
[root@root test02]# ./test03.sh
游戏开始
请输入第一个数字a=3
请输入第二个数字b=3
你和我输入的数字一样,都是3
游戏结束
[root@root test02]# ./test03.sh
游戏开始
请输入第一个数字a=lp
请输入第二个数字b=po
./test03.sh: line 29: [: lp: integer expression expected
./test03.sh: line 32: [: lp: integer expression expected
./test03.sh: line 35: [: lp: integer expression expected
./test03.sh: line 38: [: lp: integer expression expected
./test03.sh: line 41: [: lp: integer expression expected
./test03.sh: line 44: [: lp: integer expression expected
对不起,输入错误,无法比较
游戏结束
3、布尔运算符
布尔运算符又叫做逻辑运算符,主要进行逻辑运算,常见的逻辑运算有与或非
运算符 | 说明 | 记忆 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | 假作非时真亦假,真作非时假亦真 |
-o | 或运算,有一个表达式为 true 则返回 true。 | 一真即为真。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | 一假即为假,同真才为真。 |
案例
输入成绩,判断该学生的等级。
[root@root test02]# vim test01.sh
read -p "请输出您的成绩:source=" grade
if [ $grade -ge 90 ]
then
echo "您的成绩为$grade,优秀"
elif [ $grade -ge 80 -a $grade -lt 90 ]
then
echo "您的成绩为$grade,良好"
elif [ $grade -ge 70 -a $grade -lt 80 ]
then
echo "您的成绩为$grade,中等"
elif [ $grade -ge 60 -a $grade -lt 70 ]
then
echo "您的成绩为$grade,及格"
else
echo "您的成绩为$grade,没达到及格线"
fi
[root@root test02]# ./test01.sh
请输出您的成绩:source=56
您的成绩为56,没达到及格线
[root@root test02]# ./test01.sh
请输出您的成绩:source=78
您的成绩为78,中等
4、字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等 | [ $a = $b ] |
!= | 检测两个字符串是否不相等 | [ $a != $b ] |
-z | 检测字符串长度是否为0 | [ -z $a ] |
-n | 检测字符串长度是否不为 0 | [ -n “$a” ] |
$ | 检测字符串是否为空 | [ $a ] |
案例
随机输入两个字符串进行比较
[root@root test02]# vim test03.sh
echo "游戏开始"
read -p "请输入第一个字符串a=" a
read -p "请输入第二个字符串b=" b
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
#测试
[root@root test02]# ./test03.sh
游戏开始
请输入第一个字符串a=zxcv
请输入第二个字符串b=zxcd
zxcv = zxcd: a 不等于 b
zxcv != zxcd : a 不等于 b
-z zxcv : 字符串长度不为 0
-n zxcv : 字符串长度不为 0
zxcv : 字符串不为空
[root@root test02]# ./test03.sh
游戏开始
请输入第一个字符串a=
请输入第二个字符串b=
= : a 等于 b
!= : a 不等于 b
-z : 字符串长度为 0
-n : 字符串长度为 0
: 字符串为空
[root@root test02]#
5、文件测试运算符
文件测试运算符用于检测文件的各种属性。
操作符 | 说明 |
---|---|
-r file | 检测文件是否可读 |
-w file | 检测文件是否可写 |
-x file | 检测文件是否可执行 |
-s file | 检测文件是否为空 |
-e file | 检测文件(包括目录)是否存在 |
-b file | 检测文件是否是块设备文件 |
-c file | 检测文件是否是字符设备文件 |
-d file | 检测文件是否是目录 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件)。 |
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
- file 表示文件名(文件的具体路径)
案例
利用shell编写一个程序用来查看helloTwo.java文件的权限
[root@root test02]# vim test03.sh
file="/home/itbestboy/test02/helloTwo.java"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
#测试
[root@root test02]# ./test03.sh
文件可读
文件可写
文件不可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在
[root@root test02]# ll
total 24
-rw-r--r-- 1 root root 12 Aug 20 22:26 helloTwo.java