13

Bash 参数替换中的 :- 和 := 有什么区别?

他们似乎都设置了默认值?

4

3 回答 3

15

引用Bash 参考手册

${parameter:-word}

如果parameter未设置或为空, word则替换 的扩展。否则,parameter替换 的值。

${parameter:=word}

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

不同之处在于,:=它不仅替换了word,还将其分配给了parameter

var=
echo "$var"               # prints nothing
echo "${var:-foo}"        # prints "foo"
echo "$var"               # $var is still empty, prints nothing
echo "${var:=foo}"        # prints "foo", assigns "foo" to $var
echo "$var"               # prints "foo"

有关更多信息,请参阅这个很棒的wiki.bash-hackers.org 教程

于 2018-01-12T02:38:10.147 回答
2

来自https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

${parameter:-word}
If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

${parameter:=word}
If parameter is unset or null, the expansion of word is assigned to parameter. The value of parameter is then substituted. Positional parameters and special parameters may not be assigned to in this way.

In :- 不修改参数值,只是“打印”单词的扩展。在 := 中,参数获取作为单词扩展的新值,并且它“打印”单词的扩展。
有时在脚本中,如果未设置变量,您希望为其分配默认值。许多使用VAR=${VAR:-1},如果未设置 VAR,它将为 VAR 分配“1”。这也可以写成: ${VAR:=1},如果没有设置和运行 VAR ,它将分配 '1' 给 VAR: $VAR: 1,但:它是 bash 中的一个特殊内置函数,将丢弃所有参数并且什么都不做。

于 2018-01-12T02:49:32.413 回答
1
$ var=
$ echo $(( ${var:-1} + 3 ))  # local substitution if value is null
4
$ echo $(( ${var} + 3 ))
3

# set it to null 
$ var= 
$ echo $(( ${var:=1} + 3 )) # global substitution if value is null
4
$ echo $(( ${var} + 3 ))
4 

https://www.tldp.org/LDP/abs/html/parameter-substitution.html

于 2018-01-12T02:40:42.183 回答