谷动谷力

 找回密码
 立即注册
查看: 2028|回复: 0
打印 上一主题 下一主题
收起左侧

【Linux命令脚本】使用Shell脚本进行语句循环

[复制链接]
跳转到指定楼层
楼主
发表于 2022-11-3 22:49:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【Linux命令脚本】使用Shell脚本进行语句循环


⭐本文介绍⭐
除了if条件语句之外,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语句,表示结束循环,如下图所示:



使用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语句的条件测试中。

使用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后结束分支,如图所示:

使用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)运行验证脚本
图片



640?wx_fmt=jpeg.jpg (27.75 KB, 下载次数: 48)

640?wx_fmt=jpeg.jpg

640?wx_fmt=jpeg.jpg (25.74 KB, 下载次数: 41)

640?wx_fmt=jpeg.jpg

本帖被以下淘专辑推荐:

  • · Shell|主题: 28, 订阅: 0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-27 05:12 , Processed in 0.086604 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表