我读了这个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}