Bash Shell 脚本中的循环语句

devtools/2024/10/19 7:33:59/

文章目录

    • 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 列表循环

语法结构:

bash">for 变量名 in {list}
docommand
done

示例:

bash">for i in {a..c}
doecho $i
done

image-20240722173858053

bash">for i in {1..5}    # {}里面不识别变量
doecho $i
done

image-20240722174007836

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

image-20240722173721666

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

语法结构:

bash">for ((expr1; expr2; expr3))
docommand
done

示例:

bash">#!/bin/bash
for ((i=1; i<=5; i++))
doecho $i
done

image-20240722181936930

二、案例示例

2.1 打印 1-5 的数字
bash">#!/bin/bashfor i in {1..5}
doecho $i
done

image-20240722182341786

2.2 打印 5 次 “hello world”
bash">#!/bin/bashfor i in {1..5}
doecho "hello world"
done

image-20240722182501059

2.3 打印 abcde
bash">#!/bin/bashfor i in a b c d e
doecho $i
done

image-20240722182602798

2.4 输出 0-50 之间的偶数
bash">#!/bin/bashfor i in {0..50..2}  # ..2代表步长为2,每隔2个
doecho $i
done

image-20240722182740823

三、应用技巧

3.1 使用花括号和 seq 的技巧

示例:

bash">for i in {1..50..2}  # 1-50 的奇数
doecho $i
done

image-20240722182817763

bash">for i in $(seq 10)  # 1-10 正序排列
doecho $i
done

bash">for i in $(seq 10 -1 1)  # 1-10 倒序排列
doecho $i
done

image-20240722183417724

bash">for i in $(seq 1 2 10)  # 1-10 的奇数,中间为步长
doecho $i
done

image-20240722183925669

四、for 循环的实际应用

4.1 批量添加用户

方式一:

bash">#!/bin/bashfor i in {1..5}
douseradd stu$iecho "123" | passwd --stdin stu$i
done

image-20240722184219038

方式二:

bash">#!/bin/bashULIST=$(cat /root/users.txt) for UNAME in $ULIST
douseradd $UNAMEecho "123456" | passwd --stdin $UNAME &>/dev/null 
done

image-20240722184636560

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

方式一:

bash">#!/bin/bashHLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
doping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ]; thenecho "Host $IP is up."elseecho "Host $IP is down."fi
done

image-20240722185212467

方式二:

bash">#!/bin/bashnetwork="192.168.10"
for addr in {1..254}
doping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/nullif [ $? -eq 0 ]; thenecho "$network.$addr is up"elseecho "$network.$addr is down."fi
done

image-20240722185748696

五、循环控制语句

5.1 continue

示例:

bash">#!/bin/bashfor ((i=1; i<=5; i++))
doif [ $i -eq 3 ]; thencontinueelseecho $ifi
done

image-20240722190515004

5.2 break

示例:

bash">#!/bin/bashfor ((i=1; i<=10; i++))
doif [ $i -eq 8 ]; thenbreakelseecho $ifi
done

image-20240722190900749

5.3 exit

示例:

bash">#!/bin/bashfor i in {1..5}
doif [ $i -eq 3 ]; thenexit 100 elseecho $ifi
doneecho "hi"

image-20240722191615313

六、while 循环

6.1 语法结构
bash">while 表达式
docommand
done
6.2 示例:打印 1-5
bash">#!/bin/bashi=1
while [ $i -le 5 ]
doecho $ilet i++
done
echo "最后 i 的值为: $i"

image-20240722192702897

6.3 死循环

示例:

bash">while true
docommand
done

七、until 循环

7.1 语法结构
bash">until 表达式
docommand
done
7.2 示例:计算 1-50 的和
bash">#!/bin/bashi=1
sum=0
until [ $i -eq 51 ]
dosum=$((sum + i))let i++
done
echo $sum

八、数组的定义和操作

8.1 数组定义方式

方式一:

bash">num=(11 22 33 44)

