linux shell 中处理变量为空的默认值依赖参数扩展语法:${var:-default} 安全取默认值,${var:=default} 赋值并取默认值;判断空值须用 [ -z "${var:-}" ] 或 [[ -z "${var}" ]];赋值和引用必须规范,避免空格与未加引号导致错误。

Linux Shell 中处理变量为空时的默认值,核心靠参数扩展语法,不依赖外部命令,安全高效。关键不是“补空”,而是用正确语法区分“未定义”和“已定义但为空”,避免误判或副作用。
用 ${var:-default} 安全取默认值
这是最常用、最推荐的方式。它在变量未定义或值为空字符串时,返回 default;否则返回原值,且不改变变量本身。
-
${PORT:-8080}→ PORT 未设或为""时取 8080;设为"3000"就用 3000 -
${USER:-guest}→ USER 为空或没声明,都 fallback 到 guest - 适合用于命令参数、路径拼接等场景,比如:
cp file.txt "${DEST_DIR:-/tmp}/"
用 ${var:=default} 赋值并取默认值
当需要把默认值真正写入变量时用这个。它和 :- 行为一致,但会把 default 赋给 var(仅当 var 未定义或为空)。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
: ${LOG_LEVEL:=info}→ 冒号是空命令,只触发赋值,不输出也不报错 -
echo "Level: $LOG_LEVEL"→ 此后 $LOG_LEVEL 就是 info(如果原来为空或未设) - 注意:不能用于位置参数
$1、$2等,会报错
判断是否为空要防坑
直接写 [ -z $var ] 很危险——var 未定义时会变成 [ -z ],语法错误;含空格更崩。稳妥写法:
-
[ -z "${var:-}" ]→ 先兜底成空串,再判断长度 -
[[ -z $var ]]→[[ ]]内部更健壮,但仍建议加双引号:[[ -z "${var}" ]] - 绝对别写
[ $var = "" ]或[ ! $var ],空值或带空格时必出错
关键细节不能漏
很多“空值问题”其实源于赋值或引用不规范:
- 赋值等号两边不能有空格:
name=John✅,name = John❌(执行命令 name) - 引用变量务必加双引号:
"$PATH"✅,$PATH❌(遇空格或通配符会拆分) - 环境变量如
$HOME可能为空,不要假设它一定存在,优先用${HOME:-/home/$USER}










