最可靠方法是用[ -z "$var" ]判断为空、[ -n "$var" ]判断非空,必须双引号包裹变量,避免空值导致语法错误;其他写法或兼容性差、或效率低、或不直观,应避免。

判断Shell变量是否为空字符串,最可靠、最常用的方法是用 -z 和 -n 测试操作符,配合双引号包裹变量。
用 [ -z "$var" ] 判断是否为空
这是标准写法,推荐首选:
-
-z表示“字符串长度为 0”,成立时返回真(即变量为空或未定义) -
必须加双引号,否则变量为空时会变成
[ -z ],报错[: -z: unary operator expected - 示例:正确写法:
if [ -z "$name" ]; then echo "name 为空"; fi - 错误写法:
if [ -z $name ]—— 变量为空时语法崩溃
用 [ -n "$var" ] 判断是否非空
逻辑与 -z 相反,用于确认变量有内容:
-
-n表示“字符串长度大于 0”,成立即变量已赋值且不为空 - 同样必须双引号包裹,否则空值导致语法错误
- 等价于
[ ! -z "$var" ],但-n更直观 - 适合做前置校验,比如:
if [ -n "$input" ]; then process "$input"; fi
其他可行但不推荐的写法
这些方法虽能工作,但存在隐患或可读性差,日常应避免:
-
[ "$var" = "" ]:语义清晰,但依赖=操作符,在某些老 shell 中可能不兼容 -
[ x"$var" = x ]:用前缀防空,已过时;现代 shell 完全不需要这种绕弯 -
if [ "$var" ]:看似简洁,实则隐式调用-n,易误解且不显式——建议明确写成-n - 用
expr length或wc -c:效率低、易出错(如wc -c多算换行符),纯属画蛇添足
实际使用小技巧
结合常见场景提升脚本健壮性:
- 设置默认值:
: ${port:=8080}或[[ -z "$port" ]] && port=8080 - 参数检查函数:
check_arg() { [ -z "$1" ] && echo "缺少参数" >&2; return 1; } - 一行简写判断:
[ -z "$HOME" ] && echo "HOME 未设置" || echo "HOME=$HOME" - 注意未声明变量:
unset var; [ -z "$var" ]返回真,和var=""效果一致











