胎教运维!!!手把手教你 玩转shell脚本条件语句

一、条件测试操作

(1)、test命令 (后面测试皆以test为基础)

测试表达式是否成立,若成立返回0,否则返回其他数值

格式1: test 条件表达式 

格式2: [ 条件表达式 ]  ##中括号两边至少要有1个空格
(2)、文件测试
 1|  [ 操作符 文件或目录 ]

常用的测试操作符:

-d:测试是否为目录(Directory)
 
-e:测试目录或文件是否存在(Exist)

-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(excute)

在这里插入图片描述

(3)、整数值比较
   [ 整数1 操作符 整数2 ]

常用的测试操作符:

-eq:等F(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

在这里插入图片描述

[root@localhost ~]#who     #查看此台主机有多少用户正在登录
root     pts/0        2020-12-16 21:36 (192.168.182.1)    
[root@localhost ~]#who | wc -l      #加上| 符号后使用wc -l命令可以显示登录的用户数
1 
[root@localhost ~]#[ $(who | wc -l) -gt 0 ] && echo "too many"   #使用“[]”测试语句,当正在登录的用户“-gt”(表示大于) 0时,&&(表示输出)  输出too many ,$(who | wc -l )表示引用()中的变量的结果。
too many   #输出结果为too many 
[root@localhost ~]#[ $(who | wc -l) -ge 5 ] && echo ">=5"   #当登录的用户大于等于5时,输出>=5,否则不输出。

在这里插入图片描述

[root@local host ~]#free -m
              total        used        free      shared  buff/cache   available
Mem:           1823         281        1177           9         364        1347
Swap:          4095           0        4095
[root@local host ~]#free -m | grep "Mem:" | awk '{print $4}'  #将free -m中的结果中的Mem过滤出来,并打印出第四列的内容,第四列是free的内容
1177
[root@local host ~]#abc=$(free -m | grep "Mem:" | awk '{print $4}')  #接着将上面的一段变量赋值给abc,然后就可以直接调用变量名就可以查看变量值了。
[root@local host ~]#echo $abc
1177
[root@local host ~]#[ $abc -lt 1200 ] && echo "当前内存为${abc}MB,请及时清理!"  #使用“[]”判断语句,判断内存是否 -lt(表示小于)1200MB,注意,后面的echo输出中的语句在$abc前后需要加上{},因为我们之定义了这一个变量,不加{}就连着后面的MB作为一个整体,就不是一个变量名了。
当前内存为1177MB,请及时清理!  #根据上面的判断语句显示出来的结果

[root@local host ~]#free -m | grep "Mem:" | awk '{print $3/$2}'       #使用awk进行除法运算,算出使用率。 $3是空闲内存,$2是total总内存
0.154142

补充:浮点运算,即小数点运算,使用 bc 命令

[root@local host ~]#echo "1.1 + 2.2" | bc  #使用bc进行浮点型运算,此处+两边可以加空格也可以不加
3.3
[root@local host ~]#echo "1.1 + 2.2" > 12.txt     #将算式赋值给12.txt文本
[root@gcc ~]#cat 12.txt        
1.1 + 2.2
[root@local host ~]#bc 12.txt       #可以直接使用bc运算12.txt的文本中的内容
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'. 
3.3      #该处是运算的结果
^C
(interrupt) Exiting bc.
[root@local host ~]#cat 12.txt | bc       #也可以使用cat | bc 运算
3.3
[root@local host ~]#echo $(awk BEGIN'{print 1.1+2.2}')        #也可以使用awk BEGIN进行浮点运算
3.3
(4)、字符串测试

1)、常用的格式:

格式一:[ 字符串1 = 字符串2 ]

	   [ 字符串1 != 字符串2 ]
	   
格式二:[ -z 字符串 ]

2)、常用的测试操作符:

常用的测试操作符解释
=第一个字符串与第二个字符串内容相同
!=第一个字符串与第二个字符串内容不同,!号表示相反的意思
-z检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
-n检测字符串是否存在

在进行字符串的测试时,用引号将字符串界定起来是一个非常好的习惯。

测试(1):

#定义两个变量
[root@local host ~]# a="hello"
[root@local host ~]# b="world"

#比较两个字符串是不是相等
[root@local host ~]# [ $a = $b  ]
# echo $?的返回值为1,表示两个字符串变量不相等
[root@local host ~]# echo $?
1

#比较两个字符串是不是不相等
[root@local host ~]# [ $a != $b  ] 
# echo $?的返回值为0,表示两个字符串变量是不相等
[root@local host ~]# echo $?
0

测试(2):

