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
相关产品推荐
相关产品推荐

