我在这上面阅读了bash手册页,但我不明白其中的区别。我测试了它们,它们似乎产生了完全相同的结果。
如果未通过命令行参数设置值,我想设置变量的默认值。
#!/bin/bash
var="$1"
var=${var:-word}
echo "$var"
如果word
为空,则上面的代码回显$1
,如果不为空,则回显$1
的值。这样做:
#!/bin/bash
var="$1"
var=${var:=word}
echo "$var"
根据Bash手册页,
${parameter:-word}
使用默认值。如果参数未设置或为null,则替换单词的扩展。否则,参数的值将被替换。
${parameter:=word}
分配默认值。如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
它们是否相同而${parameter:=word}
只是做得更多?
答案 0 :(得分:16)
${var:=word}
等于
var=${var:-word}
答案 1 :(得分:15)
当您使用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
答案 2 :(得分:7)
区别在于使用和赋值。如果没有=
,则值word
已使用,但实际上未分配到var
。
对于只读变量而言,这是最重要的 - 这是您无法分配给它们的地方。
例如,您永远不能分配编号的位置参数。因此,如果您希望函数使用默认值处理可选的第一个参数,则可以使用如下代码:
${1:-default}
您不能在那里使用${1:=default}
版本,因为您无法分配位置参数1
。它是只读的。
答案 3 :(得分:3)
您有时会看到:
command:
# set defaults
: ${foo:=bar} ${baz:=qux}