使用Shell脚本进行语句循环
📒博客主页: 微笑的段嘉许博客主页
🎉欢迎关注🔎点赞👍收藏⭐留言📝
📌本文由微笑的段嘉许原创!
📆51CTO首发时间:🌴2022年10月日24🌴
✉️坚持和努力一定能换来诗与远方!
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
⭐本文介绍⭐
除了上一篇文章介绍的if条件语句之外,(本文不再介绍if条件语句,感兴趣的小伙伴可以参考上一章介绍的使用Shell脚本进行条件测试)作为一种脚本编程语言,Shell同样包含循环,分支等其他程序控制结构,从而能够轻松完成更加复杂,强大的功能。本文将介绍for、while、case语句的具体应用。
📝理论讲解:
使用for循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态,根据IP地址黑名单设置拒绝访问的防火墙策略等。
当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重。本文将要介绍的for循环语句,可以很好地解决类似地问题。
for语句的结构
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,"取值列表"称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单)。
for语句的语法结构如下所示:
上述语句结构中,for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do...done之间的命令序列为循环体,其中的执行语句需要引用变量有完成相应的任务。
for语句的执行流程:首先将列表中的第一个取值赋给变量,并执行do...done循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环中的命令序列……依此类推,直到列表中的所有取值用完,最后将跳至done语句,表示结束循环,如下图所示:
使用While循环语句
for循环语句非常适用于列表对象无规则,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while语句。
while语句的结构
使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while循环语句的语法结构如下所示:
while语句的执行流程:首先判断while后的条件测试操作结果,如果条件成立,则执行do...done循环体中的命令序列;返回while后再次判断条件啊测试结果,如果条件仍然成立,则继续执行循环体;再次返回到while后,判断条件测试结果……如此循环,直到while后的条件测hi结果不再成立为止,最后跳转到done语句,表示结束循环,如下图所示;
使用while循环语句时,有两个特殊的条件测试操作,即true(真)false(假)了。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过exit语句退出脚本);反之,若使用false作为条件,则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。
使用case分支语句
上一篇文章介绍多分支的if语句时,曾经提到过该用case语句可以使脚本程序的结构更加清晰、层次分明,本文就来学习case语句的语法结构及应用。
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。
case分支语句的语法结构如下所示:
在上述语句结构中,关键字case后面跟的是"变量值",即"$变量名",这点需要与for循环语句的结构加以区别。整个分支结构包括在case...esac之间,中间的模式1、模式2、……、*对应为变量的不同取值(程序期望的取值),其中\*作为通配符,可匹配任意值。
case语句的执行流程:首先使用"变量值"与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号";;"后跳至esac,表示结束分支;若于模式1不相匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号";;"后跳至esac,表示结束分支……依此类推,若找不到任何匹配的值,则执行默认模式" *) "后的命令序列,直到玉娇案esac后结束分支,如图所示:
使用case分支语句时,有几个值得注意的特点如下所述。
- case行尾必须为单词"in",每一行模式必须以右括号" ) "结束。
- 双分号";;"表示命令序列的结束。
- 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]",还可以用竖杠符号" | "表示或,如"A|B"
- 最后的" *) "表示默认模式,其中的\*相当于通配符。
📖实验配置与实现:
推荐步骤:
for 循环应用
while 循环应用
case 服务控制脚本应用
实验步骤:
一、for 循环应用
1、使用 for 循环创建用户
1)创建用户列表
2)创建 for 循环脚本
3)添加脚本执行权限运行脚本
2、使用 for 脚本删除创建的用户
1)创建删除用户脚本
2)添加执行脚本权限运行脚本
3、使用 for 判断网路连通性
1)创建 IP 地址列表
2)创建判断主机连通性脚本
3)添加执行权限运行脚本
4、使用 for 结合 read -p 接收用户入 IP 地址使用 for 测试网络连通性
1) 创建脚本网络连通性脚本
2)运行脚本进行测试
二、while 循环应用
1、使用 while 创建 100 个以 benet 的用户名字
1)创建脚本文件
2)执行脚本
2、将创建的 100 个账户删除
1)编辑删除用户脚本
2)删除创建的用户
3、随机值进行判断,判断范围为 2 的 16 次方范围值内使用
1)创建随机值判断脚本
2) 运行脚本
三、case 服务控制脚本应用
1、使用 case 判断用户输入的是字符或者数字以及字母
1)创建脚本
2)运行脚本
2、配置 case 控制 vsftpd 服务
1)挂载系统光盘
2)系统光盘挂载到/mnt 目录
3) 安装 vsftpd 服务
4)创建脚本控制文件
5)运行验证脚本
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!