“var = $ {var:-word}”和“var = $ {var:= word}”有什么区别?

我读了这个bash手册页,但我不明白其中的差别。 我testing了他们两人,他们似乎产生完全相同的结果。

如果未通过命令行参数设置该值,我想设置一个variables的默认值。

#!/bin/bash var="$1" var=${var:-word} echo "$var" 

如果$1为空,则上面的代码将回显word如果不为空,则回显$1值。 那么这样做:

 #!/bin/bash var="$1" var=${var:=word} echo "$var" 

根据Bash手册页,

${parameter:-word}使用默认值。 如果参数未设置或为空,则replace单词的扩展名。 否则,参数的值被replace。

${parameter:=word}分配默认值。 如果参数未设置或为空,则将单词的扩展分配给参数。 参数的值将被replace。 位置参数和特殊参数不能以这种方式分配。

它们是相同的吗? ${parameter:=word}只是更多?

当你使用var两次时,你不能看到与你的例子有所不同,但你可以看到它与两个不同的变量:

 foo=${bar:-something} echo $foo # something echo $bar # no assignement to bar, bar is still empty foo=${bar:=something} echo $foo # something echo $bar # something too, as there's an assignement to bar 
 ${var:=word} 

等于

 var=${var:-word} 

区别在于使用分配之间。 如果没有= ,则使用word ,但实际上没有分配var

这对于只读的变量来说是最重要的 – 这是你不能分配给它们的地方。

例如,您永远不能分配到编号的位置参数。 所以,如果你想让你的函数处理一个可选的默认第一个参数,你可以使用如下代码:

 ${1:-default} 

你不能在那里使用${1:=default}版本,因为你不能指定位置参数1 。 它是只读的。

您有时会看到使用:命令的分配扩展:

 # set defaults : ${foo:=bar} ${baz:=qux}