脚本里 DIR 从配置文件读取,配置项名写错导致变量是空串,rm -rf $DIR/* 实际执行成 rm -rf /*,两分钟内删掉了 3 台机器的根目录文件。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,变量没做非空校验,展开后命令变成删除根下所有内容。rm 的 -f 又跳过了确认,执行时没有任何提示。
碰到「rm 空变量」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。改完顺手把文档补一句,省得下次自己重新推一遍。
DIR="/data/cache"
: "${DIR:?DIR is empty}"
case "$DIR" in /data/*) rm -rf -- "$DIR"/* ;; *) exit 1 ;; esac
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,删除前判断变量非空且是预期前缀;用 ${DIR:?} 让空值直接报错退出;路径用绝对路径并限制在白名单目录内;在测试机上把变量置空跑一次 确认脚本拒绝执行。
最后用这个标准收尾,变量为空时脚本立刻退出并打印 DIR is empty,目录内容没有被删除。
