Skip to main content

moregeek program

使用shell脚本进行语句循环_段嘉许的博客-多极客编程

使用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脚本进行语句循环_for语句_04

2)创建 for 循环脚本

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

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

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

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

1)创建删除用户脚本

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

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

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

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

1)创建 IP 地址列表

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

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

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

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

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

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

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

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

2)运行脚本进行测试

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

二、while 循环应用

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

1)创建脚本文件

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

2)执行脚本

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

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

1)编辑删除用户脚本

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

2)删除创建的用户

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

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

1)创建随机值判断脚本

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

2) 运行脚本

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

三、case 服务控制脚本应用

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

1)创建脚本

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

2)运行脚本

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

2、配置 case 控制 vsftpd 服务

1)挂载系统光盘

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

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

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

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

3) 安装 vsftpd 服务

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

4)创建脚本控制文件

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

5)运行验证脚本

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


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

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

©著作权归作者所有:来自51CTO博客作者微笑的段嘉许的原创作品,请联系作者获取转载授权,否则将追究法律责任

k8s基础篇 pod(八)pod常见的状态和重启策略_清晨的博客-多极客编程

8.1 常见的pod状态Pod的status定义在PodStatus对象中,其中有一个phase字段。它简单描述了Pod在其生命周期的阶段。熟悉Pod的各种状态对我们理解如何设置Pod的调度策略、重启策略是很有必要的。下面是 phase 可能的值,也就是pod常见的状态:1、挂起(Pending):我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了pod但

脚本应用_嘎嘣脆的博客-多极客编程

Shell脚本应用(一)简介:随着Linux系统在企业的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。本文将主要学习Shell脚本基础,变量使用等知识,要求学会简单编写的脚本。理论知识:Shell脚本基础在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,

ansible中的block用法_清晨的博客-多极客编程

一、概述block是ansible在2.0版本引入的一个特性 ##ansible2.0之下的版本无法使用块功能可以将任务进行逻辑分组,并且可以在块级别上应用任务变量。同时也可以使用类似于其他编程语言处理异常那样的方法,来处理块内部的任务异常。原理:block中的组任务,都会继承block的属相(支持when,不支持with_items)部署时会分别执行组中的任务,并且都会继承block的属相(在任

函数练习_gavenlee的博客-多极客编程

编写函数,实现OS的版本判断OS (){cat /etc/os-release | sed -nE 's/^PRETTY_NAME="(.*)"/\1/gp'}编写函数,实现取出当前系统eth0的IP地址IP (){ip addr show dev eth0 | sed -En 's/inet *(([0-9]{1,3}\.){3}[0-9]{1,3})\/.*/\1/gp' | tr -d "

使用shell脚本安装mysql_段嘉许的博客-多极客编程

使用Shell脚本安装MySQL📒博客主页: ​​微笑的段嘉许博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝📌本文由微笑的段嘉许原创!📆51CTO首发时间:🌴2022年10月日20🌴✉️坚持和努力一定能换来诗与远方!🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!⭐本文介绍⭐随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来

docker笔记:收集docker常用的一些命令_it技术分享社区的博客-多极客编程

今天给大家梳理常用的一些Docker命令,供大家参考。1、容器镜像清理删除相关命令强制关闭所有正在运行的容器docker kill $(docker ps -a -q)删除所有已停止运行的容器docker rm $(docker ps -a -q)删除退出状态的容器docker rm $(docker ps -qf status=exited)删除所有未打上 mytag 标签的镜像docker r

k8s基础篇 pod(八)pod常见的状态和重启策略_清晨的博客-多极客编程

8.1 常见的pod状态Pod的status定义在PodStatus对象中,其中有一个phase字段。它简单描述了Pod在其生命周期的阶段。熟悉Pod的各种状态对我们理解如何设置Pod的调度策略、重启策略是很有必要的。下面是 phase 可能的值,也就是pod常见的状态:1、挂起(Pending):我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了pod但

脚本应用_嘎嘣脆的博客-多极客编程

Shell脚本应用(一)简介:随着Linux系统在企业的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。本文将主要学习Shell脚本基础,变量使用等知识,要求学会简单编写的脚本。理论知识:Shell脚本基础在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,

ansible中的block用法_清晨的博客-多极客编程

一、概述block是ansible在2.0版本引入的一个特性 ##ansible2.0之下的版本无法使用块功能可以将任务进行逻辑分组,并且可以在块级别上应用任务变量。同时也可以使用类似于其他编程语言处理异常那样的方法,来处理块内部的任务异常。原理:block中的组任务,都会继承block的属相(支持when,不支持with_items)部署时会分别执行组中的任务,并且都会继承block的属相(在任

函数练习_gavenlee的博客-多极客编程

编写函数,实现OS的版本判断OS (){cat /etc/os-release | sed -nE 's/^PRETTY_NAME="(.*)"/\1/gp'}编写函数,实现取出当前系统eth0的IP地址IP (){ip addr show dev eth0 | sed -En 's/inet *(([0-9]{1,3}\.){3}[0-9]{1,3})\/.*/\1/gp' | tr -d "

使用shell脚本安装mysql_段嘉许的博客-多极客编程

使用Shell脚本安装MySQL📒博客主页: ​​微笑的段嘉许博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝📌本文由微笑的段嘉许原创!📆51CTO首发时间:🌴2022年10月日20🌴✉️坚持和努力一定能换来诗与远方!🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!⭐本文介绍⭐随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来

分布式协调服务的存在意义_枫叶飘飘的博客-多极客编程

分布式协调服务是分布式应用中不可缺少的,通常担任协调者的角色,比如leader选举、负载均衡、服务发现、分布式队列和分布式锁等,这里以leader选举和负载均衡为例,说明分布式协调服务的存在意义及基本职责。1、leader选举在分布式系统中,常见的一种软件设计架构为master/slave,如下图所示,其中master负责集群管理,slave负责执行具体的任务(比如存储数据、处理数据)。这种架构存