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

[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.xdnf.cn/news/17411.html

相关文章:

  • 2025.08.08 反转链表
  • Autosar AP中Promise和Future的异步消息通信的详细解析
  • 【设计模式】建造者模式
  • 从伪造的验证码到远程攻击工具 (RAT):2025 年网络欺骗威胁趋势
  • Dart关键字完全指南:从基础到高级用法详解
  • C++归并排序
  • 人工智能之数学基础:事件独立性
  • 登上Nature子刊,深度学习正逐渐接管基础模型
  • Docker 安装 Redis
  • 【vue】Vue 重要基础知识清单
  • Vue3生命周期
  • wordpress的wp-config.php文件的详解
  • 三方相机问题分析七:【datespace导致GPU异常】三方黑块和花图问题
  • 专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
  • win11中Qt5.14.0+msvc2019+opencv4.9配置
  • Linux中的内核同步源码相关总结
  • GPT-5 is here
  • BUG调试案例十七:ENC424J600以太网掉线问题案例
  • Python实现点云PCA配准——粗配准
  • 板卡如何安装在主机系统(刀片服务器或计算节点)
  • 用browse实现菜单功能的方法
  • 数据结构--哈希表与排序、选择算法
  • 力扣-53.最大子数组和
  • 库函数版独立按键用位运算方式实现(STC8)
  • 解决阿里云盘不能分享压缩包【7-zip工具】(详细)
  • Linux多线程——生产者消费者模型
  • C/C++二维数组创建内存分配
  • 大模型——部署体验gpt-oss-20b
  • 云原生时代的 Linux:容器、虚拟化与分布式的基石
  • 复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​