"var = $ {var:-word}"和"var = $ {var:= word}"之间有什么区别?

hax*_*ode 14 linux bash

我在这上面阅读了bash手册页,但我不明白其中的区别.我测试了它们两个,它们似乎产生完全相同的结果.

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

#!/bin/bash

var="$1"
var=${var:-word}
echo "$var"
Run Code Online (Sandbox Code Playgroud)

上面的代码回显,word如果$1为null,$1则回显if not null的值.这样做:

#!/bin/bash

var="$1"
var=${var:=word}
echo "$var"
Run Code Online (Sandbox Code Playgroud)

根据Bash手册页,

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

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

他们是一样的,${parameter:=word}只是做得更多吗?

Gui*_*ume 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
Run Code Online (Sandbox Code Playgroud)


Tel*_*hus 7

不同之处在于使用分配.如果没有=,word使用该值,但不实际分配var.

对于只读变量,这是最重要的 - 这是您无法分配给它们的地方.

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

${1:-default}
Run Code Online (Sandbox Code Playgroud)

您无法在${1:=default}那里使用该版本,因为您无法分配位置参数1.它是只读的.


gle*_*man 6

有时您会看到使用以下命令进行赋值扩展:

# set defaults
: ${foo:=bar} ${baz:=qux}
Run Code Online (Sandbox Code Playgroud)