【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令,直到特定的条件被满足为止。这重复执行的一组指令就叫做循环
特点:

  • 首先,循环条件中使用的变量必须是已初始化的,然后在循环中开始执行
  • 每次在循环开始时进行一次测试
  • 重复地执行一个代码块

循环实例

  • (一)for循环语法
  • (二)for循环实例
  • (三)while循环语法
  • (四)while循环实例——菜单驱动程序
  • (五)until循环语句实例

(一)for循环语法

for 循环地基本语法:
for VAR in iteml item1 item2 ... itemN
docommand1command2...commandN
done

for循环变量的内容的语法

for VAR in $fileNames
docommand1command2...commandN
done

for循环命令替换的语法

for VAR in $(Linux-command-name)
docommand1command2...commandN
done

for循环还有三项表达式语法,这种语法与c语言中常见的for循环使用的方法相同,其语法如下:

for VAR in (( EXP1;EXP2;EXP3))
docommand1command2...commandN
done

上述语法以三项参数循环控制表达式为特征,它由一个初始化式(EXP1),循环测试或条件(EXP2)和一个计算表达式(EXP3)组成。

(二)for循环实例

在 for循环中,每次指定列表中的(iterml…itermN)新值被赋给变量VAR 后,for循环都会执行一次,它将重复运行do和 done 之间的所有语句,直到条件不满足时为止。

这些列表或数值通常是:

  • 字符串;
    数字;
    命令行参数;
    文件名;
    Linux 命令的输出。
    我们来看一个简单的使用for循环的脚本:

脚本应用示例

  • 任务目标
  • 批量添加用户账号(名称无规律)
[root@controller ~]# cat uaddfor.sh
#!/bin/bash
#######################################################
#
#       FILE:uaddfor.sh
#       USAGE: ./uaddfor.sh
#
#   DESCRTPTION:
#       OPTIONS: --
#       REPUIREMENTS: --
#       BUGS: --
#       NOTES: --
#       AUTHOR: LEY
#   ORGANIZATION:
#       CREATED: 04/17/2024 15:50
#       REVISION: --
#####################################################ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
douseradd $UNAMEecho "123456" | passwd --stdin $UNAME
done[root@controller ~]# cat users.txt
zhangsan
lisi
wangwu[root@controller ~]# ./uaddfor.sh
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.
Changing password for user lisi.
passwd: all authentication tokens updated successfully.
Changing password for user wangwu.
passwd: all authentication tokens updated successfully.[root@controller ~]# tail -3 /etc/passwd
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash

在这里插入图片描述

这个脚本不够完善,我们将其完善一下,判断用户是否存在,是否需要重新创建用户。

#!/bin/bash
#######################################################
#
#       FILE:uaddfor.sh
#       USAGE: ./uaddfor.sh
#
#   DESCRTPTION:
#       OPTIONS: --
#       REPUIREMENTS: --
#       BUGS: --
#       NOTES: --
#       AUTHOR: LEY
#   ORGANIZATION:
#       CREATED: 04/17/2024 15:50
#       REVISION: --
#####################################################
ULIST=$(cat /root/users.txt)for UNAME in $ULIST
doid $UNAME &>/dev/nullif [ $? -eq 0 ]thenecho "用户 $UNAME 已存在。"read -p "是否要重新创建 (y/yes|n/no): " ansif [ "$ans" == 'yes' ] || [ "$ans" == 'y' ]thenuserdel -r $UNAMEecho "用户 $UNAME 已删除。"useradd $UNAMEecho "123456" | passwd --stdin $UNAMEecho "用户 $UNAME 创建成功。"elseecho "用户 $UNAME 未被删除。"fielseuseradd $UNAMEecho "123456" | passwd --stdin $UNAMEecho "用户 $UNAME 创建成功。"fi
done

再追加日志,将删除用户的信息和日期写入日志

