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

news2024/12/27 13:13:11

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

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

循环实例

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

(一)for循环语法

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

for循环变量的内容的语法

for VAR in $fileNames
do
	command1
	command2
	...
	commandN
done

for循环命令替换的语法

for VAR in $(Linux-command-name)
do
	command1
	command2
	...
	commandN
done

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

for VAR in (( EXP1;EXP2;EXP3))
do
	command1
	command2
	...
	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
do
        useradd $UNAME
        echo "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
do
    
    id $UNAME &>/dev/null
    if [ $? -eq 0 ]
    then
        echo "用户 $UNAME 已存在。"
        read -p "是否要重新创建 (y/yes|n/no): " ans
        if [ "$ans" == 'yes' ] || [ "$ans" == 'y' ]
        then
            userdel -r $UNAME
            echo "用户 $UNAME 已删除。"
            useradd $UNAME
            echo "123456" | passwd --stdin $UNAME
            echo "用户 $UNAME 创建成功。"

        else
            echo "用户 $UNAME 未被删除。"
        fi
    else
        useradd $UNAME
        echo "123456" | passwd --stdin $UNAME
        echo "用户 $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文件中用户名,新建用户并设置密码为123456

for UNAME in $ULIST
do
    #判断UNAME是否存在id加用户名如果存在则输出用户信息,不存在则输出不存在,将所有结果丢进/dev/null文件
    id $UNAME &>/dev/null
    if [ $? -eq 0 ]
    then
            #存在则用户输入是否需要重新创建
        echo "用户 $UNAME 已存在。"
        read -p "是否要重新创建 (y/yes|n/no): " ans
        if [ "$ans" == 'yes' ] || [ "$ans" == 'y' ]
        then
                #输入yes则删除用户重新创建
            userdel -r $UNAME
                #将删除用户的信息和日期写入日志
            echo "用户 $UNAME 已删除。" >>/etc/rsyslog.conf
            date &>>/etc/rsyslog.conf
            useradd $UNAME
            echo "123456" | passwd --stdin $UNAME
            echo "用户 $UNAME 创建成功。"

        else
            echo "用户 $UNAME 未被删除。"
        fi
    else
        useradd $UNAME
        echo "123456" | passwd --stdin $UNAME
        echo "用户 $UNAME 创建成功。"
    fi
done
                                                             

C语言风格的for循环

  • 通过控制变量,条件成立时循环
  • 步长可控次数
[root@controller ~]# cat cfor.sh
#!/bin/bash
for ((i=1;i<=5;i+=2))
do
        echo $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)) do
        host="10.0.0.$i"
        ping -c 1 -i 0.2 -W 1 $host &> /dev/null
        if [ $? -eq 0 ]; then
                echo "Host $host is up."
        else
                echo "Host $host is down."
        fi
done

(三)while循环语法

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

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

while [ CONDITION ]
do
 command1
 command2
 ...
 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 :
do


        clear                                                   #清理终端
        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            #从标准输入中读取用户的输入,并赋值给变量choice

        case $choice in
                1)
                        echo "Today is $(date +%Y-%m-%d)."      #打印当前日期,格式为YYYY-MM-DD
                        echo "Current time : $(date +%H:%M:%S)."        #打印当前时间格式为hh:mm:ss
                        read -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 ]
do
 command1
 command2
 ...
 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=1

until [ $var -gt 3 ]
do
        echo "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.coloradmin.cn/o/1631096.html

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

相关文章

OpenHarmony 实战开发——分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动&#xff0c;进行拼单的场景&#xff1b;实现两人拼单时&#xff0c;其他一人添加商品到购物车&#xff0c;另外一人购物车列表能同步更新&#xff0c;且在购物车列表页面结算时&#xff0c;某一人结算对方也能实时知道结…

【无监督+自然语言】 GPT,BERT, GPT-2,GPT-3 生成式预训练模型方法概述 (Generative Pre-Traning)

主要参考 【GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【李沐论文精读】-2022.03.04】 https://www.bilibili.com/video/BV1AF411b7xQ/ 大语言模型综述&#xff1a; https://blog.csdn.net/imwaters/article/details/137019747 GPT与chatgpt的关系 图源&#xff1a;L…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端&#xff0c;输入sh jmeter 出现jmeter首页界面&#xff0c;即为成功。 5、使用 5.1 语言选择 option选项卡&am…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图&#xff1a; 报错的代码 报错的代码如下&#xff1a; overridevoid initState() async{super.initState();await getConf…

LoRA 引领多模态模型革命,大模型的微调方案

基于LoRA微调多模态大模型 随着 ChatGPT 的火爆&#xff0c;大模型时代降临&#xff0c;普通人难以进行全量微调。 参数高效微调技术应运而生&#xff0c;为科研人员和开发者提供了微调大模型的机会。 用 LoRA 微调 2.7B 参数的 blip2-opt 模型&#xff0c;提升图生文能力&am…

嵌入式学习——C语言基础——day11

1. 字符型数组和字符串的传参 1.1 常量和变量的区别&#xff08;难点&#xff09; 一般常量不能被修改&#xff0c;变量才能被修改 #include <stdio.h> int main(void) { char str[] {"hello world"};//定义数组&#xff0c;数组名为指针常量 char …

数据结构和算法:贪心

贪心算法 贪心算法是一种常见的解决优化问题的算法&#xff0c;其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决策&#xff0c;以期获得全局最优解。 贪心算法和动态规划都常用于解决优化问题。它们之间存在一…

