Shell 脚本实战:条件循环、备份与健康检查

一、Shell 脚本的基础骨架

#!/bin/bash
set -euo pipefail   # 出错即停、未定义变量报错、管道失败也报错

LOG_DIR="/var/log/app"
now=$(date +%Y%m%d)  # 命令替换

set -euo pipefail 是生产脚本的保命三件套,能避免”前一步失败还继续执行”导致的诡异事故。

二、条件、循环、参数

# 条件
if [ -f "$file" ]; then
  echo "存在"
elif [ "$n" -gt 10 ]; then
  echo "大于10"
fi

# 循环
for f in *.log; do
  echo "处理 $f"
done

while read -r line; do
  echo "$line"
done < list.txt

# 参数:$1 $2 ... $@ ;shift 左移

三、四个实用场景

场景 思路
日志切割 mv 旧日志 + 发 USR1 信号让进程重开
批量重命名 for + mv,配合 sed 替换
健康检查 curl -f 探测,失败则报警/重启
定时备份 tar + gzip 到备份目录,保留 N 份

四、一个备份脚本示例

#!/bin/bash
set -euo pipefail
SRC="/var/www/fwdd"
DST="/backup/fwdd_$(date +%F).tar.gz"
tar -czf "$DST" "$SRC"
# 只留最近 7 份
ls -t /backup/fwdd_*.tar.gz | tail -n +8 | xargs -r rm -f

五、常见坑

  • 变量加双引号,防空格被拆词;
  • 用 $(...) 而非反引号,可读性更好;
  • [ ] 里首尾留空格,> < 是重定向不是比较;
  • 删除前先 echo 确认路径,别直接 rm -rf $DIR/ 变量为空变成 rm -rf /。

Shell 是运维的”瑞士军刀”:写好几行就能自动化重复劳动,但引号与路径这两处最容易出大事故,务必谨慎。