[root@controller ~]# vim uaddfor.sh
#!/bin/bash
#######################################################
#
#       FILE:uaddfor.sh
#       USAGE: ./uaddfor.sh
#
#   DESCRTPTION:
#       OPTIONS: --
#       REPUIREMENTS: --
#       BUGS: --
#       NOTES: --
#       AUTHOR: LEY
#   ORGANIZATION:
#       CREATED: 04/17/2024 15:50
#       REVISION: --
#####################################################
ULIST=$(cat /root/users.txt)#测试代码,删除/root/users.txt文件中,所有用户
# for UNAME in $ULIST
#do
#       userdel -r $UNAME
#done#主功能,按照/root/users.txt文件中用户名,新建用户并设置密码为123456for UNAME in $ULIST
do#判断UNAME是否存在id加用户名如果存在则输出用户信息,不存在则输出不存在,将所有结果丢进/dev/null文件id $UNAME &>/dev/nullif [ $? -eq 0 ]then#存在则用户输入是否需要重新创建echo "用户 $UNAME 已存在。"read -p "是否要重新创建 (y/yes|n/no): " ansif [ "$ans" == 'yes' ] || [ "$ans" == 'y' ]then#输入yes则删除用户重新创建userdel -r $UNAME#将删除用户的信息和日期写入日志echo "用户 $UNAME 已删除。" >>/etc/rsyslog.confdate &>>/etc/rsyslog.confuseradd $UNAMEecho "123456" | passwd --stdin $UNAMEecho "用户 $UNAME 创建成功。"elseecho "用户 $UNAME 未被删除。"fielseuseradd $UNAMEecho "123456" | passwd --stdin $UNAMEecho "用户 $UNAME 创建成功。"fi
done

C语言风格的for循环

  • 通过控制变量,条件成立时循环
  • 步长可控次数
[root@controller ~]# cat cfor.sh
#!/bin/bash
for ((i=1;i<=5;i+=2))
doecho $i
done[root@controller ~]# chmod +x cfor.sh
[root@controller ~]# ./cfor.sh
1
3
5
  • 使用 for 循环遍历局域网中的 IP 地址,从 10.0.0.1 到 10.0.0.254。
  • 对每个 IP 地址执行一次 ping 命令,发送一个 ICMP 请求并等待回应,超时时间为1秒。
  • 如果主机对 ICMP 请求有响应(即返回状态码为0),则输出 “Host $host is up.”,表示主机是可达的。
  • 如果主机没有响应,则输出 “Host $host is down.”,表示主机不可达。
#!/bin/bash
for ((i=1;i<=254;i+=1)) dohost="10.0.0.$i"ping -c 1 -i 0.2 -W 1 $host &> /dev/nullif [ $? -eq 0 ]; thenecho "Host $host is up."elseecho "Host $host is down."fi
done

(三)while循环语法

while循环语句用于重复地执行一个命令列表

while循环语句的语法如下所示:

while [ CONDITION ]
docommand1command2...commandN
done当条件CONDITION为真时,循环体将被逐行执行

(四)while循环实例——菜单驱动程序

$ cat whilemenu.sh
#!/bin/bash
#######################################################
#
#       FILE:whilemenu.sh
#       USAGE: ./whilemenu.sh
#
#   DESCRTPTION:
#       OPTIONS: --
#       REPUIREMENTS: --
#       BUGS: --
#       NOTES: --
#       AUTHOR: LEY
#   ORGANIZATION:
#       CREATED: 04/25/2024 16:04
#       REVISION: --
#####################################################while :
doclear                                                   #清理终端echo "======================================="echo "             MAIN - MENU                "echo "======================================="echo "1. Dispaly date and time."echo "2. Dispaly system information."echo "3. Dispaly what users are doing."echo "4. exit."read -p "Enter your choice [ 1-4 ]: " choice            #从标准输入中读取用户的输入,并赋值给变量choicecase $choice in1)echo "Today is $(date +%Y-%m-%d)."      #打印当前日期,格式为YYYY-MM-DDecho "Current time : $(date +%H:%M:%S)."        #打印当前时间格式为hh:mm:ssread -p "Press [Enter] key to continue..." readEnterKey#只读入换行符;;2)uname -a                #打印系统信息read -p "Press [Enter] key to continue..." readEnterKey;;3)w                       #显示系统当前登录的用户,及用户当前运行命令read -p "Press [Enter] key to continue..." readEnterKey;;4)echo "Bye!!!"exit 0;;*)echo "Error: Inalid option!"read -p "Press [Enter] key to continue..." readEnterKey;;esac
done

