You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中${var:-value}与${var:=value}的区别是什么?

搞懂 Shell 中 ${var:-value} 和 ${var:=value} 的核心区别

嘿,这个问题我刚入门Shell的时候也踩过坑!其实两者的运行效果看起来相似,但核心差异在于是否会修改原变量,咱们用例子说清楚就好懂了:

1. ${var:-value}:临时替代,不修改原变量

这个语法的作用是:如果变量 var 未定义或者值为空字符串,就返回后面的 value;如果 var 已经有非空值,就直接返回 var 的值。

重点是:它不会改变var本身的值,只是在当前表达式里临时用value替代输出。

举个实际的例子:

# 定义一个空变量
var=""
echo ${var:-default}  # 输出:default
echo $var              # 输出空字符串,因为var根本没被修改

# 给var赋值非空值
var="my_value"
echo ${var:-default}  # 输出:my_value,直接用原变量的值
echo $var              # 输出:my_value,原变量保持不变

2. ${var:=value}:赋值默认值,修改原变量

这个语法的判断逻辑和前者完全一样:var未定义或为空时返回value,有非空值时返回var本身。

但关键区别是:当触发默认值逻辑时,它会把value直接赋值给var,之后再使用var就会是这个默认值了。

同样用例子验证:

# 定义空变量
var=""
echo ${var:=default}  # 输出:default
echo $var              # 输出:default,因为var已经被赋值了

# 给var赋值非空值
var="my_value"
echo ${var:=default}  # 输出:my_value,用原变量的值
echo $var              # 输出:my_value,原变量不变

什么时候用哪个?

  • 用 ${var:-value}:当你只是需要临时用默认值,不想改动原变量的时候,比如在打印日志或者执行命令时临时替换:

    echo "当前用户:${USER:-匿名用户}"
    

    这里即使USER变量为空,也能正常输出,但USER本身不会被修改。

  • 用 ${var:=value}:当你希望给变量设置一个全局的默认值,之后整个脚本都能复用这个值的时候,比如脚本开头初始化路径:

    # 如果WORK_DIR没设置,就默认用./tmp,且之后WORK_DIR就固定为这个值
    WORK_DIR=${WORK_DIR:=./tmp}
    

内容的提问来源于stack exchange,提问作者Eugen Konkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:14:19