参数扩展默认 ":=" vs "=" vs ":-" vs "-"

parameter expansion default ":=" vs "=" vs ":-" vs "-"

我在 Bourne 派生的 shell 中看到了在参数扩展中使用默认值的几种不同方法::==:--。我想知道他们有什么不同。手册说 -= 处理空值的方式与 :-:= 不同。但据我所知,:= == :-= == -。这是真的吗?

:= 对比 :- 的演示:

 $ unset foo
 $ echo ${foo:-bar}
 bar
 $ echo foo
 
 $ echo ${foo:=bye}
 bye
 $ echo $foo
 bye

:-只影响展开的结果,参数不变。 := 实际上将默认值 分配给 如果参数为 null 或未设置。

= 的工作方式类似于 - 关于未设置的参数;如果未设置,它只会更改 foo 的值,如果它具有空值则不会。

文档是明确的。

=形式,重点补充:

If parameter is unset or null, the expansion of word is assigned to parameter. The value of parameter is then substituted. [...]

与其他形式:

If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

没有 赋值,修改参数的值,当稍后扩展为变量时,不使用 = 形式。

虽然问题已经回答了,但我只想post一个link到shell bible,那里不仅对参数展开有很好的解释,但几乎所有 shell 相关的东西。