此脚本的运行结果如下图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(五)until循环语句实例

until循环与while循环类似,也同样基于一个类似的条件。但until循环的判断条件正好与while循环的判断条件相反,until循环在条件为假的时候运行。一旦条件满足,即为真,就会退出循环。until循环的语法如下所示:

until [ CONDITION ]
docommand1command2...commandN
done

until循环与while循环相比

  • until循环执行直到状态返回0
  • while循环执行直到返回非0状态
  • until循环总是执行至少一次
$ cat untilloop.sh
#!/bin/bash
#######################################################
#
#       FILE:untilloop.sh
#       USAGE: ./untilloop.sh
#
#   DESCRTPTION:
#       OPTIONS: --
#       REPUIREMENTS: --
#       BUGS: --
#       NOTES: --
#       AUTHOR: LEY
#   ORGANIZATION:
#       CREATED: 04/24/2024 16:30
#       REVISION: --
#####################################################var=1until [ $var -gt 3 ]
doecho "The for loop is run $var times."var=$(( var + 1 ))
done$ chmod +x untilloop.sh
$ ./untilloop.sh
The for loop is run 1 times.
The for loop is run 2 times.
The for loop is run 3 times.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沤血整理:好用的员工电脑行为审计软件

电脑行为审计是指对电脑用户在使用电脑过程中的行为进行监控、记录和分析的过程。 员工电脑行为审计可以帮助企业了解员工在工作电脑上的行为&#xff0c;从而保障企业信息安全&#xff0c;提高员工工作效率&#xff0c;并更好地管理员工&#xff0c;常用的电脑行为审计软件有…

(三)小程序学习笔记——生命周期、API

1、小程序的启动&#xff1a; 冷启动&#xff1a; 如果用户首次打开&#xff0c;或小程序销毁后被用户再次打开&#xff0c;此时小程序需要重新加载启动&#xff0c;即冷启动。 热启动&#xff1a; 如果用户已经打开过某小程序&#xff0c;然后在一定时间内再次打开该小程序&…

