set -u(或set -o nounset)使脚本在引用未定义变量时立即报错退出,防止拼写错误或遗漏初始化导致的静默异常;推荐配合${VAR:-default}等安全展开方式替代临时禁用。

set -u(等价于 set -o nounset)会让 Bash 在遇到未声明或未赋值的变量时立即报错并退出脚本,是防止因拼写错误、遗漏初始化导致逻辑异常的实用调试手段。
启用 set -u 的基本方式
在脚本开头或需要检查的代码段前添加:
- set -u —— 启用严格模式,后续所有未定义变量引用都会触发错误
- set +u —— 临时关闭该检查(慎用,建议仅用于明确需容忍未定义变量的局部场景)
- 也可写成 set -o nounset,语义更清晰
常见触发错误的情况
以下写法在 set -u 启用后会直接报错并终止执行:
- echo $UNDEFINED_VAR —— 变量从未声明
- if [[ $MISSPELLED == "yes" ]]; then ... —— 拼错变量名(如本意是 MISPELLED)
- cmd --flag=$EMPTY_VAR —— 即使变量已声明但为空(EMPTY_VAR=""),仍算“已定义”,不会报错;只有完全未声明才触发
安全访问变量的推荐写法
当变量可能不存在、但你希望提供默认值或跳过处理时,避免绕过 set -u,改用 Bash 内置的参数扩展语法:
- ${VAR:-default} —— 若 VAR 未定义或为空,取 default
- ${VAR-default} —— 仅在 VAR 未定义时取 default(空字符串仍视为已定义)
- ${VAR:?error message} —— 若 VAR 未定义或为空,打印错误并退出(比 set -u 更精准控制)
- 判断是否存在:[[ -v VAR ]](Bash 4.2+),返回真表示变量已声明(无论是否为空)
实际调试建议
不要在生产脚本中突然全局启用 set -u,容易导致意外中断。推荐做法:
- 开发阶段在脚本顶部加 set -u,配合 set -e 和 set -o pipefail 构成基础防护组合
- 运行前先用 bash -n script.sh 检查语法,但注意 -n 不检测未定义变量,必须实际运行才能触发 set -u
- 对已有脚本逐步改造:先加 set -u,运行并根据报错定位问题,再用 ${VAR:-} 或 [[ -v VAR ]] 显式处理边界情况


















