基础Shell运维脚本模版需包含:#!/bin/bash、参数校验[[$# -lt 1]]、set -e、exec >>/var/log/yourscript.log 2>&1、getopts解析参数、rsync用--delete-after/--exclude/-avz、cron中显式PATH和绝对路径。
直接用就行,但别跳过权限和路径校验——90%的脚本失败都卡在这两步。
如何写一个带参数检查和日志记录的基础Shell模版
运维脚本最怕执行一半出错却没提示,也怕误操作影响生产环境。所以模版必须包含:$# 参数计数、set -e 异常退出、date 时间戳日志。
- 开头加
#!/bin/bash,别用sh——很多系统里sh不支持[[和数组 - 用
[[ $# -lt 1 ]]判断参数,比[ $1 = "" ]更安全(空格、特殊字符不崩) - 日志建议写到
/var/log/yourscript.log,而不是当前目录——脚本可能被任意路径调用 - 加一句
exec >> /var/log/yourscript.log 2>&1,后续所有echo和命令错误都会自动落盘
为什么用 getopts 而不是手动解析 $1 $2
当脚本要支持 -f /path -v --debug 这类混合参数时,手撕 case "$1" 容易漏掉短选项连写(如 -fv)、忽略冒号后必填参数报错逻辑,getopts 原生处理这些。
-
getopts "f:v" opt中的v后没冒号 → 表示开关型参数;f:后有冒号 → 表示必须跟值,否则触发?分支 - 记得在循环外加
OPTIND=1,否则函数内多次调用getopts会读错位置 -
getopts不支持长选项(--verbose),真需要就换getopt(注意是带p的外部命令,非内置)
rsync 自动化同步脚本里最容易被忽略的三个开关
运维最常用同步场景,但默认行为常导致“看似成功,实则漏文件”或“删错目录”。
猫目
AI工具导航与智能应用推荐
-
--delete-after比--delete安全:先传完再删,断点续传时不误删目标端已有文件 - 必须加
--exclude='.git' --exclude='*.tmp',否则临时文件或开发残留进生产目录 -
-avz里v(verbose)不能省——没它你根本不知道哪些文件被跳过(比如权限不足、硬链接跨文件系统) - 额外提醒:
rsync源路径末尾加不加/语义完全不同:/data/同步内容,/data同步目录本身
定时任务跑脚本前必须验证的三件事
cron 环境和交互式 Shell 差异极大,PATH、HOME、甚至 ~ 展开都可能失效。
- 在脚本开头显式写死关键路径:
PATH="/usr/local/bin:/usr/bin:/bin",别依赖~/.bashrc - 所有路径用绝对路径:
/opt/app/deploy.sh,别写./deploy.sh或~/deploy.sh - 测试 cron 环境:临时加一行
* * * * * env > /tmp/cron_env.txt,对比你手动执行env的输出
真正难的不是写完脚本,而是让同一个脚本在不同机器、不同用户、不同调度方式下行为一致——多打两行路径和环境变量,省去半夜爬起来查日志的力气。