Java | Leetcode Java题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution {public void rotate(int[][] matrix) {int n matrix.length;// 水平翻转for (int i 0; i < n / 2; i) {for (int j 0; j < n; j) {int temp matrix[i][j];matrix[i][j] matrix[n - i - 1][j];matrix[n - i - 1]…

百种提权及手段一览系列第5集

特权升级的危险是显而易见的。通过提升权限&#xff0c;攻击者可以绕过网络安全措施&#xff0c;从而损害数据完整性、机密性和系统可用性。对于组织而言&#xff0c;这可能会导致数据泄露、系统停机以及潜在的法律和声誉后果。识别权限升级的迹象并部署预防性网络安全措施对于…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

水库泄洪预警系统的作用

水电站建立的初衷有两个&#xff0c;一是用于发电&#xff0c;二是用于调节水量&#xff0c;解决下游洪涝灾害。水电站在丰水期蓄水、枯水期泄洪&#xff0c;泄洪时产生的水流又急又大&#xff0c;对电站大坝及下游存在巨大危险。为了加强水电站工程安全管理&#xff0c;保证水…

linux权限维持(二)

3.SSH 后门 3.1 SSH 软连接后门 软连接后门的原理是利用了 PAM 配置文件的作用&#xff0c;将 sshd 文件软连接名称设置为 su &#xff0c;这样应用在启动过 程中他会去PAM 配置文件夹中寻找是否存在对应名称的配置信息 (su) &#xff0c;然而 su 在 pam_rootok 只检测 uid…

科研工作学习中常用的录制动图软件——screenToGif

一、前言 俗话说&#xff0c;字不如表&#xff0c;表不如图&#xff0c;静图不如动图。 动图给人的直观感受&#xff0c;还是很不错的。在曾经的学生期间&#xff0c;进行组会汇报&#xff1b;还是如今工作中&#xff0c;给领导汇报。我经常使用screenToGif这款软件&#xff…

SSRF—服务器请求伪造 漏洞详解

漏洞简述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造&#xff0c;由服务端发起请求的一个网络攻击&#xff0c;一般用来在外网探测或攻击内网服务&#xff0c;其影响效果根据服务器用的函数不同&#xff0c;从而造成不同的影响。 SSRF 形成的原因…

Ubuntu22.04.4 - apt - 笔记

一、修改源配置 这里使用的时候又出现了联不通的情况&#xff0c;换成国内镜像 在update cp /etc/apt/source.list /etc/apt/source.list.bak vim source.list 换源地址 修改完&#xff08;网上有&#xff0c;注意&#xff1a;根据Ubuntu版本不一样&#xff0c;部分内同也会不…

探索在Apache SeaTunnel上使用Hudi连接器,高效管理大数据的技术

Apache Hudi是一个数据湖处理框架&#xff0c;通过提供简单的方式来进行数据的插入、更新和删除操作&#xff0c;Hudi能够帮助数据工程师和科学家更高效地处理大数据&#xff0c;并支持实时查询。 支持的处理引擎 Spark Flink SeaTunnel Zeta 主要特性 批处理 流处理 精确一次性…

centos7 搭建 kubernetes1.22.2 集群

centos7 搭建 kubernetes1.22.2 集群 关注【云原生AI百宝箱】公众号,获取更多云原生消息 环境: 操作系统:win10虚拟机:virtual box 、 Vmwarelinux发行版:CentOS7.9linux内核(使用uname -r查看):3.10.0-957.el7.x86_64master和node节点通信的ip(master): 10.0.0.1980.检…

【前端】vue数组去重的3种方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发工具&#xff0c;本文…

港股“AIGC第一股”出门问问,凭借什么产品做到上市?

随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;领域逐渐成为资本市场的新宠。在这样的背景下&#xff0c;出门问问&#xff08;股票代码&#xff1a;2438.HK&#xff09;作为AIGC领域的先行者&#xff0c;于2024年4月24日正式登陆港交所…

CSS常用属性之(列表、表格、鼠标)属性,(如果想知道CSS的列表、表格、鼠标相关的属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习CSS的时候&#xff0c;必不可少的就要学习选择器和常见的属性&#xff0c;而本篇文章讲解的是CSS中的列表、表格、背景、鼠标属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 大致了解一下本篇文章…

用斐波那契数列感受算法的神奇(21亿耗时0.02毫秒)

目录 一、回顾斐波那契数列 二、简单递归方法 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &#xff08;三&#xff09;性能分析 三、采用递归HashMap缓存 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &…

Apache JMeter进行TCP并发压力测试初尝试

前言 由于互联网编程实验二第三题要求比较使用线程池与否的服务器的并发性能&#xff0c;遂检索信息并了解到Apache JMeter这个工具 本文主要介绍了在已有Java JDK的情况下对Apache JMeter的安装及配置&#xff0c;以及利用JMeter进行TCP压力测试 一、安装及配置 先在官网下…

Clion连接MySQL数据库:实现C/C++语言与MySQL交互

确保你的电脑里已经有了MySQL。 1、找到MySQL的目录 2、进入lib目录 3、复制libmysql.dll和libmysql.lib文件 4、将这俩文件粘贴到你的clion项目的cmake-build-debug目录下 如果不是在这个目录下&#xff0c;运行时会出以下错误报错&#xff1a; 进程已结束&#xff0c;退…

word导出或另存为pdf图片不清晰问题解决方案

问题描述&#xff1a; 使用word 2019导出pdf时图片不清晰&#xff0c;即使我已经在“选项 → \to →高级 → \to →图片大小和质量 → \to →不压缩文件中的图像 ”选项卡中关闭掉了图片压缩依然无效。 解决方案&#xff1a; 利用word foxit pdf 软件打印的方案转pdf。 &…

AppleWatch是真的能够减少我iPhone的使用时长

我应该是比较专情的果粉了&#xff0c;我有一台MacBook Pro、iPad Pro、airpods pro 2和iPhone 15 Pro Max。但我还从来没有用过苹果手表。 然后&#xff0c;我就去买了AppleWatchSeries9蜂窝款&#xff0c;并试用了一周&#xff0c;我想知道它是否能帮助我减少使用iPhone的时间…