linux Shell编程之循环语句(三)
目录
一. for 循环语句
1. for语句的结构
2. for 语句应用示例
(1) 根据姓名列表批量添加用户
(2) 根据 IP 地址列表检查主机状态
二. 使用 while 循环语句
1. while 语句的结构
2. while 语句应用示例
(1) 批量添加规律编号的用户
(2) 猜价格游戏
三. until 循环语句
1. until 语句的结构
2. until 语句应用示例
(1) 为指定用户发送在线消息
在 Shell 编程的广阔领域中,循环语句与函数无疑是两大不可或缺的基石。它们不仅能够显著提升脚本的执行效率,还能极大增强脚本的可读性和可维护性。
循环语句,作为自动化处理重复任务的利器,在 shel1 编程中扮演着至关重要的角色。for 循环、while循环以及 unti1 循环,各具特色,分别适用于不同的应用场景。
for 循环擅长处理预定义的列表,如批量创建用户账号;while 循环则更适用于需要按特定条件重复执行操作的场景;until 循环则与 while 循环相反,在条件为假时执行循环体。
一. for 循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。
当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。
1. for语句的结构
使用 for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为 for 语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP 黑名单)。
for 变量名 in 取值列表
do命令序列
done
for 语句的操作对象为用户指定名称的变量,并通过 in 关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do.done 之间的命令序列称为循环体,执行语句需要引用变量以完成相应的任务。

2. for 语句应用示例
(1) 根据姓名列表批量添加用户
根据人事部门给出的员工姓名的拼音列表,在Linux 服务器中添加相应的用户账号,初始密码均设置为“123456”。其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外,并无其他特殊规律。
可先指定员工列表文件 users.txt,然后编写一个名为 uaddfor.sh 的 Shell 脚本,从 users.txt 文件中读取各用户名称,重复执行添加用户、设置初始密码的相关操作。
列表文件

批量添加用户的脚本


若要删除 uaddfor.sh 脚本所添加的用户,只需参考上述脚本代码,将 for 循环体中添加用户的命令序列改为删除用户的操作即可。

执行查看发现它已经删除了

(2) 根据 IP 地址列表检查主机状态
根据包含公司各服务器 IP 地址的列表文件,检査其中各主机的 ping 连通性,输出各主机是否启动、关闭。其中,服务器的数量并不固定,各服务器的IP地址之间也无特殊规律。
可先指定 IP 地址列表文件 ipadds.txt,然后编写一个名为 chkhosts.sh 的Shell 脚本,从 ipadds.txt 文件中读取各服务器的 IP 地址,重复执行 ping 连通性测试,并根据测试结果输出相应的提示信息。

其中ping -c 3 -i 0.2 -w 3 分别指的是-c:发送包的数量 -i:发送包的间隔 -w:超时时间


do…done 循环体内嵌套使用了 if 条件选择语句,用来针对不同 IP 地址的测试吉果进行判断,并输出相应的提示信息。嵌套可以理解为镶嵌、套用,就是在已有的语句、函数中在多加个或多个语句、函数等。实际上,if 语句、for 语句及其他各种 Shell 脚本语句都是可以嵌套使用的
二. 使用 while 循环语句
for 循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环-while 语句。
1. while 语句的结构
使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while 循环语句的语法结构
while 条件测试操作
do命令序列
done
while 语句的执行流程:首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do..done循环体中的命令序列:返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体:再次返回到 while 后,判断条件测试结果…如此循环,直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环

使用 while 循环语句时,有两个特殊的条件测试操作,即 true(真)和 false(假)。使用 true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过 exit语句退出脚本);反之,若使用 false 作为条件,则循环体将不会被执行。这两个特殊条件也可以用在 if语句的条件测试中。
2. while 语句应用示例
(1) 批量添加规律编号的用户
在一些技术培训和学习领域,出于实验或测试的目的,需要批量添加用户账号,这些用户的名称中包含固定的前缀字串,并按照数字顺序依次进行编号,账号的数量往往也是固定的。
若要添加 20 个用户,名称依次为 stu1、stu2、…、stu20,可以参考以下操作。

