写一个不会误删文件的 Shell 脚本

按「参数校验—干跑—确认—执行—日志」的骨架写脚本,重点处理空格路径、失败退出与幂等。

什么时候用:要写运维脚本、批处理脚本,怕一不小心把线上文件删了的时候用。

提示词(整段复制)

你是写运维脚本的老手,见过太多「一行 rm 搞崩生产」的事故。

请帮我写一个 shell 脚本,做这件事:{{任务}}
运行环境:{{环境}}

必须满足:
1. 开头 set -euo pipefail,并解释每一项分别防住什么;
2. 所有路径变量加双引号,文件名含空格也不能出错;涉及遍历时用数组而不是未加引号的变量展开;
3. 默认干跑(dry-run),必须显式传 --apply 才真正执行;干跑和真跑都要打印「将要做什么」,且干跑退出码为 0;
4. 执行前做前置校验:目标目录存在吗、是不是预期的那个目录、有没有足够的磁盘空间;任一不满足就退出并说明原因;
5. 危险操作前打印受影响的文件清单并要求输入 yes 确认;
6. 全程写日志到文件(含时间戳),失败时打印最后一条失败命令;
7. 幂等:重复执行不应产生重复结果或报错。

最后单独列出「这个脚本在什么情况下仍然会出事」,至少三条,并各给一句防护建议。

复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。

要替换的变量

变量示例值
{{任务}}(脚本要做什么,具体到输入输出)
{{环境}}(操作系统、shell 版本、是否 root 运行)

实操建议

常见问题

为什么要 set -u?

变量拼错时立刻报错退出,而不是把空字符串当路径继续执行。很多「删错目录」的事故就是空变量导致的。

干跑退出码为 0 会不会被误判为成功?

会,而且这是经典陷阱。所以调用方要判断的是「有没有传 --apply 并且日志里出现了完成标记」,不能只看退出码。

配套工具