你说shell编程的条件语句太难,我说那是你没看过这篇博客。

一、条件测试操作

(一)、 条件测试操作

1、test命令

测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值

格式1:test 条件表达式
格式2:[ 条件表达式 ]  (条件表达式的两边都需要有空格,且此方法更为常用)

(二)、文件测试

1、文件测试基本格式

[ 操作符 文件或目录 ]       (注意两端要有空格)
&?  返回0表示条件成立,返回非零值表示条件不成立
&&  逻辑与,"而且"的意思
||  逻辑或,"或者"的意思

2、常见的测试操作符

常见的测试操作符 解释
-d 测试是否为目录(directory)
-e 测试目录或文件是否存在(Exist)
-f 测试是否为文件(File)
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试当前用户是否有权限执行(eXcute)

举例:

[root@localhost ~]#[ -f 111.txt ]     #测试111.txt这个文件是否成立
[root@localhost ~]#echo $?     #上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
0               #返回为0,说明表达式执行正常
[root@localhost ~]#[ -f 111.txt ] && echo "yes"      #也可以使用&&这个符号在后面带上语句,当&&前面的语句执行成功以后,才会继续执行&&后面的语句,否则不会执行&&后面的语句。
yes

[root@localhost ~]#touch 222      #创建一个222的目录
[root@localhost ~]#ls
111.txt  anaconda-ks.cfg       name.sh  公共  视频  文档  音乐
222      initial-setup-ks.cfg  nnn.sh   模板  图片  下载  桌面
[root@localhost ~]#[ -f man ]       #测试man是否为文件
[root@localhost ~]#echo $?        #执行上一条命令后返回状态
1                  #返回为1,说明执行异常
 [root@localhost ~]#test -f man    #同样也可以使用test命令进行测试,test与[]的作用相同
[root@localhost ~]#echo $?
1

(三)、整数测试

1、整数值比较

命令基本格式
[ 整数1 操作符 整数2 ]	

2、常用的测试操作符

操作符 解释
-eq 等于(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 13:58 (192.168.200.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@localhost ~]#free   #显示当前的内存的容量,Men表示物理内存,Swap表示虚拟内存
              total        used        free      shared  buff/cache   available
Mem:        1867024      314892     1091840        9256      460292     1334460
Swap:       4194300           0     4194300
[root@localhost ~]#free -m    #使用-m表示以M(兆)为单位显示
              total        used        free      shared  buff/cache   available
Mem:           1823         307        1066           9         449        1303
Swap:          4095           0        4095
[root@localhost ~]#free -h     #-h 表示以更人性化的方式显示,该选项只有在centos7以上的版本才有用
              total        used        free      shared  buff/cache   available
Mem:           1.8G        307M        1.0G        9.0M        449M        1.3G
Swap:          4.0G          0B        4.0G

#Awk工具介绍
Awk是一个功能强大的编辑工具,用于在Linux/UNIK下对文本和数据进行处理。数据可以来自一个或多个文件,也可以为其他命令的输出,常作为脚本来使用。在执行操作时,Awk逐行读取文本,默认以空格为分割符进行分隔,将分隔所得的各个字段保存在内建变量中,对比改行是否与给定的模式相匹配,并按模式或者条件执行编辑命令,也可以从脚本中调用编辑指令过滤输出相应内容。

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

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

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

[root@gcc ~]#echo "1.1 + 2.2" | bc  #使用bc进行浮点型运算,此处+两边可以加空格也可以不加
3.3
[root@gcc ~]#echo "1.1 + 2.2" > 12.txt     #将算式赋值给12.txt文本
[root@gcc ~]#cat 12.txt        
1.1 + 2.2
[root@gcc ~]#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@gcc ~]#cat 12.txt | bc       #也可以使用cat | bc 运算
3.3
[root@gcc ~]#echo $(awk BEGIN'{print 1.1+2.2}')        #也可以使用awk BEGIN进行浮点运算
3.3

(四)、字符串测试

1、字符串比较

常用的格式:

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

2、常用的测试操作符:

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

举例:

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

(五)、逻辑测试

1、基本格式

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

2、常用的测试操作符

常用的测试操作符 解释
&& 逻辑与,“而且”的意思,使用test命令测试时,可将“&&”改为“-a”
|| 逻辑或,“或者”的意思,使用test命令测试时,可将“||”改为“-o”
逻辑否

注意:&&符号不可以在一个[]中使用,但是可以在两个[]之间使用

举例:

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

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

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

二:if语句

(一)、if单分支语句

单分支结构(基本格式):
if 条件测试操作
	then  命令序列
fi
单分支结构(举例):
if 磁盘已用空间>80%
	then  报警
fi

在这里插入图片描述

(二)、if双分支语句

双分支结构(基本格式):
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi
双分支结构(举例):
if 80端口是否在监听
	then  网站服务已在运行
	else  启动httpd服务
fi

在这里插入图片描述

(三)、if多分支语句

多分支结构(基本格式):
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi
多分支结构(举例):
if 分数为85~100之间
	then  判为优秀
elif  分数为70~84之间
	then  判为合格
else
	判为不合格
fi

在这里插入图片描述

(四)、if语句实操演示

1、单分支if语句

判断大小

vim a.sh
if [ 3 -gt 2 ]     #如果3大于2
then          #成立的话
    echo "OK"       #输出OK
fi           #结束
---------或者if语句可以写成-----------
if [ 3 -gt 2 ];then echo "OK"; fi
----------或者还可以写成--------------
[ 3 -gt 2 ]  && echo "OK"
----------------------------------------------
[root@gcc ~]#sh a.sh       #运行脚本
OK                         #输出结果

2、多分支if语句

判断成绩是否合格

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语句

(一)、case多分支语句

1、case语句的结构

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

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac
举例:
case 分数 in
85~100)
	评为优秀
	;;
70~84)
	评为合格
	;;
	....
*)
	判为不合格
esac

在这里插入图片描述

(二)、case语句实操:

判断分数是否及格

[root@gcc ~]#vim socre.sh
case NUM in 
[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
输入有误!

猜你喜欢

转载自blog.csdn.net/Gengchenchen/article/details/111291622