启用set -u可使shell在访问未定义变量时报错退出;安全引用用${var:-default}等参数扩展;检查变量存在可用[[ -v var ]]或${var+set};调试时结合bash -x和declare -p定位问题。

Linux中Shell变量遇到未绑定(即未定义)时,默认行为是展开为空字符串,不会报错。但这种静默处理容易掩盖逻辑缺陷。要让脚本在访问未定义变量时主动报错并退出,核心方法是启用set -u(或set -o nounset)。
启用严格模式:set -u
在脚本开头添加set -u,Shell就会把任何对未声明变量的引用视为错误,立即终止执行并提示“unbound variable”。
- 必须放在
#!/bin/bash之后、首次引用变量之前 - 示例:
#!/bin/bash
set -u
echo "User: $USERNAME" → 若USERNAME未定义,直接报错退出 - 该选项不影响已用
declare或local显式声明但未赋值的变量——它们仍算“已绑定”
安全引用未定义变量的写法
即使启用了set -u,你仍可能需要容忍某些变量缺失。此时应使用参数扩展语法显式处理缺省情况:
-
${VAR:-default}:VAR未定义或为空时取default -
${VAR-default}:仅当VAR未定义时取default(空值仍被接受) -
${VAR:=default}:未定义或为空时赋值并取default(会修改变量) - 例如:
echo "Home: ${HOME:-/tmp}",避免因$HOME缺失导致脚本中断
检查变量是否存在再使用
对关键变量,可在引用前用条件判断确认其已定义:
-
if [[ -v VAR ]]; then echo "$VAR"; else echo "VAR missing"; fi(Bash 4.2+支持-v) - 兼容旧版本可写:
if [ -n "${VAR+set}" ]; then ... fi,利用${VAR+set}在VAR已定义时展开为"set",未定义时为空 - 注意:
[ -n "$VAR" ]只能判断是否非空,不能区分“未定义”和“定义为空”
调试与定位未定义变量
当报错发生时,错误信息通常只显示行号。快速定位技巧:
- 运行脚本时加
-x跟踪:bash -x -u script.sh,看到每一步展开过程 - 临时注释
set -u,改用set -o pipefail; set -x,观察哪些变量输出为空 - 用
declare -p | grep "^[a-z]"列出所有已定义的普通变量,对照脚本检查遗漏











