Bash Shell 脚本中的循环语句

news2024/9/30 13:24:37

文章目录

    • Bash Shell 脚本中的循环语句
      • 一、for 循环
        • 1.1 列表循环
        • 1.2 不带列表循环(C 风格的 for 循环)
      • 二、案例示例
        • 2.1 打印 1-5 的数字
        • 2.2 打印 5 次 "hello world"
        • 2.3 打印 abcde
        • 2.4 输出 0-50 之间的偶数
      • 三、应用技巧
        • 3.1 使用花括号和 seq 的技巧
      • 四、for 循环的实际应用
        • 4.1 批量添加用户
        • 4.2 根据 IP 地址列表检查主机状态
      • 五、循环控制语句
        • 5.1 continue
        • 5.2 break
        • 5.3 exit
      • 六、while 循环
        • 6.1 语法结构
        • 6.2 示例:打印 1-5
        • 6.3 死循环
      • 七、until 循环
        • 7.1 语法结构
        • 7.2 示例:计算 1-50 的和
      • 八、数组的定义和操作
        • 8.1 数组定义方式
        • 8.2 获取数组长度
        • 8.3 遍历数组
      • 九、案例:幸运会员
  • 输出最终的计数结果

Bash Shell 脚本中的循环语句

​ 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态。当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。此时,使用 for 循环会使任务变得更加简单和高效。

一、for 循环

1.1 列表循环

语法结构:

for 变量名 in {list}
do
    command
done

示例:

for i in {a..c}
do
    echo $i
done

image-20240722173858053

for i in {1..5}    # {}里面不识别变量
do
    echo $i
done

image-20240722174007836

for i in `seq 5`   # seq 5=1、2、3、4、5序列
do      
    echo $i
done

image-20240722173721666

a=10
for i in `seq $a`    # seq可以引用变量
do
    echo $i
done
1.2 不带列表循环(C 风格的 for 循环)

语法结构:

for ((expr1; expr2; expr3))
do
    command
done

示例:

#!/bin/bash
for ((i=1; i<=5; i++))
do
    echo $i
done

image-20240722181936930

二、案例示例

2.1 打印 1-5 的数字
#!/bin/bash

for i in {1..5}
do
    echo $i
done

image-20240722182341786

2.2 打印 5 次 “hello world”
#!/bin/bash

for i in {1..5}
do
    echo "hello world"
done

image-20240722182501059

2.3 打印 abcde
#!/bin/bash

for i in a b c d e
do
    echo $i
done

image-20240722182602798

2.4 输出 0-50 之间的偶数
#!/bin/bash

for i in {0..50..2}  # ..2代表步长为2,每隔2个
do
    echo $i
done

image-20240722182740823

三、应用技巧

3.1 使用花括号和 seq 的技巧

示例:

for i in {1..50..2}  # 1-50 的奇数
do
    echo $i
done

image-20240722182817763

for i in $(seq 10)  # 1-10 正序排列
do
    echo $i
done

for i in $(seq 10 -1 1)  # 1-10 倒序排列
do
    echo $i
done

image-20240722183417724

for i in $(seq 1 2 10)  # 1-10 的奇数,中间为步长
do
    echo $i
done

image-20240722183925669

四、for 循环的实际应用

4.1 批量添加用户

方式一:

#!/bin/bash

for i in {1..5}
do
    useradd stu$i
    echo "123" | passwd --stdin stu$i
done

image-20240722184219038

方式二:

#!/bin/bash

ULIST=$(cat /root/users.txt) 

for UNAME in $ULIST
do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME &>/dev/null 
done

image-20240722184636560

4.2 根据 IP 地址列表检查主机状态

方式一:

#!/bin/bash

HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null

    if [ $? -eq 0 ]; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
done

image-20240722185212467

方式二:

#!/bin/bash

network="192.168.10"
for addr in {1..254}
do
    ping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/null
    if [ $? -eq 0 ]; then
        echo "$network.$addr is up"
    else
        echo "$network.$addr is down."
    fi
done

image-20240722185748696

五、循环控制语句

5.1 continue

示例:

#!/bin/bash

for ((i=1; i<=5; i++))
do
    if [ $i -eq 3 ]; then
        continue
    else
        echo $i
    fi
done

image-20240722190515004

5.2 break

示例:

#!/bin/bash

for ((i=1; i<=10; i++))
do
    if [ $i -eq 8 ]; then
        break
    else
        echo $i
    fi
done

image-20240722190900749

5.3 exit

示例:

#!/bin/bash

for i in {1..5}
do
    if [ $i -eq 3 ]; then
        exit 100 
    else
        echo $i
    fi
done

echo "hi"

image-20240722191615313

六、while 循环

6.1 语法结构
while 表达式
do
    command
done
6.2 示例:打印 1-5
#!/bin/bash

i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done
echo "最后 i 的值为: $i"

image-20240722192702897

6.3 死循环

示例:

