当前位置:网站首页>shell编程之条件语句
shell编程之条件语句
2022-08-03 12:16:00 【光的方向79】
目录
9[0-9]) //表示90到99[78][0-9]) //表示70到89[0-9]|[1-5][0-9] ) //表示0-9 和10-59 |表示或
引言
在简单的Shell脚本程序中,各语句将按先后顺序依次执行,从而实现批处理的自动化过程。然而,单一的顺序结构使得脚本过于机械化,不够智能,难以处理更加灵活的系统任务。
本文主要讲了如何进行条件测试操作,并通过正确使用if语句,使用Shell脚本具有一定的“判断”能力,以根据不同条件来完成不同的管理任务。
一、条件测试
- Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功,当返回值为0时表示成功,否则表示失败或异常(非0值)。
- 使用专门的测试工具 test 命令,可以对特定条件进行测试,并根据返回值(值为0)来判断是否成立。
test命令格式如下:
test 条件表达式
或
[ 条件表达式 ] #条件表达式的两边都需要有空格,且此方法更为常用
或
[[ 条件表达式 ]]
1、文件测试
文件测试指的是根据给定的路径名称,判断对应的文件还是目录,或者判断文件是否可读、可写、可执行等。
[ 操作符 文件或目录 ] (注意两端要有空格)
常用操作选项如下
| 常用操作符 | 说明 |
| -d | 测试是否为目录(Directory) |
| -e | 测试目录或文件是否存在(Exit) |
| -f | 测试是否为文件(File) |
| -r | 测试当前用户是否有权限读取(Read) |
| -w | 测试当前用户是否有权限写入(Write) |
| -x | 测试当前用户是否有权限执行(Excute) |
| -b | 测试是否为设备文件 |
| -c | 测试是否为字符文件 |
| -s | 测试存在且文件大小为空 |
| -L | 测试是否为连接文件 |
1、用text命令测试

2、用[ 条件表达式 ]测试

3、使用[[]]也可以进行条件测试,下面的命令可以判断当前目录下是否存在名为lichen的文件。当输出结果为“0”时,表示文件存在;当输出结果为“1”时,表示文件不存在。

4、test命令中用于判断文件的选项有很多,从文件个数上分类的话,可以分为单个文件的判断和两个文件之间的比较。其中判断单个文件的最常用的选项是“-f”选项。
在比较两个文件时,常用的选项有:
-nt:判断文件A是否比文件B新
-ot:判断文件A是否比文件B旧
-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode。
2、整数值比较
整数值比较是指根据给定的两个整数值来判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。
基本格式和常用选项如下:
| 格式 | 说明 |
| -eq | 等于 |
| -ne | 不等于 |
| -gt | 大于 |
| -lt | 小于 |
| -le | 小于或等于 |
| -ge | 大于或等于 |
1、若要判断当前已登录的用户数,当小于5个时输出“太少了”。

2、以MB为单位输出内存信息,提取Mem的空闲内存(free)数值通过命令替换赋值给变量FREE。当空闲内存的数值小于等于2000时,输出内存不足;当空闲内存的数值大于2000时,输出内存充足。


3、字符串比较
字符串比较通常用来检查用户输入、系统环境等是满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置参数是否符合要求。
格式:
[ 字符串1=字符串2 ]
[ 字符串1!=字符串2 ]
[ -z 字符串 ]
常用的测试操作符:
=:第一个字符串和第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反
-z:字符串内容为空
1、判断当前系统的语言环境

2、测试空字符串

3、交互操作,用户输入yes或no来确认某个任务。

4、逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同条件时,判断是根据这些条件同时成立还是只要有其中一个成立等情况,需要有一个测试过程。
格式:
[ 表达式1 ] 操作符 [ 表达式2 ]
命令1 操作符 命令2
常用的测试操作符
&&:逻辑与,表示而且,只有当两个条件都成立时,整个测试命令的返回值才为0(结果成立)。
使用Test命令测试时,“&&”可改为“-a”。
||:逻辑或,表示或者,只要前后两个条件有一个成立,整个测试命令的返回值即为0(结果成立)。
使用Test命令测试时,“||”可改为“-o”。
!:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。

例如:判断当前Linux系统的内核版本是否大于3.7

二、if语句
1、单分支的if语句
单分支if语句:对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。
语法格式:
if 条件测试操作
then
命令序列
fi
单分支if语句的执行流程:首先判断条件测试操作的结果,结果返回值为0,表示条件成立,则执行then后面的命令序列,一直遇到fi结束判断为止,继续执行其他代码。如果返回值不为0,则忽略then后面的命令序列,直接跳至fi行以后执行其他脚本代码。
举例:
1、判断挂载点目录是否存在,若不存在则新建目录

2、判断文件是否为脚本文件

