当前位置:首页>Linux>Linux Shell 循环核心精讲:for/while/until 与实战脚本

Linux Shell 循环核心精讲:for/while/until 与实战脚本

  • 2026-09-10 12:06:52
Linux Shell 循环核心精讲:for/while/until 与实战脚本

技术弄巷

读完仅需

5
分钟

记得星标公众号

前言

在 Linux 运维自动化场景中,Shell 循环是批量处理、自动化部署、巡检监控、数据统计的核心基础技能。熟练掌握 for、while、until循环语法,配合中断语句与字符串处理能力,能大幅提升运维效率,实现批量创建用户、网段巡检、磁盘监控、文件比对等高频操作。本文从语法、示例、实战三个维度,完整梳理 Shell 循环逻辑控制,可直接用于生产脚本编写。

一、循环的三种实现方式

Shell 中常用循环分为三类,适配不同业务场景:

  1. for 循环
    :适合已知次数/列表的批量操作
  2. while 循环
    :适合条件判断、持续监控、文件逐行处理
  3. until 循环
    :条件为假时执行,条件为真时退出

二、for 循环详解

基础语法

# 写法1(单行)
for 变量 in 取值列表; do 操作; done

# 写法2(多行,推荐脚本使用)
for 变量 in 取值列表
do
    执行的操作
done

高频实战示例

  1. 批量创建随机文件
#!/bin/bash
# 在/tmp创建20个随机文件名文件
for i in $(seq 20); do
touch /tmp/$(openssl rand -hex 10)
done
  1. 批量创建用户(user1~user30)
#!/bin/bash
for i in $(seq 30); do
ifid user$i &> /dev/null; then
echo"用户user$i已存在"
else
        useradd user$i
echo"redhat" | passwd --stdin user$i &> /dev/null
echo"用户user$i创建完成,初始密码:redhat"
fi
done
  1. 批量创建用户(从文件读取用户名)
#!/bin/bash
for name in $(cat /tmp/userlist); do
ifid$name &> /dev/null; then
echo"用户$name已存在"
else
        useradd $name
echo"redhat" | passwd --stdin $name &> /dev/null
echo"用户$name创建完成,初始密码:redhat"
fi
done
  1. 网段巡检(192.168.140.0/24 在线主机)
#!/bin/bash
net=192.168.140.
for i in $(seq 254); do
    {
if ping -c 1 -W 1 $net$i &> /dev/null; then
echo"Host $net$i is up"
fi
    }&
done
wait
  1. 批量文件重命名(txt 转 jpg)
#!/bin/bash
for src_file in $(find /opt/test/ -name "*.txt"); do
       new_file=${src_file/txt/jpg}
mv$src_file$new_file
done

三、Shell 字符串处理(循环常用)

1. 字符串替换

data=abc
echo${data/b/K}# 输出 aKc

2. 字符串截取

data="linux"
echo${data:0:2}# li
echo${data:2:2}# nu
echo${data:1}# inux

3. 获取字符串长度

