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

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.mfbz.cn/a/573095.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN怎样提高企业网络体验

随着数字化转型的加速&#xff0c;传统基于MPLS的专用网络因其高度的结构化和僵化性&#xff0c;已无法满足现代企业对于灵活性和成本效益的日益增长的需求。相比之下&#xff0c;SD-WAN作为一种创新的网络架构&#xff0c;正以其卓越的性能和灵活的管理方式&#xff0c;成为企…

服务于金融新核心系统 星辰天合与中电金信完成产品兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY星辰天合&#xff09;与中电金信软件有限公司&#xff08;简称&#xff1a;中电金信&#xff09;完成产品兼容性认证&#xff0c;星辰天合的企业级分布式统一数据平台 XEDP 符合金融级数字底座&q…

ECG-Emotion Recognition(情绪识别)-- 数据集介绍WESADDREAMER

1、WESAD数据集 下载链接&#xff1a;WESAD: Multimodal Dataset for Wearable Stress and Affect Detection | Ubiquitous Computing &#xff08;1&#xff09;基本介绍 WESAD是一个用于可穿戴压力和影响检测的新的公开数据集。该多模式数据集以实验室研究期间15名受试者的生…

学习JFinal

1.五个配置类 configConstants&#xff08;配置&#xff09;&#xff1a; configRoute&#xff08;路由&#xff09;&#xff1a; 2.Controller层&#xff08;控制器&#xff09; 访问流程&#xff1a; Action&#xff1a; getPara&#xff1a; 参数说明&#xff1a;第一个参…

13.Blender 界面介绍(下) 雕刻、纹理绘制及属性

界面介绍 1. 布局 物体的移动旋转和缩放等操作 2. 建模 里面就是有一些建模常用的功能 里面的功能对于做MMD来说不是必备的操作 3. 雕刻 使用里面的工具可以对物体本身进行修改 4. UV编辑 如果想要编辑UV贴图 将编辑模式改为纹理绘制 再点击右边的工具 如果进行编…

MySQL-----多表查询(一)

目录 一.多表关系&#xff1a; 1.1 一对多(多对一)&#xff1a; 1.2 多对多: 1.3 一对一: 二.多表查询概述&#xff1a; 三.连接查询&#xff1a; 3.1内连接&#xff1a; 3.2外连接&#xff1a; 3.3自连接查询&#xff1a; 3.4联合查询&#xff1a; 一.多表关系&…

告别单一密码,多因素身份认证带你进入安全新纪元!

文章目录 前言一、你知道什么&#xff1f;二、你拥有什么1.智能卡2.令牌 三、你是什么四、其他因素身份认证 前言 当我们探讨多因子/多因素身份认证时&#xff0c;我们可能会好奇这里的“因素”具体指的是什么&#xff1f;显然&#xff0c;用户名和密码是一种因素&#xff0c;…

iclientOpenlayer用uniapp开发移动端GIS应用设计及实现

GIS移动端应用是将地理信息系统&#xff08;GIS&#xff09;技术应用于移动设备&#xff08;如智能手机、平板电脑&#xff09;上&#xff0c;使用户能在户外或移动场景下访问、收集、分析和展示地理信息。以下是GIS移动端应用的一些关键特性和应用场景&#xff1a; 关键特性&…

淘宝新店没有流量和访客怎么办

淘宝新店没有流量和访客时&#xff0c;可以采取以下措施来提升店铺的流量和吸引更多的访客&#xff1a; 3an推客是给商家提供的营销工具&#xff0c;3an推客CPS推广模式由商家自主设置佣金比例&#xff0c;以及设置商品优惠券&#xff0c;激励推广者去帮助商家推广商品链接&…

c++初阶——类和对象(中)

大家好&#xff0c;我是小锋&#xff0c;我们今天继续来学习类和对象。 类的6个默认成员函数 我们想一想如果一个类什么都没有那它就是一个空类&#xff0c;但是空类真的什么都没有吗&#xff1f; 其实并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以…

C++ | Leetcode C++题解之第43题字符串相乘

题目&#xff1a; 题解&#xff1a; class Solution { public:string multiply(string num1, string num2) {if (num1 "0" || num2 "0") {return "0";}int m num1.size(), n num2.size();auto ansArr vector<int>(m n);for (int i …

比亚迪海洋网再添实力爆款,海豹06DM-i、OCEAN-M、海狮07EV登陆北京车展

4月25日&#xff0c;比亚迪海洋网携海豹06DM-i、OCEAN-M、海狮07EV一齐亮相北京车展&#xff0c;引发关注热潮。其中&#xff0c;海洋网全新中型轿车海豹06DM-i价格区间12万-15万元&#xff0c;将于今年二季度上市&#xff1b;行业首款两厢后驱纯电钢炮OCEAN-M价格区间15万-20万…

重发布的原理及其应用

重发布的作用&#xff1a; 在一个网络中&#xff0c;若运行多种路由协议或者相同协议的不同进程&#xff1b;因为协议之间不能直接沟通计算&#xff0c;进程之间也是独立进行转发和运算的&#xff0c;所以&#xff0c;需要使用重发布来实现路由的共享。 条件 &#xff1a; 1&am…

RH850F1KM 搭建MCAL配置环境

1 搭建环境所需的安装包 安装以下软件安装包 1&#xff09;MCAL下载&#xff1a;AUTOSAR RH850/F1KM MCAL v42.11.00 Software 2&#xff09;Davinci工具 SIP包&#xff1a;DaVinci Configurator Pro 3&#xff09;下载网址&#xff1a;https://www.renesas.cn/cn/zh/product…

美团面试题-Nacos配置中心动态刷新原理

①&#xff1a;pull模式&#xff1a;主动拉去配置&#xff0c;通过固定的时间间隔。缺点&#xff1a;频繁请求&#xff0c;时效性不高&#xff0c;时间间隔不好设置。 ②&#xff1a;push模式&#xff1a;服务端检测到变化&#xff0c;主动将新配置推送给客户端&#xff0c;时效…

python的列表生成式

什么是列表生成式&#xff1f; 列表生成式&#xff0c;顾名思义&#xff0c;是生成列表的一个简单又直接的方法。它使用了一种紧凑的语法来构造列表&#xff0c;能够以一种更清晰、更简洁的方式来表达循环和过滤逻辑。 基础示例让我们先从一些简单的例子开始&#xff1a; 「生…

echarts 基础入门

前言&#xff1a;本文档主要讲解 echarts 在 vue3 中的用法&#xff0c;及其 echarts 的一些配置参数含义及用法。示例参考 echarts 示例 一&#xff1a;快速开始 1. 安装 echarts npm install echarts # or pnpm add echarts # or yarn add echarts 2. 使用 echarts <…

通过商品id采集京东商品详情数据(含价格、优惠券、详情、主图等字段)

item_get_app-获得JD商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;注册账号获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cach…

【八股】Spring篇

why Spring? 1.使用它的IOC功能&#xff0c;在解耦上达到了配置级别。 2.使用它对数据库访问事务相关的封装。 3.各种其他组件与Spring的融合&#xff0c;在Spring中更加方便快捷的继承其他一些组件。 IoC和DI &#x1f449;IOC是Inversion of Control的缩写&#xff0c;“…

Day4 商品管理

Day4 商品管理 这里会总结构建项目过程中遇到的问题&#xff0c;以及一些个人思考&#xff01;&#xff01; 学习方法&#xff1a; 1 github源码 文档 官网 2 内容复现 &#xff0c;实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 编写品牌服务 …
最新文章