使用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语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do...done之间的命令序列为循环体,其中的执行语句需要引用变量有完成相应的任务。

for语句的执行流程:首先将列表中的第一个取值赋给变量,并执行do...done循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环中的命令序列……依此类推,直到列表中的所有取值用完,最后将跳至done语句,表示结束循环,如下图所示:

使用Shell脚本进行语句循环_for语句

使用While循环语句

for循环语句非常适用于列表对象无规则,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while语句。

while语句的结构

使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。

while循环语句的语法结构如下所示:

while 条件测试
do
命令序列
done

while语句的执行流程:首先判断while后的条件测试操作结果,如果条件成立,则执行do...done循环体中的命令序列;返回while后再次判断条件啊测试结果,如果条件仍然成立,则继续执行循环体;再次返回到while后,判断条件测试结果……如此循环,直到while后的条件测hi结果不再成立为止,最后跳转到done语句,表示结束循环,如下图所示;

使用while循环语句时,有两个特殊的条件测试操作,即true(真)false(假)了。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过exit语句退出脚本);反之,若使用false作为条件,则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。

使用Shell脚本进行语句循环_for循环_02

使用case分支语句

上一篇文章介绍多分支的if语句时,曾经提到过该用case语句可以使脚本程序的结构更加清晰、层次分明,本文就来学习case语句的语法结构及应用。

case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。

case分支语句的语法结构如下所示:

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

在上述语句结构中,关键字case后面跟的是"变量值",即"$变量名",这点需要与for循环语句的结构加以区别。整个分支结构包括在case...esac之间,中间的模式1、模式2、……、*对应为变量的不同取值(程序期望的取值),其中\*作为通配符,可匹配任意值。

case语句的执行流程:首先使用"变量值"与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号";;"后跳至esac,表示结束分支;若于模式1不相匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号";;"后跳至esac,表示结束分支……依此类推,若找不到任何匹配的值,则执行默认模式" *) "后的命令序列,直到玉娇案esac后结束分支,如图所示:

使用Shell脚本进行语句循环_for循环_03

使用case分支语句时,有几个值得注意的特点如下所述。

  • case行尾必须为单词"in",每一行模式必须以右括号" ) "结束。
  • 双分号";;"表示命令序列的结束。
  • 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]",还可以用竖杠符号" | "表示或,如"A|B"
  • 最后的" *) "表示默认模式,其中的\*相当于通配符。

📖实验配置与实现:

推荐步骤

for 循环应用

while 循环应用

case 服务控制脚本应用

实验步骤

一、for 循环应用

1、使用 for 循环创建用户

1)创建用户列表

使用Shell脚本进行语句循环_vsftpd_04

2)创建 for 循环脚本

使用Shell脚本进行语句循环_for循环_05

3)添加脚本执行权限运行脚本

使用Shell脚本进行语句循环_for语句_06

2、使用 for 脚本删除创建的用户

1)创建删除用户脚本

使用Shell脚本进行语句循环_vsftpd_07

2)添加执行脚本权限运行脚本

使用Shell脚本进行语句循环_for循环_08

3、使用 for 判断网路连通性

1)创建 IP 地址列表

使用Shell脚本进行语句循环_取值_09

2)创建判断主机连通性脚本

使用Shell脚本进行语句循环_取值_10

3)添加执行权限运行脚本

使用Shell脚本进行语句循环_Shell_11

4、使用 for 结合 read -p 接收用户入 IP 地址使用 for 测试网络连通性

1) 创建脚本网络连通性脚本

使用Shell脚本进行语句循环_Shell_12

2)运行脚本进行测试

使用Shell脚本进行语句循环_Shell_13

二、while 循环应用

1、使用 while 创建 100 个以 benet 的用户名字

1)创建脚本文件

使用Shell脚本进行语句循环_取值_14

2)执行脚本

使用Shell脚本进行语句循环_for循环_15

2、将创建的 100 个账户删除

1)编辑删除用户脚本

使用Shell脚本进行语句循环_for循环_16

2)删除创建的用户

使用Shell脚本进行语句循环_Shell_17

3、随机值进行判断,判断范围为 2 的 16 次方范围值内使用

1)创建随机值判断脚本

使用Shell脚本进行语句循环_Shell_18

2) 运行脚本

使用Shell脚本进行语句循环_for语句_19

三、case 服务控制脚本应用

1、使用 case 判断用户输入的是字符或者数字以及字母

1)创建脚本

使用Shell脚本进行语句循环_for循环_20

2)运行脚本

使用Shell脚本进行语句循环_Shell_21

2、配置 case 控制 vsftpd 服务

1)挂载系统光盘

使用Shell脚本进行语句循环_for语句_22

2)系统光盘挂载到/mnt 目录

使用Shell脚本进行语句循环_取值_23

使用Shell脚本进行语句循环_Shell_24

3) 安装 vsftpd 服务

使用Shell脚本进行语句循环_vsftpd_25

4)创建脚本控制文件

使用Shell脚本进行语句循环_vsftpd_26

5)运行验证脚本

使用Shell脚本进行语句循环_vsftpd_27


🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

使用Shell脚本进行语句循环_vsftpd_28