2、双分支的if语句
对于双分支的选择结构,要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作。
语法格式
if 条件测试操作
then
命令序列1
else
命令序列2
fi
双分支if语句的执行流程:首先判断条件测试操作的结果,如果条件成立,则执行then后面的命令序列1,忽略else及后面的命令序列2,直到遇见fi结束判断;如果条件不成立,则忽略then及后面的命令序列1,直接跳至else后面的命令序列2并执行,直到遇见fi结束判断。
举例:
1、测试主机是否开启

2、判断用户是否存在,不存在则创建新用户

3、判断Apache服务是否存在,不存在则执行脚本安装(服务正在运行中)

删除httpd服务,并查看是否存在。然后执行apache脚本安装

4、查看当前用户是否为root用户,是root用户则安装vsftpd服务,并查看状态

3、多分支的if语句
多分支结构能够根据多个互斥的条件分别执行不同的操作,实际上等同于嵌套使用的if语句。

需求:评委被投诉后,现将女生、男生需要区分开来,女生7-10分为优秀,男生8-10分为优秀,女生的学号为1-10 男生的学号为11-20 ,请以交互时的方式询问“请输入参赛学员的学号(1-20):”,最后输出"该学生为男生/女生,成绩为优秀"

数字炸弹游戏: 要求在1-100内定义一个数字,与用户交互,要求,每次提醒用户,数字猜大了还是猜小了,直到猜中为止,最后统计猜的次数
PS:每次猜的数字不允许重复(脚本自身检测)


需求:评委被投诉后,现将女生、男生需要区分开来,女生7-10分为优秀,男生8-10分为优秀,女生的学号为1-10 男生的学号为11-20 ,请以交互时的方式询问“请输入参赛学员的学号(1-20):”,最后输出"该学生为男生/女生,成绩为优秀"

三、case分支语句
case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写。
case 语句主要适用于以下情况: 某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值。
1、case语句的结构
case 变量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
……
*)
默认命令序列
esac
2、case语句注意事项
- case行首必须为单词“in”,每一模式必须以单个右括号")"结束
- 双分号";;"表示命令序列的结束
- 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]",还可以用竖杠符号 “|”表示或,如“A|B”。
- 最后的*)表示默认模式,其中的*相当于通配符
3、case语句应用示例
1、编写查看季度的脚本
9[0-9]) //表示90到99
[78][0-9]) //表示70到89
[0-9]|[1-5][0-9] ) //表示0-9 和10-59 |表示或
四、总结
本章主要讲了条件测试,包括文件测试、整数值比较、字符串比较和逻辑测试。以及如何使用if语句和case语句。if语句又分为单分支、双分支以及多分支,单分支和多分支应用较少,一般嵌套if语句用的较多,case语句较if语句来说较简单。
边栏推荐
- Filebeat 如何保持文件状态?
- bash case用法
- 自律成就自己
- flink流批一体有啥条件,数据源是从mysql批量分片读取,为啥设置成批量模式就不行
- AMS simulation
- "Digital Economy Panorama White Paper" Financial Digital User Chapter released!
- 肝完Alibaba这份面试通关宝典,我成功拿下今年第15个Offer
- From scratch Blazor Server (6) - authentication based on strategy
- 别再用if-else了,分享一下我使用“策略模式”的项目经验...
- 苹果发布 AI 生成模型 GAUDI,文字生成 3D 场景
猜你喜欢

fastposter v2.9.0 programmer must-have poster generator

长城简漫·暑期安全篇⑤ 这个强,不能逞

How does Filebeat maintain file state?

YOLOv5训练数据提示No labels found、with_suffix使用、yolov5训练时出现WARNING: Ignoring corrupted image and/or label

图像融合DDcGAN学习笔记

随机森林项目实战---气温预测

子结点的数量

4500 words sum up, a software test engineer need to master the skill books

海外代购系统/代购网站怎么搭建——源码解析

特征降维学习笔记(pca和lda)(1)
随机推荐
【Verilog】HDLBits题解——Verification: Writing Testbenches
LeetCode刷题笔记:622.设计循环队列
bash for循环
C language advanced article: memory function
图像融合SDDGAN文章学习
从零开始C语言精讲篇5:指针
R语言绘制时间序列的自相关函数图:使用acf函数可视化时间序列数据的自相关系数图
Blazor Server(6) from scratch--policy-based permission verification
php microtime 封装工具类,计算接口运行时间(打断点)
R language ggplot2 visualization: use the patchwork bag plot_layout function will be more visual image together, ncol parameter specifies the number of rows, specify byrow parameters configuration dia
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
nacos应用
Matlab学习11-图像处理之图像变换
Random forest project combat - temperature prediction
一文带你弄懂 CDN 技术的原理
fastposter v2.9.0 程序员必备海报生成器
一次内存泄露排查小结
分享一款实用的太阳能充电电路(室内光照可用)
Feature dimensionality reduction study notes (pca and lda) (1)
Vs Shortcut Keys---Explore Different Programming