当前位置: 首页 > news >正文

[Shell编程] Shell 循环结构入门

在 Shell 脚本编程中,循环结构是实现重复操作的核心工具。无论是批量处理文件、检查多台服务器状态,还是批量创建用户,都离不开循环的加持。本文将详细介绍 Shell 中的三种循环结构 ——forwhileuntil,帮助初学者快速掌握其用法与实战技巧。

一、for 循环:遍历列表的利器

for循环适用于已知取值列表的场景,尤其适合处理无规律但来源固定的对象(如文件中的列表、指定的多个值)。

1️⃣语法结构

bash

for 变量名 in 取值列表
do命令序列  # 循环体,需引用变量完成操作
done

  • 变量名:自定义名称,用于接收取值列表中的值;
  • 取值列表:多个值用空格分隔(可直接写在脚本中,或从文件读取);
  • do...done:包裹循环体,标志循环的开始和结束。

2️⃣执行流程

  1. 将取值列表中的第一个值赋给变量;
  2. 执行循环体中的命令序列;
  3. 依次将列表中的后续值赋给变量,重复执行循环体;
  4. 当列表中的所有值都处理完毕,循环结束。

3️⃣实战实例

<1>实例 1:简单循环输出

循环 5 次,依次输出 1 到 5:

bash

#!/bin/bash
for i in {1..5}  # 取值列表为1到5
doecho $i  # 输出变量i的值
done

执行结果:

plaintext

1
2
3
4
5

说明:{1..5}是 Shell 的扩展语法,代表 1、2、3、4、5 的列表。

<2>实例 2:检查服务器连通性

从文件中读取 IP 地址列表,批量检查主机是否在线:

  • 准备 IP 列表文件ipadds.txt

txt

192.168.141.129
192.168.141.130
127.0.0.1

  • 编写脚本chkhosts.sh

bash

#!/bin/bash
HLIST=$(cat /root/ipadds.txt)  # 从文件读取IP列表
for IP in $HLIST  # 遍历每个IP
doping -c 3 -W 2 $IP > /dev/null  # ping 3次,超时2秒,结果输出到空设备(不显示)if [ $? -eq 0 ]  # $?是上一条命令的返回值(0为成功,非0为失败)thenecho "Host $IP is up."  # ping成功,主机在线elseecho "Host $IP is down."  # ping失败,主机离线fi
done

  • 执行结果:

plaintext

Host 192.168.141.129 is down.
Host 192.168.141.130 is down.
Host 127.0.0.1 is up.

二、while 循环:按条件重复执行

while循环适用于需要根据条件控制循环次数的场景,比如按数字顺序操作(如编号 1 到 N 的对象)、满足特定条件时重复执行(如直到用户输入正确为止)。

1️⃣语法结构

bash

while 条件测试操作
do命令序列  # 循环体
done

  • 条件测试操作:可使用比较运算符(如-le小于等于、-gt大于)或命令返回值;
  • 当条件为真时,执行循环体;条件为假时,循环结束。

2️⃣执行流程

  1. 判断条件测试操作的结果;
  2. 若条件为真,执行循环体中的命令序列;
  3. 循环体执行完毕后,再次判断条件;
  4. 重复步骤 2-3,直到条件为假,循环结束。

3️⃣实战实例

<1>实例 1:循环输出 1 到 5

bash

#!/bin/bash
i=1  # 初始化变量i为1
while [ $i -le 5 ]  # 条件:i小于等于5
doecho $i  # 输出i的值let i++  # i自增1(等价于i=$((i+1)))
done

执行结果:

plaintext

1
2
3
4
5
<2>实例 2:批量添加规律编号用户

添加 20 个用户(stu1stu20),并设置初始密码:

bash

#!/bin/bash
PREFIX="stu"  # 用户名前缀
i=1  # 起始编号
while [ $i -le 20 ]  # 循环20次(i从1到20)
douseradd ${PREFIX}$i  # 创建用户(如stu1、stu2)echo "123456" | passwd --stdin ${PREFIX}$i > /dev/null  # 设置密码为123456(不显示输出)let i++  # 编号自增
done

验证结果:
执行grep "stu" /etc/passwd可看到新增的用户列表。

<3>扩展:批量删除用户

只需将循环体中的useradd改为userdel -r-r删除用户家目录):

bash

#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
douserdel -r ${PREFIX}$i  # 删除用户let i++
done

三、until 循环:条件为假时执行

until循环与while功能类似,但判断逻辑相反:条件为假时执行循环体,条件为真时结束循环。适合 “直到满足某个条件才停止” 的场景。

1️⃣语法结构

bash

until 条件测试操作
do命令序列  # 循环体
done

2️⃣执行流程

  1. 判断条件测试操作的结果;
  2. 若条件为假,执行循环体中的命令序列;
  3. 循环体执行完毕后,再次判断条件;
  4. 重复步骤 2-3,直到条件为真,循环结束。

3️⃣实战实例:计算 1 到 50 的和

bash

#!/bin/bash
i=0; s=0  # 初始化:i为计数器(从0开始),s为总和(初始0)
until [ $i -eq 50 ]  # 条件:i等于50时结束循环
dolet "i=$i+1"  # i自增1(从1到50)let "s=$s+$i"  # 累加i到s中
done
echo "sum(1..50)=$s"  # 输出结果

执行结果:

plaintext

sum(1..50)=1275

计算逻辑:i 从 1 到 50 依次累加,最终和为 1+2+...+50=1275。

四、三种循环的适用场景总结

  • for 循环:适合处理已知列表(如文件中的 IP、固定值集合);
  • while 循环:适合按条件控制次数(如编号 1 到 N、满足<=/>=条件);
  • until 循环:适合 “直到某个条件成立才停止”(如等待进程结束、计数器达到目标值)。

http://www.dtcms.com/a/322205.html

相关文章:

  • VMware使用NAT模式,使本机与虚拟机在不同的网络,并且虚拟机可以上网
  • 洛谷 P1433 吃奶酪-普及+/提高
  • 嵌入式第二十三课 !!!树结构与排序(时间复杂度)
  • 浅试A2A
  • 01数据结构-图的概念和图的存储结构
  • PCA多变量离群点检测:Hotelling‘s T2与SPE方法原理及应用指南
  • ABP VNext + Fody AOP:编译期织入与性能监控
  • 嵌入式学习 day47 LED
  • ctfshow_萌新web9-web15-----rce
  • AJAX与axios框架
  • Vuex 数据共享
  • v-model双向绑定指令
  • Overleaf单栏双栏排版技巧
  • MWORKS 2025b:里程碑升级,Sysblock全栈替代,开启AI4MWORKS智能工程
  • F I R S T Q U A R T E R 2 0 2 5 - - M a y 2 2 2 0 2 5
  • 什么是Serverless(无服务器架构)
  • 数据结构---二叉树(概念、特点、分类、特性、读取顺序、例题)、gdb调试指令、时间复杂度(概念、大O符号法、分类)
  • Qwen Agent 入门介绍与简单使用示例
  • 基于STM32单片机的OneNet物联网环境检测系统
  • Vue 路由跳转
  • Vue3生命周期
  • ZK首次连接失败,第二次连接成功的问题解决方案
  • AI入门学习--如何对RAG测试
  • Flutter开发 Switch、SwitchListTile的基本使用
  • 嵌入式LINUX—————系统编程
  • Javascript中的一些常见设计模式
  • 小程序中使用echarts(2025/8/8)
  • 最近看到的提示词相关内容汇总
  • Document Picture-in-Picture API拥抱全新浮窗体验[参考:window.open]
  • K-Means 聚类