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

22

我读了有关此事的bash man页面,但我不理解它们之间的区别。我测试了它们两个,它们似乎产生完全相同的结果。

如果未通过命令行参数设置值,我想要为变量设置默认值。

#!/bin/bash

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

如果$1为空,则上面的代码回显word,否则回显$1的值。下面这行代码也是一样的:

#!/bin/bash

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

根据Bash man页面的描述,

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

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

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

4个回答

24

由于您使用了两次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

20
${var:=word}

等于

var=${var:-word}

1
很棒的解释,我也喜欢它简短明了。我选择了Guilaume的答案,因为他提供了额外的解释并且是第一个回答的。谢谢! - hax0r_n_code
1
手册说明${parameter:=word}的语法不能用于位置参数和特殊参数。 - Fr0zenFyr

8
区别在于使用和分配。没有等号,值“word”被使用,但实际上未被分配给“var”。这在只读变量的情况下最为重要,即您不能对它们进行赋值的情况下。
例如,您永远无法将编号位置参数分配给变量。因此,如果您希望函数处理具有默认值的可选第一个参数,则可以使用以下代码:
${1:-default}

您不能在那里使用 ${1:=default} 版本,因为您无法将其赋值给位置参数 1。它是只读的。


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接