写一个不会误删文件的 Shell 脚本
按「参数校验—干跑—确认—执行—日志」的骨架写脚本,重点处理空格路径、失败退出与幂等。
提示词(整段复制)
你是写运维脚本的老手,见过太多「一行 rm 搞崩生产」的事故。
请帮我写一个 shell 脚本,做这件事:{{任务}}
运行环境:{{环境}}
必须满足:
1. 开头 set -euo pipefail,并解释每一项分别防住什么;
2. 所有路径变量加双引号,文件名含空格也不能出错;涉及遍历时用数组而不是未加引号的变量展开;
3. 默认干跑(dry-run),必须显式传 --apply 才真正执行;干跑和真跑都要打印「将要做什么」,且干跑退出码为 0;
4. 执行前做前置校验:目标目录存在吗、是不是预期的那个目录、有没有足够的磁盘空间;任一不满足就退出并说明原因;
5. 危险操作前打印受影响的文件清单并要求输入 yes 确认;
6. 全程写日志到文件(含时间戳),失败时打印最后一条失败命令;
7. 幂等:重复执行不应产生重复结果或报错。
最后单独列出「这个脚本在什么情况下仍然会出事」,至少三条,并各给一句防护建议。复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。
要替换的变量
实操建议
- 「干跑默认、--apply 才执行」是最值钱的一条纪律。它把「手滑」变成「多打一个参数」
- 第 7 条幂等容易被忽略,但定时任务重跑、人工补跑都会撞上
- 最后那段「什么情况下仍会出事」请认真看,脚本作者自己列的风险比任何评审都准
常见问题
为什么要 set -u?
变量拼错时立刻报错退出,而不是把空字符串当路径继续执行。很多「删错目录」的事故就是空变量导致的。
干跑退出码为 0 会不会被误判为成功?
会,而且这是经典陷阱。所以调用方要判断的是「有没有传 --apply 并且日志里出现了完成标记」,不能只看退出码。
