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