[root@local host ~]#read -p "思聪是不是姓王:yes/no" ack     #从键盘输入内容为变量赋值,变量名为ack
思聪是不是姓王:yes/noyes       
[root@local host ~]#echo $ack
yes
[root@local host ~]#[ $ack = "yes" ] && echo "王思聪"   #使用判断语句,使用=表示左右两边相等,然后输出字符串“王思聪”
王思聪
[root@local host ~]#[ $ack != "no" ] && echo "李思聪"      #测试操作符!=两边表示不相等,判断师傅不相等,然后输出“李思聪”
李思聪
(5)、逻辑测试

1、基本格式

格式一: [ 表达式1 ] 操作符 [ 表达式2 ] ...

格式二: 命令1 操作符 命令2 ...

2、常用的测试操作符
在这里插入图片描述

&&、| | 操作符能够正常存在于[ [ ] ]条件判断结构中,但是如果出现在[ ] 结构中的话,被报错。
例如:
在这里插入图片描述

逻辑测试举例:

[root@local host ~]#a=5
[root@local host ~]#[ $a -ne 1 ] && [ $a -lt 8 ]   #在两个[]之间可以使用&& 
[root@local host ~]#echo $?
0
[root@local host ~]#[ $a -ne 1 && $a -lt 8 ]        #而在一个[]之间不可以使用&&
-bash: [: 缺少 `]'
[root@local host ~]#[[ $a -ne 1 && $a -lt 8 ]]       #但是改成两个[]就可以使用&&
[root@local host ~]#echo $?  
0

[root@local host ~]#[ $a -ne 1 ] -a [ $a -lt 8 ]      #在两个[]之间不可以使用 -a
-bash: [: 参数太多
[root@local host ~]#[ $a -ne 1 -a $a -lt 8 ]        #-a 只可以在一个[]之间使用
[root@local host ~]#echo $?
0

[root@local host ~]#[ $a -eq  5 ] && echo true || echo fale      #使用||判断前面的条件是否成立,成立输出true,不成立输出flase
true
[root@local host ~]#[ $a -ne  5 ] && echo true || echo fale      
fale

二、if语句

1、单分支结构
if     条件测试操作                       if 已用磁盘>80%
  then 命令序列          👉                then 报警   
fi  									fi

在这里插入图片描述

#!/bin/bash
#this is my first shell-script
   if [ 5 -ne 6 ]           #如果5不等于6
   then                      #成立的话
   echo "yes"              #输出ok
fi                  #结束
2、多分支结构
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi

举例:判断成绩是否合格

vim b.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" score
if [ $score -ge 85 ] && [ $score -le 100 ]
then
     echo "$score 分,优秀!"
elif [ $score -ge 70 ]  && [ $score -le 84 ]
then
     echo "$score 分,合格!"
else
     echo "$score 分,不合格!"
fi

[root@gcc ~]#sh b.sh
请输入你的分数(0-100):90
90 分,优秀!
[root@gcc ~]#sh b.sh
请输入你的分数(0-100):50
50 分,不合格!
[root@gcc ~]#sh b.sh
请输入你的分数(0-100):80
80 分,合格!

三、case语句

1、case语句的结构

case多分支结构
在这里插入图片描述

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac

举例:
case 分数 in
85~100)
	评为优秀
	;;
70~84)
	评为合格
	;;
	....
*)
	判为不合格
esac

针对变量额不同取值,分别执行不同的命令序列
这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值
case行尾必须为单词“in”,每一模式必须以右括号“)”结束。
双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示“或”,如“A|B”.
最后的 " ) " 表示默认模式,其中的相当于通配符。

case语句实操:
判断分数是否及格

[root@gcc ~]#vim socre.sh
[89][0-9]|100)                     #这边表示的是从80分到100分,两位数的时候需要把十位和个位分开写,[89]表示十位上的8和9,[0-9]表示各位上的0-9,“|”表示或的意思。
          echo "$NUM,秀儿"       
          ;;                       #固定格式
[67][0-9])                         #表示从60分到79分
          echo "$NUM,soso"
          ;;

[0-5][0-9]|[0-9])                   #表示0到59分 ,“|”前面的表示从00-59,后面的表示0-9.
          echo "$NUM,努力"
          ;;

*)                            #表示除0-100以外的任何字符
          echo "输入有误!"
esac                           #结束语句

[root@gcc ~]#chmod +x socre.sh 
[root@gcc ~]#./socre.sh 
请输入你的分数:80
80,秀儿
[root@gcc ~]#./socre.sh 
请输入你的分数:60
60,soso
[root@gcc ~]#./socre.sh 
请输入你的分数:15
15,努力
[root@gcc ~]#./socre.sh 
请输入你的分数:100000
输入有误!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值