while true
do
    command
done

七、until 循环

7.1 语法结构
until 表达式
do
    command
done
7.2 示例:计算 1-50 的和
#!/bin/bash

i=1
sum=0
until [ $i -eq 51 ]
do
    sum=$((sum + i))
    let i++
done
echo $sum

八、数组的定义和操作

8.1 数组定义方式

方式一:

num=(11 22 33 44)

方式二:

num=([0]=55 [1]=66 [2]=77 [4]=88)

方式三:

list="11 12 13 14"
num=($list)

方式四:

num[0]=11
num[1]=22
num[2]=33
8.2 获取数组长度
arr_number=(10 20 30 40 50)
arr_length=${#arr_number[*]}
echo $arr_length

image-20240722195716703

8.3 遍历数组
#!/bin/bash

arr=(1 2 3 4 5 6)
for i in ${arr[*]}
do
    echo $i
done

image-20240722200003463

九、案例:幸运会员

示例:

#!/bin/bash

# 启用调试模式
set -x

# 初始化计数变量
a=0
b=0
c=0

# 循环10次
for ((i=1; i<=10; i++))
do
    # 生成一个随机数,范围为1到3
    num=$((RANDOM % 3 + 1))

    # 从文件中读取相应的行,提取第二列的值
    LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')

    # 根据提取的值进行相应的计数
    case $LIST in
        zhangsan)
            ((a++))
            ;;
        lisi)
            ((b++))
            ;;
        *)
            ((c++))
            ;;
    esac

    # 输出当前的 LIST 值
    echo "$LIST"
done

# 输出最终的计数结果
echo "zhangsan: $a 次, lisi: $b 次,

 其他: $c 次"
# 生成一个随机数,范围为1到3
num=$((RANDOM % 3 + 1))

# 从文件中读取相应的行,提取第二列的值
LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')

# 根据提取的值进行相应的计数
case $LIST in
    zhangsan)
        ((a++))
        ;;
    lisi)
        ((b++))
        ;;
    *)
        ((c++))
        ;;
esac

# 输出当前的 LIST 值
echo "$LIST"

done

输出最终的计数结果

echo "zhangsan: $a 次, lisi: $b 次,

其他: $c 次"


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

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

相关文章

自注意力和位置编码

一、自注意力 1、给定一个由词元组成的输入序列x1,…,xn&#xff0c; 其中任意xi∈R^d&#xff08;1≤i≤n&#xff09;。 该序列的自注意力输出为一个长度相同的序列 y1,…,yn&#xff0c;其中&#xff1a; 2、自注意力池化层将xi当作key&#xff0c;value&#xff0c;query来…

【Nuxt】资源导入

public 通常用于存放静态资源。 assets 通常用于存放样式表、字体或者 svg 的资源。 图片资源 alias 推荐使用 ~。 <img src"/avatar1.png" alt"avatar1"/> <img src"/assets/images/unnamed.jpg" alt"unnamed"/><te…

(STM32笔记)九、RCC时钟树与时钟 第二部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 九、RCC时钟树与时钟 九、RCC时钟树与时钟2、时钟配置函数时钟初始化思路(72M)复位时钟至默认状态使能HSE&#xff0c;并等待…

第128天:内网安全-横向移动IPCATSC 命令Impacket 套件CS 插件全自动

环境部署 案例一&#xff1a; 域横向移动-IPC-命令版-at&schtasks 首先是通过外网web访问到win2008&#xff0c;获得了win2008的权限&#xff0c;这一步不做演示 因为里面的主机都不出网&#xff0c;所以只能利用win2008进行正向或者反向连接 信息收集 域内用户信息&…

【Git学习笔记】零基础入门学习Git

1. 学习目标 掌握Git企业应用开发的基本操作以及背后原理&#xff0c;掌握工作区、暂存区、版本库的区别掌握Git的版本管理&#xff0c;例如版本回退、撤销、修改等操作掌握Git的分支管理&#xff0c;例如创建分支、合并分支、删除分支掌握本地仓库与远程仓库之间的区别&#…

数据结构实验报告-链表

实 验 二 报 告 一、实验目的 1.熟练掌握链表的结构类型定义、特点。 2.熟练掌握链表的基本操作算法的实现及其算法时间复杂度的分析。 3.掌握循环链表、双向链表的结构类型定义及其基本操作算法。掌握链表的应用。 二、实验内容 1&#xff0e;请编写一个完整的程序&…

基于RHEL7的服务器批量安装

目录 一、项目要求 二、实验环境 三、生成kickstart自动化安装脚本 四、搭建dhcp服务并测试kickstart脚本 五、搭建pxe网络安装环境实现服务器自动部署 ​编辑 六、测试 一、项目要求 1.使用kickstart编写自动化安装脚本 2.搭建dhcp服务并测试kickstart脚本 3.搭建px…

软件设计之HTML5