干货整理:好用的文件加密软件有哪些

说到文件加密&#xff0c;想必大家都很熟悉&#xff0c;文件加密已经普遍应用&#xff0c;文件加密是一种重要的安全措施&#xff0c;可以确保数据的机密性、完整性和可用性&#xff0c;降低因数据泄露或丢失带来的风险。 下面小编给大家分享几款常用的加密软件&#xff0c;大…

纯血鸿蒙APP实战开发——评论组件案例实现

介绍 评论组件在目前市面上的短视频app中是一种很常见的场景&#xff0c;本案例使用全局状态保留能力弹窗来实现评论组件。点击评论按钮弹出评论组件&#xff0c;点击空白处隐藏该组件&#xff0c;再次点击评论按钮则会恢复上一次浏览的组件状态。 效果图预览 使用说明 点击…

DDP示例

https://zhuanlan.zhihu.com/p/602305591 https://zhuanlan.zhihu.com/p/178402798 关于模型保存与加载 &#xff1a; 其实分为保存 有module和无module2种 &#xff1b; &#xff08;上面知乎这篇文章说带时带module) 关于2种带与不带的说明&#xff1a; https://blog.csdn.…

Oracle中rman使用记录

最近在项目中&#xff0c;遇到使用RMAN的操作来恢复数据库中某个时间归档日志&#xff0c;RMAN的原理和理解&#xff0c;网友们百度了解一下。我重点将实操部分了。直接上实验环节&#xff0c;让网友更懂。&#xff08;特别提醒&#xff1a;我是1:1用VMware克隆数据库进行RMAN还…

构建高效智能的理赔业务系统:保险科技的未来

随着保险行业的发展和科技的不断进步&#xff0c;理赔业务作为保险服务的重要环节&#xff0c;也在不断演进和改进。传统的理赔流程可能存在效率低下、信息不透明等问题&#xff0c;而现代化的理赔业务系统则能够通过数字化、智能化等手段提升理赔服务的质量和效率&#xff0c;…

Java集成结巴中文分词器、Springboot项目整合jieba分词,实现语句最精确的切分、自定义拆词

文章目录 一、jieba介绍二、集成三、原理四、自定义拆词4.1、方式一&#xff1a;在源码的dict.txt中修改然后重新打包(推荐)4.2、新建文件自定义拆词 五、其他问题 一、jieba介绍 jieba是一个分词器&#xff0c;可以实现智能拆词&#xff0c;最早是提供了python包&#xff0c;…

Qt | 窗口的显示及可见性|标题、透明度、启用/禁用|窗口标志、设置其他属性|获取窗口部件、设置父部件|鼠标光标

​显示事件:QEvent::show,处理函数为 showEvent(QShowEvent*) 隐藏事件:QEvent::hide,处理函数为 hideEvent(QHideEvent* ) 01 QWidget 类中与可见性有关的属性 visible:bool 访问函数: bool isVisible() const; virtual void setVisible(bool visible); 02 QWid…

高频面试题:在浏览器搜索框中输入一个URL的完整请求过程?

相信很多小伙伴在校招或者社招面试中都遇到过这个问题 面试官&#xff1a;小伙子&#xff0c;了解 在浏览器搜索框中输入一个URL的完整请求过程吗&#xff1f;详细说说我&#xff1a;eeemm&#xff0c;不太清出具体的过程。整体过程应该是HTTP请求的过程。 如果在面试中不能很…

【C++】---STL容器适配器之底层deque浅析

【C】---STL容器适配器之底层deque浅析 一、deque的使用二、deque的原理1、deque的结构2、deque的底层结构&#xff08;1&#xff09;deque的底层空间&#xff08;2&#xff09;deque如何支持随机访问、deque迭代器 3、deque的优缺点&#xff08;1&#xff09;deque的优势&…

【golang学习之旅】报错:a declared but not used

目录 报错原因解决方法参考 报错 代码很简单&#xff0c;如下所示。可以发现a和b都飙红了&#xff1a; 运行后就会出现报错&#xff1a; 报错翻译过来就是a已经声明但未使用。当时我很疑惑&#xff0c;在其他语言中从来没有这种情况。况且这里的b不是赋值了吗&#xff0c;怎…

Sarcasm detection论文解析 | 通过阅读进行讽刺推理-Reasoning with sarcasm by reading in-between

论文地址 论文地址&#xff1a;[1805.02856] Reasoning with Sarcasm by Reading In-between (arxiv.org) 论文首页 笔记大纲 通过阅读进行讽刺推理论文笔记 &#x1f4c5;出版年份:2018&#x1f4d6;出版期刊:&#x1f4c8;影响因子:&#x1f9d1;文章作者:Tay Yi,Luu Anh…

制作一个RISC-V的操作系统十六-系统调用

文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置 此时UIE设置为1和MPIE为1&#xff0c;MPP设置为0 代表当前权限允许UIE中断发生&#xff0c;并且在第一个mret后将权限恢复为用户态&#xff0c;同时MIE也…

17 大数据定制篇-shell编程

第 17 章大数据定制篇-Shell 编程 17.1 为什么要学习 Shell 编程 Linux 运维工程师在进行服务器集群管理时&#xff0c;需要编写 Shell 程序来进行服务器管理。 对于 JavaEE 和 Python 程序员来说&#xff0c;工作的需要&#xff0c;你的老大会要求你编写一些 Shell 脚本进行…