启用 set -u 可让脚本遇未定义变量立即报错退出,应置于 #!/bin/bash 下方首行;对可选变量用 ${VAR:-default} 安全展开,避免禁用检查。

在 Bash 脚本中启用 set -u(等价于 set -o nounset),能让脚本一遇到未定义变量就报错退出,避免因拼写错误、漏赋值或逻辑疏忽导致的静默失败。这是提升脚本健壮性的基础手段。
怎么加?加在哪?
把 set -u 放在脚本最开头、#!/bin/bash 之后立即执行:
- 必须在任何变量引用之前启用,否则无效
- 推荐放在 shebang 行下方第一行,确保全局生效
- 示例:
set -u
echo "Hello $USER"
echo "Version: $VERSION" # 若 VERSION 未定义,此处立即报错退出
常见报错和含义
启用后,只要脚本中出现类似 $MISSPELLED_VAR 或 $UNSET 这类未声明/未赋值的变量,就会中断执行,并输出类似:
- 错误明确指出哪一行、哪个变量未绑定
- 这比脚本一路跑完却结果异常要容易排查得多
哪些变量可以“例外”?怎么安全处理?
不是所有变量都必须提前赋值——比如命令行参数 $1、环境变量 $DEBUG 可能为空或可选。这时不能关 set -u,而应改用安全展开语法:
-
${1:-}:若$1未定义或为空,返回空字符串 -
${DEBUG:-false}:未定义时默认为false -
${PATH:?PATH is not set}:强制要求变量存在,否则报错退出并提示
这些写法既兼容 set -u,又保留了灵活性。
不建议的做法
临时关闭检查(如 set +u)会削弱整体防护效果,容易遗漏问题:
- 一旦开启 set -u,应尽量让整个脚本遵守该规则
- 避免混用
set +u/set -u,增加维护成本 - 真正需要宽松场景的,优先用
${VAR:-default}替代


















