运维里还有一种常见场景:要对一堆服务器、一堆文件做同样的检查或同样的操作。比如给 100 台机器都看下”磁盘满没满”,或者把目录里所有 .log 文件统一压缩。手动一个个来太慢,循环 + 变量就是干这个的。
脚本一:批量巡检多台服务器
用途: 配合 SSH 批量登录多台服务器,逐台检查磁盘使用率并汇总,快速掌握整个机群的磁盘健康。
#!/bin/bash
# 服务器 IP 列表(每行一台)
HOSTS="192.168.1.101
192.168.1.102
192.168.1.103"
for ip in $HOSTS; do
echo "===== $ip ====="
# 通过 ssh 在远程执行 df 命令查看根分区使用率
ssh -o ConnectTimeout=5 root@"$ip" "df -h / | awk 'NR==2{print \$5}'" || {
echo " [!] $ip 连接失败或未响应"
}
done
脚本二:批量压缩过期日志
用途: 对指定目录下超过 7 天的日志文件统一 gzip 压缩,大幅省空间,同时不删除原始记录(可用于归档)。
#!/bin/bash
LOG_DIR="/var/log"
DAYS=7
# 找到 7 天前且还没被压缩过的 .log 文件,逐个 gzip
find "$LOG_DIR" -name "*.log" -type f -mtime +"$DAYS" ! -name "*.gz" -exec gzip {} \;
echo "[$(date '+%F %T')] 压缩完成,共处理了 $(find "$LOG_DIR" -name '*.log.gz' -mtime +"$DAYS" | wc -l) 个文件"
理解它:
! -name "*.gz":排除已经压过的文件,避免重复压缩。-exec gzip {} \;:对每个文件执行gzip压缩,{}.gz会生成同名的.gz压缩包。$(... | wc -l):用wc -l统计压缩出来多少个文件,并打印出来,让脚本有反馈。
第 5 篇小结
批量处理靠的是 for 循环 + 变量 + find 批量执行这三件套。遇到”要对一批对象做同样操作”的需求,先想循环是不是就能解决。注意转义、注意超时、注意排除已处理过的,这三条注意能少踩绝大多数坑。