Shell变量默认值替换机制核心是${var:-default}语法,-仅在变量未声明时生效,:-在未声明或为空时生效;:=可赋值并更新变量;:?用于必需参数校验;默认值支持命令替换。

Shell变量默认值替换机制是处理缺失或空参数最直接、最常用的方式,核心在于用 ${var:-default} 这类语法在运行时动态补全值,避免脚本因参数未传而报错或行为异常。
区分两种关键语法:- 和 :-
它们都用于提供备选值,但触发条件不同:
-
${var-default}:仅当
var未声明(unset)时才生效;如果已声明但为空(var=""),仍返回空字符串 -
${var:-default}:只要
var未声明 或 值为空字符串,就采用 default
实际写脚本时,绝大多数情况应优先用 :-,因为它覆盖更全面。例如:
filename=${1:-"input.txt"} # 第一个参数没传,或传了空串,都用 input.txt给变量赋默认值并同时更新它
用 := 语法,既取默认值,又把默认值写回变量,后续可直接引用:
-
count=${2:=10}—— 如果第二个参数缺失或为空,count被设为 10,且变量count本身也被赋值 - 适合需要多次使用该变量、且希望它“真正存在”的场景
配合必需参数校验,提前退出
对关键参数,不能只给默认值,而要强制用户提供:
-
disk_count=${1:?"Error: number of disks required."}—— 若$1缺失或为空,打印错误信息并退出脚本 - 常用于脚本开头,确保必要输入到位,避免后续逻辑出错
嵌套命令替换做动态默认值
默认值不一定是静态字符串,可以是命令执行结果:
-
user=${USER:-$(whoami)}—— 先查环境变量USER,没定义就执行whoami -
logdir=${LOG_DIR:-"/var/log/myapp"}—— 环境变量优先,否则回落到固定路径 - 注意反引号或
$(...)会在展开时立即执行,适合轻量、确定性命令

















