使用 [ -z "$var" ] 可安全判断变量未定义或为空,配合 && { echo "error"; exit 1; } 实现非空断言;必须加双引号,推荐放在脚本开头,避免无引号、= "" 等错误写法。

直接用 [ -z "$VAR" ] 判断变量为空(含未定义),然后配合 exit 即可实现“非空断言”——即变量未赋值或为空时立即退出脚本。
判断变量是否为空或未定义
Shell 中未定义变量和空变量都视为“空字符串”,[ -z "$VAR" ] 是最安全、最常用的方式:
-
-z表示“字符串长度为 0”,对未定义变量也返回真(因为$VAR展开后就是空) - 必须加双引号:
"$VAR",否则变量含空格或特殊字符时会语法错误 - 不要写成
[ -z $VAR ](无引号)或[ "$VAR" = "" ](冗余且易错)
立即退出的写法(推荐)
一行搞定,简洁明确:
[ -z "$MY_VAR" ] && { echo "ERROR: MY_VAR is not set or empty"; exit 1; }
也可以拆成 if 形式,更易读:
if [ -z "$MY_VAR" ]; then echo "ERROR: MY_VAR must be set" >&2 exit 1 fi
-
>&2把错误信息输出到 stderr,符合 Unix 习惯 - 退出码建议用
1(非 0),表示异常终止 - 该检查应放在脚本靠前位置,在变量被使用之前执行
避免常见陷阱
以下写法容易出错,需规避:
-
if [ $MY_VAR ]; then ...—— 未加引号,变量为空时变成[ ],语法错误 -
if [ "$MY_VAR" = "" ]; then ...—— 功能等价但不如-z简洁直观 -
if [ ${MY_VAR:-} ]; then ...—— 默认展开为空,无法区分未定义和空值,不满足“断言非空”需求 -
if [ x"$MY_VAR" != x ]; then ...—— 过时写法,已无必要
进阶:批量校验多个必需变量
可封装为函数复用:
require_var() {
for var in "$@"; do
if [ -z "${!var}" ]; then
echo "ERROR: required variable '$var' is unset or empty" >&2
exit 1
fi
done
}
# 使用:
require_var "HOST" "PORT" "CONFIG_FILE"
-
${!var}是间接引用,能根据变量名字符串取值 - 一次检查多个变量,避免重复写 if
- 报错信息明确指出哪个变量缺失,便于调试