方式二:

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

方式三:

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

方式四:

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

image-20240722195716703

8.3 遍历数组
bash">#!/bin/basharr=(1 2 3 4 5 6)
for i in ${arr[*]}
doecho $i
done

image-20240722200003463

九、案例:幸运会员

示例:

bash">#!/bin/bash# 启用调试模式
set -x# 初始化计数变量
a=0
b=0
c=0# 循环10次
for ((i=1; i<=10; i++))
do# 生成一个随机数,范围为1到3num=$((RANDOM % 3 + 1))# 从文件中读取相应的行,提取第二列的值LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')# 根据提取的值进行相应的计数case $LIST inzhangsan)((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 inzhangsan)((a++));;lisi)((b++));;*)((c++));;
esac# 输出当前的 LIST 值
echo "$LIST"

done

输出最终的计数结果

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

其他: $c 次"



http://www.ppmy.cn/devtools/91199.html

相关文章

5G 网络切片

5G 业务分类 增强型移动宽带(eMBB) 传统数据业务&#xff0c;特点是高带宽超高可靠性低时延业务&#xff08;URLLC&#xff09;无人驾驶、工业自动化等业务, 特点是高可靠、低时延海量机器类通信(mMTC) 物联网&#xff0c;特点是大量连接&#xff0c;时延不敏感&#xff0c;数…

java计算机毕设课设—基于网络爬虫技术的网络新闻分析系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—基于网络爬虫技术的网络新闻分析系统 基于网络爬虫技术的新闻分析系统&#xff0c;它能够实时抓取凤凰网、网易、新浪、搜狐等网站的新闻数据&#xff0c;提取正文和点击量&#xff0c;每日定时抓取。系统还能对抓取的新闻进行…

贝叶斯学习方法:几种方法介绍

目录 1 拉普拉斯还原-轻松贝叶斯深度学习2 具有归一化流的变分推理3 基于条件归一化流的多元概率时间序列预测 1 拉普拉斯还原-轻松贝叶斯深度学习 深度学习的贝叶斯公式已被证明具有令人信服的理论性质&#xff0c;并提供实用的功能优势&#xff0c;例如改进预测不确定性量化…

[最新2025]CentOS7安装Python3设置环境变量(软链接)

一、安装python3 【注意】全程在 root 权限下执行 1、先安装openssl&#xff0c;不然以后python会遇到出错&#xff1a;ModuleNotFoundError: No module named _ssl curl http://www.openssl.org/source/openssl-1.1.1.tar.gz -o openssl-1.1.1.tar.gz tar -zxvf openssl-1.1.1…

EMF矢量图工具Graphpad Prism(棱镜科研绘图工具)

Graphpad Prism 是一款功能强大、专业实用的棱镜科研绘图软件&#xff0c;专为科研工作者而设计研发&#xff0c;可帮助用户进行专业便捷的科研图像绘制&#xff0c;通过该款软件用户可以进行新型子列图进行创建&#xff0c;可以进行平滑的线性图进行绘制&#xff0c;可以说是一…

树莓派4/5:在无显示器(无屏幕)下的系统安装与远程控制

一、场景说明 树莓派4/5的价格不高&#xff0c;用户可以通过显示器、鼠标、键盘&#xff0c;像使用计算机一样使用树莓派。 然而&#xff0c;如果用户购买的是低运存版本&#xff0c;或者希望降低硬件成本&#xff0c;则可以选择安装无桌面版本的Lite系统&#xff0c;在不接入…

AI表情神同步!LivePortrait安装配置,一键包,使用教程

快手在AI视频这领域还真有点东西&#xff0c;视频生成工具“可灵”让大家玩得不亦乐乎。 现在又开源了一款超好玩的表情同步&#xff08;表情控制&#xff09;项目。 一看这图片&#xff0c;就知道是小视频平台出的&#xff0c;充满了娱乐性。发布没几天就已经有8000Star。 项…

大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…