20

我阅读了关于此的 bash 手册页,但我不明白其中的区别。我对它们都进行了测试,它们似乎产生了完全相同的结果。

如果值不是通过命令行参数设置的,我想设置变量的默认值。

#!/bin/bash

var="$1"
var=${var:-word}
echo "$var"

上面的代码回显wordif $1is null 并回显$1if not null 的值。这样做也是如此:

#!/bin/bash

var="$1"
var=${var:=word}
echo "$var"

根据 Bash 手册页,

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

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

是不是他们是一样的,而${parameter:=word}正义的人做得更多?

4

4 回答 4

20

当您使用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
于 2013-07-01T12:53:18.523 回答
19
${var:=word}

等于

var=${var:-word}
于 2013-07-01T12:48:53.780 回答
7

区别在于useassignment。如果没有,则使用=该值,但并未实际分配给。wordvar

这在只读变量的情况下是最重要的——那是你不能分配给它们的地方。

例如,您永远不能分配给编号的位置参数。因此,如果您希望您的函数使用默认值处理可选的第一个参数,您可以使用如下代码:

${1:-default}

您不能在${1:=default}那里使用该版本,因为您不能分配给 positional parameter 1。它是只读的。

于 2013-07-01T12:50:04.477 回答
5

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

# set defaults
: ${foo:=bar} ${baz:=qux}
于 2013-07-01T15:19:25.013 回答