[Shell编程] Shell 循环结构入门
在 Shell 脚本编程中,循环结构是实现重复操作的核心工具。无论是批量处理文件、检查多台服务器状态,还是批量创建用户,都离不开循环的加持。本文将详细介绍 Shell 中的三种循环结构 ——for
、while
和until
,帮助初学者快速掌握其用法与实战技巧。
一、for 循环:遍历列表的利器
for
循环适用于已知取值列表的场景,尤其适合处理无规律但来源固定的对象(如文件中的列表、指定的多个值)。
1️⃣语法结构
bash
for 变量名 in 取值列表
do命令序列 # 循环体,需引用变量完成操作
done
- 变量名:自定义名称,用于接收取值列表中的值;
- 取值列表:多个值用空格分隔(可直接写在脚本中,或从文件读取);
- do...done:包裹循环体,标志循环的开始和结束。
2️⃣执行流程
- 将取值列表中的第一个值赋给变量;
- 执行循环体中的命令序列;
- 依次将列表中的后续值赋给变量,重复执行循环体;
- 当列表中的所有值都处理完毕,循环结束。
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️⃣执行流程
- 判断条件测试操作的结果;
- 若条件为真,执行循环体中的命令序列;
- 循环体执行完毕后,再次判断条件;
- 重复步骤 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 个用户(stu1
到stu20
),并设置初始密码:
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️⃣执行流程
- 判断条件测试操作的结果;
- 若条件为假,执行循环体中的命令序列;
- 循环体执行完毕后,再次判断条件;
- 重复步骤 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 循环:适合 “直到某个条件成立才停止”(如等待进程结束、计数器达到目标值)。