使用 ${var:?error} 语法可在变量为空或未定义时立即退出脚本,阻断如 rm -rf $DIR/* 的误删风险;需将通配符纳入校验范围,并配合 -- 和双引号确保安全。

直接用 ${var:?error} 语法,就能在变量为空或未定义时立即中断脚本,彻底阻断 rm -rf $DIR/* 类误删风险——它不是事后补救,而是执行前的硬性守门员。
原理:变量未设或为空就报错退出
Shell 的 ${var:?message} 是参数扩展中的“错误检查”形式:
- 若 var 已设置且非空,正常展开为值;
- 若 var 未定义、为空字符串或仅含空白符,shell 立即打印 message 并退出当前脚本(非仅当前命令),退出码为 1。
这比 [[ -z "$var" ]] && exit 1 更简洁、更早生效,且不依赖额外判断语句。
正确写法:嵌入路径拼接全过程
不能只校验变量本身,必须覆盖整个待删路径。常见错误写法:rm -rf ${DIR:?DIR is unset}/* —— 若 DIR="",展开后变成 rm -rf /*,已失效!
✅ 正确做法是把通配符也纳入校验范围:
rm -rf ${DIR:?DIR must be set and non-empty}/*rm -rf ${DIR:?DIR required}/subdir/find ${TARGET:?target path missing} -maxdepth 0 -delete
只要 DIR 为空,脚本在执行 rm 前就终止,根本不会生成危险命令。
搭配 -- 和引号,堵死剩余漏洞
单靠 ${var:?} 不够,还需组合防护:
- 始终加
--:防止路径以-开头被误解析为选项,如rm -rf -- ${DIR:?}/* - 变量全用双引号包裹:避免空格、换行等导致路径断裂,如
"${DIR:?}/*"(注意:引号内不能放${...},否则会抑制扩展) - 删除前先
echo验证:调试阶段加echo "Would delete: ${DIR:?}/*",确认路径无误再执行
真实脚本片段示例
以下是一个安全删除函数,融合全部要点:
#!/bin/bashsafe_cleanup() {
local dir="${1:?Usage: safe_cleanup
[[ -d "$dir" ]] || { echo "Error: '$dir' is not a directory"; return 1; }
echo "Deleting contents of: $dir"
rm -rf -- "$dir"/*
}
# 调用时:
safe_cleanup "/tmp/logs"


















