linux shell中设变量默认值用${var:-default}(只读返回)和${var:=default}(赋值并保存),前者适用于位置参数,后者用于自定义变量,需注意语法完整性和使用场景。

Linux Shell 中给变量设置默认值,主要是为避免变量未定义或为空时导致脚本出错或行为异常。核心方法是用 ${var:-default} 和 ${var:=default} 两种语法,它们适用场景不同,选错会影响逻辑。
用 ${var:-default} 提供临时默认值
这个语法只在引用时返回默认值,不改变原变量本身,适合读取位置参数或环境变量等只读场景。
- 当
var未定义、为空字符串("")或为null时,表达式结果为default - 当
var已有非空值,就直接使用该值,不覆盖也不赋值 - 支持对位置参数使用,比如
filename=${1:-"data.txt"}—— 脚本没传参时自动用data.txt - 常用于脚本开头快速兜底:
log_level=${2:-"info"}
用 ${var:=default} 赋值并设默认值
这个语法不仅返回默认值,还会把默认值真正写入变量,后续再引用该变量就直接是默认值了。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 效果等同于先判断再赋值:
if [ -z "$var" ]; then var="default"; fi - 适用于需要“确保变量有值”的场景,比如初始化配置变量:
cache_dir=${CACHE_DIR:="/tmp/cache"} - 注意:不能用于位置参数(
$1、$2等),因为它们是只读的,强行用:=会报错 - 适合局部变量或自定义变量,例如:
timeout=${timeout:=30}
实际组合用法示例
一个健壮的脚本开头常这样处理参数:
#!/bin/bash
# 位置参数设默认值(只读,用 :-)
input_file=${1:-"input.csv"}
output_dir=${2:-"/tmp/output"}
<h1>自定义变量设默认值并保存(用 :=)</h1><p>max_retry=${max_retry:=3}
debug=${debug:=false}</p><h1>检查必需参数是否存在(非空)</h1><p>if [ -z "$input_file" ]; then
echo "错误:输入文件名不能为空" >&2
exit 1
fi
</p>
常见误区提醒
别混淆单冒号和双冒号,也别漏掉花括号:
- 写成
$var:-"def"或${var}-"def"都无效,必须是完整${var:-default} -
${var-default}(无冒号)只在变量未定义时生效,但变量为空字符串时不会触发,默认值不生效 - 变量名含特殊字符或紧邻其他文本时,花括号不可省:
echo "File: ${name:-unknown}.txt",否则会误读为$name-default - 测试前建议用
unset var清除变量,避免残留值干扰判断










