01给输入一个明确的边界
决定参数是文件、目录还是服务名称,并在执行前检查必要条件。路径变量应正确引用,避免空格和通配符改变命令含义。不要把用户输入拼接成一段新的 Shell 代码。
对涉及删除或覆盖的脚本,先解析并展示目标的绝对路径。空变量、根目录和意外的符号链接都可能扩大操作范围,应在真正执行前拒绝这些输入。
02错误应该在发生的位置显现
检查关键命令的退出状态,并输出具体的失败原因。不要在所有命令后统一忽略错误,否则“任务完成”的提示可能掩盖中间步骤失败。
set -e 与管道相关选项有特定语义,不应把它们当作完整的错误处理机制。对关键步骤显式判断结果,更容易表达重试、清理和退出逻辑。
03临时文件也需要生命周期
使用专门的临时目录,并在退出时清理自己创建的资源。清理动作应限定在已验证的目录内,不要依赖可能为空的变量进行递归删除。
如果脚本会被同时运行,固定文件名可能产生竞争。唯一临时目录可以隔离运行过程;涉及共享状态时,还需要考虑锁或其他并发控制。
04输出是留给未来的说明书
日志写清楚执行阶段和结果,避免打印密码、令牌或完整连接串。必要时提供只读检查模式,让使用者先看到将要发生什么。
在脚本头部写下用途、参数与一个常见例子。几行准确说明,比一大段重复解释每条命令的注释更有价值。最后用带空格的路径和缺失参数测试一次,常见问题往往就在这里。