Linux Shell编程之运算符

在这里插入图片描述

Shell运算符

Shell 支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

1、算数运算符

bash默认是字符串,原生的shell不支持数值运算,如果要进行数值运算时需要进行转化,通常由三种方式可以进行转化:

  1. expr 表达式,注意空格,即表达式和运算符之间要有空格,完整的表达式要被 ` 包含,注意这个字符不是常用的单引号。
  2. $((运算式))或$[运算式]
  3. declare -i
  4. 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

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值