使用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

相关文章
|
1月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
75 1
|
17天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
39 2
6种方法打造出色的Shell脚本
|
3天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
12 1
|
8天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
22 2
|
22天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
43 6
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
65 12
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
49 2
|
2月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
429 2