最稳妥方法是用if [ -z "$var" ]判断变量是否为空或未定义,双引号必不可少;需区分存在性时用${var+x};避免不加引号的[ $var ]等危险写法。

在 Linux Shell 中,检查变量是否为空或未初始化,核心是区分“空字符串”和“未定义”两种状态。最稳妥、最常用的方法是用 if [ -z "$var" ],它对两者都返回真——也就是说,只要变量没被赋值(unset)或赋了空值(""),这个判断就成立。
用 -z 判断:空或未定义都算“空”
这是最直接、最推荐的写法。双引号包裹变量必不可少,否则变量未定义时 shell 会报语法错误(如 [ -z ] 不合法)。
-
unset var→[ -z "$var" ]返回 true -
var=""→[ -z "$var" ]返回 true -
var=" "(含空格)→[ -z "$var" ]返回 false(注意:空格不是空)
用 ${var+x} 判断:只关心“是否存在”,不关心值
如果业务逻辑需要严格区分“变量存在但为空”和“变量根本不存在”,就得用参数扩展:${var+x}。它的意思是:如果 var 已定义(不管值是什么),就展开为 x;否则展开为空字符串。
-
unset var; [ -n "${var+x}" ]→ false(变量不存在) -
var=""; [ -n "${var+x}" ]→ true(变量存在,哪怕值为空) -
var="ok"; [ -n "${var+x}" ]→ true
避免踩坑的写法
以下写法都不安全,容易出错:
-
if [ $var ]:变量未定义时变成[ ],语法错误 -
if [ -z $var ]:同上,未加引号,空值或未定义都会崩 -
if [ "$var" = "" ]:能用,但不如-z简洁直观 -
if [ x"$var" = "x" ]:老式兼容写法,已过时,没必要用
实际脚本中怎么用
常见场景是给变量设默认值或提前拦截错误:
- 设默认值:
target_dir=${target_dir:-/tmp} - 报错退出:
[ -z "$input_file" ] && { echo "error: input_file not set"; exit 1; } - 函数参数校验:
if [ -z "$1" ]; then echo "missing arg"; return 1; fi