使用变量 i 来控制用户名称的编号,初始赋值为 1,并且当取值大于 28 时终止循环。在循环体内部,通过语句“let i++”(等同于 i='expr $i +1`)来使变量 i 的值增加 1,因此当执行第一次循环后 i 的值将变为 2,执行第二次循环后 i 的值将变为 3,…依此类推。

若要删除 uaddwhile.sh 脚本所添加的用户,只需参考上述脚本代码,将 while 循环体中添加用户的命令序列改为删除用户的操作即可。


(2) 猜价格游戏
由脚本预先生成一个随机的价格数目(0~999)作为实际价格,判断用户猜测的价格是否高出或低于实际价格,给出相应提示后再次要求用户猜测;一直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。
主要设计思路如下:通过环境变量 RANDOM 可获得一个小于 216 的随机整数,计算其与 1000 的余数即可获得 0~999 的随机价格;反复猜测操作可以通过以 true 作为测试条件的while 循环实现,当用户猜中实际价格时终止循环;判断猜测价格与实际价格的过程采用 if 语句实现,嵌套在 while 循环体内;使用变量来记录猜测次数。


三. until 循环语句
1. until 语句的结构
until 循环与 while 循环类似,while 循环能实现的脚本 unti1 同样也可以实现,但区别是while循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环.
until 循环语句的语法结构
until 条件测试操作
do命令序列
done
until 语句的执行流程:首先判断 until 后的条件测试操作结果,如果条件不成立,则执行 do..done循环体中的命令序列;返回 until 后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体;再次返回到 until 后,判断条件测试结果!…如此循环,直到 until 后的条件测试结果成立为止,最后跳转到 done 语句,表示结束循环。

2. until 语句应用示例
在一些科学计算领域,经常会用到各种数的计算,自然数的求和操作是最简单的。本例中计算从 1 到58 的和,从1 开始相加,采用循环的方式,每次循环后加 1,将得到的值加入计算的和中,数字运算采用的是 let 方式,直到加到 50 为止

在 i 的值小于 50 之前,每次循坏 i 的值加 1,开且求出 s 的值

(1) 为指定用户发送在线消息
公司内部有一台 Linux 测试服务器,开发、测试、运维都在使用自己的账号连接登录到服务器上。当业务增加不能满足使用需求时,运维决定给服务器增加内存配置,要通知开发和测试人员保存数据退出,之后再关机升级内存,以应对业务的增加。
针对上面的需求,可编写一个名字为 until-user_online_to_write.sh 的 Shell 脚本,用于给已登录用户发送消息,对用户进行检测,必须是系统内用户并且处于登录状态,通过 Linux 的 write 命令来发送消息,具体的脚本如下所示。



测试时用户在已登录状态才能看到信息 用户那面会显示EOF
相关文章:
linux Shell编程之循环语句(三)
目录 一. for 循环语句 1. for语句的结构 2. for 语句应用示例 (1) 根据姓名列表批量添加用户 (2) 根据 IP 地址列表检查主机状态 二. 使用 while 循环语句 1. while 语句的结构 2. while 语句应用示例 (1) 批量添加规律编号的用户 (2) 猜价格游戏 三. until 循环语…...
C#容器源码分析 --- Queue<T>
Queue<T> 是 System.Collections.Generic 命名空间下的先进先出(FIFO)动态集合,其核心实现基于循环数组,通过维护头尾指针实现高效入队和出队操作。 .Net4.8 Queue<T>源码地址:queue.cs (microso…...
ViT 模型讲解
文章目录 一、模型的诞生背景1.1 背景1.2 ViT 的提出(2020年) 二、模型架构2.1 patch2.2 模型结构2.2.1 数据 shape 变化2.2.2 代码示例2.2.3 模型结构图 2.3 关于空间信息 三、实验3.1 主要实验3.2 消融实验 四、先验问题4.1 归纳偏置4.2 先验or大数据&…...
IntelliJ IDEA 中安装和使用通义灵码 AI 编程助手教程
随着人工智能技术的发展,AI 编程助手逐渐成为提升开发效率的强大工具。通义灵码是阿里云推出的一款 AI 编程助手,它能够帮助开发者实现智能代码补全、代码解释、生成单元测试等功能,极大地提升了编程效率和代码质量。 IntelliJ IDEA 是一款广…...
面向HPC平台应用的HBM电源完整性/信号完整性分析与设计方法
近年来,人工智能技术的爆发式增长推动大数据处理领域发生根本性变革,促使工业界转向基于大数据的工作模型。为应对海量数据处理的复杂问题,基于多边交互服务的数据中心不断涌现。此类应用被称为高性能计算(HPC)&#x…...
FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
裸机程序设计模式 裸机程序的设计模式可以分为:轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题:假设有A、B两个都很耗时的函数,无法降低它们相互之间的影响。第4种方法可以解决这个问题,但是实践起来有难…...
can‘t set boot order in virtualbox
Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾选EFI boot order就是灰色的 传统BIOS就是可选的 然后选中任意介质,通过右边的上下箭头调节顺序,最上面的应该是优先级最高的 然后就…...
2025年第十六届蓝桥杯省赛C++ A组真题
2025年第十六届蓝桥杯省赛C A组真题 1.说明2.题目A:寻找质数(5分)3.题目B:黑白棋(5分)4. 题目C:抽奖(10分)5. 题目D:红黑树(10分)6. 题…...
asp.net Kestrel 和iis区别
Kestrel 和 IIS 都是用于托管 Web 应用程序的服务器,不过它们在多个方面存在显著差异,下面为你详细分析: 1. 所属平台与跨平台能力 Kestrel:是.NET Core 及后续版本的一部分,具备跨平台特性,可在 Windows…...
《植物大战僵尸融合版v2.4.1》,塔防与创新融合的完美碰撞
《植物大战僵尸融合版》是基于经典塔防游戏《植物大战僵尸》的创意同人改版,由“蓝飘飘fly”等开发者主导制作。它在保留原版核心玩法的基础上,引入了独特的植物融合机制,玩家可以将不同的植物进行组合,创造出全新的植物种类&…...
SGP4 基于C、C++安装指南
简介:SGP4 是一个用于简化轨道摄动模型的开源项目。 依赖:GCC/CLang, CMake 下载:GitCode - 全球开发者的开源社区,开源代码托管平台 (https://gitcode.com/gh_mirrors/sg/sgp4)或者从我的资源下载 https…...
SBTI认证的意义,什么是SBTI认证,sbti科学碳目标的好处
SBTI认证的意义与科学碳目标(SBT)的好处 1. 什么是SBTI认证? SBTI(Science Based Targets initiative,科学碳目标倡议)是由全球环境信息研究中心(CDP)、联合国全球契约(…...
[LeetCode 1696] 跳跃游戏 6(Ⅵ)
题面: LeetCode 1696 数据范围: 1 ≤ n u m s . l e n g t h , k ≤ 1 0 5 1 \le nums.length, \ k \le 10^5 1≤nums.length, k≤105 − 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10^4 \le nums[i] \le 10^4 −104≤nums[i]≤104 思路 & Code 重点&…...
在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
如果在show ip route的时候出现没有设置最后的通道Gateway of last resort is not set Switch#show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA exte…...
Redis 常问知识
1.Redis 缓存穿透问题 缓存穿透:当请求的数据在缓存和数据库中不存在时,该请求就跳出我们使用缓存的架构(先从缓存找,再从数据库查找、这样就导致了一直去数据库中找),因为这个数据缓存中永远也不会存在。…...
履带小车+六轴机械臂(2)
本次介绍原理图部分 开发板部分,电源供电部分,六路舵机,PS2手柄接收器,HC-05蓝牙模块,蜂鸣器,串口,TB6612电机驱动模块,LDO线性稳压电路,按键部分 1、开发板部分 需要注…...
多卡集群 - Docker命令来启动一个容器的实例
一、Docker下载安装及相关配置 桌面版:Docker Desktop: The #1 Containerization Tool for Developers | Docker 服务器版:Install | Docker Docs 我们先以windows桌面版为例进行安装,一般在公司里会使用服务器版本,后期也会出一…...
测试第三课-------自动化测试相关
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
【C++教程】进制转换的实现方法
在C中进行进制转换可以通过标准库函数或自定义算法实现。以下是两种常见场景的转换方法及示例代码: 一、使用C标准库函数 任意进制转十进制 #include <string> #include <iostream>int main() {std::string num "1A3F"; // 十六进制数int…...
科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...
ebpf: CO-RE, BTF, and Libbpf(二)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/ 概述 上篇文章主要讲了CO-RE最关键的一环:BTF,了解其如何记录内核中的数据结…...
祁连山国家公园shp格式数据
地理位置 祁连山国家公园位于中国西北部,横跨甘肃省与青海省交界处,主体处于青藏高原东北边缘。总面积约5.02万平方公里,是中国首批设立的10个国家公园之一。 设立背景 保护措施 文化与历史 旅游与教育 意义与挑战 祁连山国家公园的设立标志…...
《AI大模型应知应会100篇》 第16篇:AI安全与对齐:大模型的灵魂工程
第16篇:AI安全与对齐:大模型的灵魂工程 摘要 在人工智能技术飞速发展的今天,大型语言模型(LLM)已经成为推动社会进步的重要工具。然而,随着这些模型能力的增强,如何确保它们的行为符合人类的期…...
探索QEMU-KVM虚拟化:麒麟系统下传统与云镜像创建虚拟机的最佳实践
随着云计算和虚拟化技术的不断进步,虚拟化在管理服务器、隔离资源以及提升性能方面的好处越来越明显。麒麟操作系统Kylin OS是我们国家自己开发的操作系统,在政府机构和企业中用得很多。这篇文章会教你如何在麒麟操作系统上设置QEMU-KVM虚拟化环境&#…...
[ComfyUI] 最新控制模型EasyControl,吉卜力风格一键转绘
一、EasyControl介绍 玩ComfyUI的都知道Controlnet的重要性,可以根据约束来引导图片的生成,这也是ComfyUI商业化里面很重要的一环。 不过之前我们用的Controlnet都是基于Unet技术框架下的。 最近出的这个EasyControl有点不一样,是基于DiT&a…...
项目执行中的目标管理:从战略到落地的闭环实践
——如何让目标不“跑偏”、团队不“掉队”? 引言:为什么目标管理决定项目成败? 根据PMI研究,47%的项目失败源于目标模糊或频繁变更。在复杂多变的项目环境中,目标管理不仅是制定KPI,更是构建“方向感-执行…...
《计算机视觉度量:从特征描述到深度学习》—深度学习工业检测方案评估
谢谢各位粉丝的支持,过去了一年多才再次更新技术博客。原因是个人家庭和技术发展在这短短一年多,发生了很大变化。本人身为技术博主,也在不断的探索和研究新技术在工业检测领域的技术方案。 并在这期间已经完成了基础的工业检测大模型的设计…...
网页防篡改与盗链防护:实时监控与自动化修复实践
摘要:针对网页内容篡改与盗链问题,本文基于群联AI云防护系统,详解如何通过哈希校验、实时监控与CDN联动实现秒级修复,并提供Python与AWS S3集成代码。 一、网页安全的核心需求 防篡改:保障页面内容完整性,…...
LR(0)
LR0就是当我处在自动机为红色这些结束状态的时候,这些红色状态就代表我们识别到了一个句柄,那现在的问题就是识别到了句柄,那要不要对他进行归约?LR0就是我不管当前指针指向的终结符是什么,我都拿它做规约 这里的二号状…...
鸿蒙开发-页面跳转
1.路由使用 //1.引入路由 import router from ohos.router//2.使用跳转router.pushUrl({url: "pages/Show"})2.页面跳转 import { router } from kit.ArkUI;Entry Component struct LoginPage {State message: string 登陆页;build() {Row() {Column() {Text(this…...
