
技术弄巷
读完仅需
记得星标公众号

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

Shell 中常用循环分为三类,适配不同业务场景:
# 写法1(单行)
for 变量 in 取值列表; do 操作; done
# 写法2(多行,推荐脚本使用)
for 变量 in 取值列表
do
执行的操作
done
#!/bin/bash
# 在/tmp创建20个随机文件名文件
for i in $(seq 20); do
touch /tmp/$(openssl rand -hex 10)
done
#!/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
#!/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
#!/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
#!/bin/bash
for src_file in $(find /opt/test/ -name "*.txt"); do
new_file=${src_file/txt/jpg}
mv$src_file$new_file
done
data=abc
echo${data/b/K}# 输出 aKc
data="linux"
echo${data:0:2}# li
echo${data:2:2}# nu
echo${data:1}# inux
data="linux"
echo${#data}# 5
#!/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"
#!/bin/bash
for i in $(seq 5); do
echo"第$i次循环开始"
[ $i -eq 3 ] && break
echo"第$i次循环结束"
done
#!/bin/bash
for i in $(seq 5); do
echo"第$i次循环开始"
[ $i -eq 3 ] && continue
echo"第$i次循环结束"
done
#!/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 条件; do
操作
done
示例:创建10个随机文件
#!/bin/bash
i=1
while [ $i -le 10 ]; do
touch /tmp/$(openssl rand -hex 10)
let i++
done
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
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
&后台执行 + wait提升速度< <(命令)规避本文覆盖 Linux Shell 循环全部核心语法 + 生产实战脚本,从基础到实战一站式掌握。如果你觉得内容实用,对你的运维工作有帮助,欢迎点赞、在看、转发给更多同行!
关注我,持续更新 Linux 运维自动化、Shell 脚本实战、系统优化等硬核干货,一起高效运维,少敲重复代码!

