使用Shell脚本进行语句循环

简介: 除了上一篇文章介绍的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语句,表示结束循环,如下图所示:


a1ed498bc44414d859f18f2e12287c8.png


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

bb49ab354e9d70668e50f646317486a.png


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


51942f71dace50242dc2e1ed606ac05.png

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

case行尾必须为单词"in",每一行模式必须以右括号" ) "结束。

双分号";;"表示命令序列的结束。

模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]",还可以用竖杠符号" | "表示或,如"A|B"

最后的" *) "表示默认模式,其中的\*相当于通配符。


📖实验配置与实现:


推荐步骤:


for 循环应用

while 循环应用

case 服务控制脚本应用


实验步骤:


一、for 循环应用


1、使用 for 循环创建用户


1)创建用户列表


12fd69fbeb9c8ac5ac82a437bbc4064.png


2)创建 for 循环脚本


502642dbee280f7679a197f9e55b9bd.png


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

fdaded7fd6a8f68d479090dcfd318b3.png


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


1)创建删除用户脚本

521f4fb6708f6f9fef77eabad5378ef.png


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


475049379d65eff6c4929e0258fa783.png


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


1)创建 IP 地址列表


cbeb6841b0ba0745567a850a0f8ca48.png


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


a701bbb7ba0631cf93e6f206edb3125.png


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

fedb867155494a9f2d753a05868e25d.png



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


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

4067ad41a15e8ed89cf8e8f9fdbfb3e.png

2)运行脚本进行测试


b080c87b742711ca725cfc52c8cf868.png


二、while 循环应用


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


1)创建脚本文件


1bc889f45d43feb658cd97a4e4f7b41.png


2)执行脚本


cad7bf34aa3a69f6f53149432e90295.png


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


1)编辑删除用户脚本

fb3c485aefd3125bc521acc5ac5c3d9.png


2)删除创建的用户

8c423a7f72fcd1dfe8fe7eb5bf93e7b.png


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


1)创建随机值判断脚本


86e82b9161730f5924326df673b9efb.png


2) 运行脚本


fc858aca06b6cb709f167d0799ab1de.png


三、case 服务控制脚本应用


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


1)创建脚本


1675864382423.png


2)运行脚本


ea1b707c2906291c50280cf89656b97.png


2、配置 case 控制 vsftpd 服务


1)挂载系统光盘


cc508996a17a0cbfab1ab1b0c0bded1.png


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

c53b453e79edaf6a477ba8ce1cdf91f.png

0239e0b58cd4f941c5d5d23aaa56af4.png


3) 安装 vsftpd 服务

2b5870a9459711cc7f163f3a7ed1ecb.png


4)创建脚本控制文件


f9cafcd6e4f6242be9c9fdea6c6e0be.png


5)运行验证脚本


d92663e4eecd041a8af5cfe29022233.png

相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
385 10
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
253 2
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
237 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
460 1
|
6月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
156 17
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
178 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
358 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
588 25