软件设计之HTML5 【狂神说Java】HTML5完整教学通俗易懂 学习内容&#xff1a; 软件开发技能点参照&#xff1a;软件开发&#xff0c;小白变大佬&#xff0c;这套学习路线让你少走弯路是认真的&#xff0c;欢迎讨论 软件开发技能点参照&#xff1a;Java学习完整路线&#xff…

【doghead】mac构建 2: player 端 clion构建

准备工作 【doghead】mac构建 1 【doghead】mac: clion2024.1启动崩溃 mbp的 uv 构建ok zhangbin@zhangbin-mbp-2  ~/tet/Fargo/zhb-bifrost/Bifrost-202403/worker/third_party/libuv   main clion使用lldb cmake构建 更

SQL注入:MySQL元数据库,外网实战手工SQL注入

MySQL元数据库 MySQL的元数据库是一组特殊的数据库&#xff0c;用于存储MySQL服务器的元数据信息&#xff0c;在sql注入中较为常用为以下两种元数据库&#xff1a; information_schema&#xff1a;这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表…

7 WIFI

7 WIFI 1、ESP8266模块2、烧写固件3、调试工具4、使用库函数实现wifi4.1 实现串口3和DMA的初始化4.2 利用串口3实现wifi 1、ESP8266模块 ESP8266系列无线模块是安信可科技自主研发设计的一系列高性价比WIFI SOC模组。该系列模块支持标准的IEEE802.11 b/g/n协议&#xff0c;内置…

Unity UnityWebRequest封装类

简化api调用流程&#xff0c;非常奈斯。 RestWebClient.cs using System; using System.Collections; using UnityEngine; using UnityEngine.Networking;namespace MYTOOL.RestClient {/// <summary>/// UnityWebRequest封装类/// </summary>public class RestW…

基于R语言绘制GGE双标图1

参考资料&#xff1a; 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、安装GGEBiplots包 目前搜索到的资料多数为“GGEBiplotGUI”安装包&#xff0c;但在安装时报错&#xff0c;如下…

【独家原创】基于APO-Transformer-LSTM多特征分类预测(多输入单输出)Matlab代码

【独家原创】基于APO-Transformer-LSTM多特征分类预测&#xff08;多输入单输出&#xff09;Matlab代码 目录 【独家原创】基于APO-Transformer-LSTM多特征分类预测&#xff08;多输入单输出&#xff09;Matlab代码分类效果基本描述程序设计参考资料 分类效果 基本描述 [24年最…

【初阶数据结构题目】11.相交链表

相交链表 点击链接做题 思路&#xff1a; 如何判断链表是否相交找相交链表的起始节点 遍历两个链表&#xff0c;若尾结点相同&#xff0c;则链表一定相交。两个链表节点个数相同&#xff1a;往后遍历&#xff0c;找到相交的位置两个链表节点个数不同&#xff1a; 找两个链表的…

End-to-End Object Detection with Transformers(Detection Transformer)翻译

摘要 我们提出了一种新方法&#xff0c;将目标检测视为直接的集合预测问题。我们的方法简化了检测流程&#xff0c;有效消除了对许多手工设计组件的需求&#xff0c;如非极大值抑制过程或锚框生成&#xff0c;这些组件显式编码了我们对任务的先验知识。新框架称为检测变换器&a…

Meta Reality Labs:巨额亏损背后的挑战与展望

一、财务概况 自2020年以来,Meta的Reality Labs部门累计亏损已超过450亿美元,其中2023年的亏损达到160亿美元,2024年第一季度亏损38亿美元,分析师预计第二季度亏损可能接近50亿美元。尽管投入巨大,Reality Labs的收入却呈现下降趋势,与不断增加的支出形成鲜明对比。 二…

QT使用V4L2摄像头采集数据

前言 之前我们已经实现了摄像头用V4L2框架采集一张图片&#xff0c;现在就是实现用摄像头采集视频流&#xff08;本质一张图片就是一帧&#xff0c;很多张图片就是很多帧&#xff0c;拼起来就是一个视频&#xff09;。 本部分需要大家有一点QT相关的知识&#xff0c;整体框架还…

CSP 2020 第三题:表达式

牛客网题目 题目内容&#xff1a; 示例1 输入 x1 x2 & x3 | 3 1 0 1 3 1 2 3输出 1 1 0题意&#xff1a; 给出后续表达式&#xff0c;需要计算这个表达式的值&#xff0c;并让某几个变量值取反&#xff0c;再输出新的表达式的值&#xff08;变量改变均为临时的&#xff…

基于Orangepi全志H616学习Python3

目录 一、功能需求 二、Python的安装和环境搭建 三、Python的基础学习 3.1 Python的特点&#xff1a; 3.2 编写并运行第一个Python程序&#xff1a; 3.3 标识符&#xff1a; 3.4 关键字&#xff1a; 3.5 注释&#xff1a; 3.6 行与缩进&#xff1a; 3.7 多行语句&…