data="linux"
echo${
#data}# 5

4. 统计 Shell 类型用户数量

#!/bin/bash
bash_num=0
nologin_num=0
total=$(wc -l /etc/passwd | awk '{print $1}')

for i in $(seq$total); do
    sh=$(head -n $i /etc/passwd | tail -n1 | awk -F: '{print $7}')
if [ "$sh" = "/bin/bash" ]; then
let bash_num++
elif [ "$sh" = "/sbin/nologin" ]; then
let nologin_num++
fi
done

echo"bash用户数:$bash_num,nologin用户数:$nologin_num"

四、循环中断语句

1. break:终止整个循环

#!/bin/bash
for i in $(seq 5); do
echo"第$i次循环开始"
    [ $i -eq 3 ] && break
echo"第$i次循环结束"
done

2. continue:跳过本次,进入下一次

#!/bin/bash
for i in $(seq 5); do
echo"第$i次循环开始"
    [ $i -eq 3 ] && continue
echo"第$i次循环结束"
done

实战:获取网段在线主机 IP + MAC

#!/bin/bash
local_ip=$(ifconfig ens33 | grep netmask | awk '{print $2}')
local_mac=$(ifconfig ens33 | grep ether | awk '{print $2}')
echo"本机IP:$local_ip,MAC:$local_mac"
echo"========================================="

net=192.168.140.
for i in $(seq 254); do
    [ $i -eq 10 ] && continue
if ping -c 1 -W 1 $net$i &> /dev/null; then
        mac=$(arping -c1 -w1 -I ens33 $net$i | grep reply | awk '{print $5}')
echo"IP:$net$i  MAC:$mac"
fi
done

五、while 循环详解

1. 常规条件循环

while 条件; do
    操作
done

示例:创建10个随机文件

#!/bin/bash
i=1
while [ $i -le 10 ]; do
touch /tmp/$(openssl rand -hex 10)
let i++
done

2. 无限循环(监控/菜单工具)

whiletrue; do
    操作
done

示例:简易虚拟机管理菜单

#!/bin/bash
cat << EOF
====== 虚拟机管理工具 ======
1. 创建虚拟机
2. 销毁虚拟机
3. 退出
EOF


whiletrue; do
read -p "请选择:" choice
case$choicein
        1) echo"执行创建";;
        2) echo"执行销毁";;
        3) break;;
        *) echo"输入错误,请重试";;
esac
done

3. while read line(逐行处理文件/命令输出)

whileread line; do
    处理 $line
done < 文件名

示例:监控磁盘使用率

#!/bin/bash
df -hT | grep "^/dev" | whileread line; do
    usage=$(echo$line | awk '{print $6}' | tr -d '%')
if [ $usage -gt 20 ]; then
        disk=$(echo$line | awk '{print $1}')
        free=$(echo$line | awk '{print $5}')
        mount=$(echo$line | awk '{print $7}')
echo"磁盘:$disk 剩余:$free 挂载点:$mount"
fi
done

示例:统计 TCP 连接状态

#!/bin/bash
listen=0
estab=0
whileread line; do
    state=$(echo$line | awk '{print $6}')
    [ "$state" = "LISTEN" ] && let listen++
    [ "$state" = "ESTABLISHED" ] && let estab++
done < <(netstat -antp | grep ^tcp)

echo"监听数:$listen,连接数:$estab"

示例:批量导入数据到 MySQL

#!/bin/bash
whileread line; do
    name=$(echo$line | awk -F: '{print $1}')
pwd=$(echo$line | awk -F: '{print $2}')
    mysql -uroot -e "insert into info.userInfo values('$name','$pwd')"
done < /etc/passwd

六、综合实战:目录文件一致性校验

#!/bin/bash
for src in $(find /opt/src -type f); do
    dest=${src/src/dest}
if [ ! -e "$dest" ]; then
echo"文件丢失:$dest"
else
        src_md5=$(md5sum$src | awk '{print $1}')
        dest_md5=$(md5sum$dest | awk '{print $1}')
        [ "$src_md5" != "$dest_md5" ] && echo"文件不一致:$src"
fi
done

核心要点总结

  1. for 循环
    :适合固定次数/列表批量操作,是运维最常用循环
  2. while 循环
    :适合条件判断、无限监控、逐行处理文件
  3. break/continue
    :break 退出整个循环;continue 跳过当前轮次
  4. 字符串处理
    :替换、截取、长度是循环中高频操作
  5. 并行优化
    :网段巡检用 &后台执行 + wait提升速度
  6. 管道陷阱
    :while 管道内变量无法外漏,可用 < <(命令)规避

结尾互动

本文覆盖 Linux Shell 循环全部核心语法 + 生产实战脚本,从基础到实战一站式掌握。如果你觉得内容实用,对你的运维工作有帮助,欢迎点赞、在看、转发给更多同行!

关注我,持续更新 Linux 运维自动化、Shell 脚本实战、系统优化等硬核干货,一起高效运维,少敲重复代码!

最新文章

随机文章