最有效、最常用的两种处理未定义变量的方式是使用 ${var:-default} 提供默认值或启用 set -u 主动拦截;前者通过参数扩展安全取值,后者强制报错避免静默错误,同时需规范赋值与引用(如加引号、禁空格)并稳妥判断空值。

直接用 ${var:-default} 提供默认值,或加 set -u 主动拦截未定义变量,是最有效、最常用的两种处理方式。
用 ${var:-default} 安全取值
未定义变量在展开时为空,容易导致命令出错(比如 rm -rf $DIR/* 中 $DIR 为空会删当前目录)。用参数扩展语法可规避:
-
${var:-}:变量未定义或为空时,返回空字符串 -
${var:-"guest"}:未定义或为空时,返回"guest" -
${var:?err_msg}:未定义或为空时,打印错误信息并退出脚本,适合关键参数校验
启用 set -u 强制报错
在脚本开头加上 set -u,一旦引用未定义变量,Shell 立即报错并退出,避免静默错误扩散:
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 报错示例:
./script.sh: line 5: USERNAME: unbound variable - 配合
set -e可让脚本在任何错误(包括未定义变量)时终止 - 临时关闭可用
set +u,但不建议在关键逻辑中绕过
判断变量是否为空要加引号和 -z
单纯写 [ -z $var ] 在 $var 未定义时可能报错。稳妥写法是:
-
[ -z "${var:-}" ]:先提供默认空值,再判断长度是否为 0 -
[[ -z $var ]]:用[[ ]]更安全,支持未引号变量(但仍推荐加双引号) - 永远避免
[ $var = "" ]或[ ! $var ],它们在变量为空或含空格时语法易崩
变量赋值和引用必须规范
很多“未定义”其实是赋值失败造成的:
- 赋值不能有空格:
name=John✅,name = John❌(变成执行命令name) - 引用变量务必加双引号:
"$PATH",否则空格、通配符、空值都会引发拆分或报错 - 命名统一用小写+下划线,避免
USER_NAME和username混用导致拼写遗漏










