“:$ {foo = value}”中冒号运算符的解释


76

我了解bash中冒号运算符的行为类似于null,我知道它用于参数扩展以及其他方式,但是有人可以解释一下:

: ${SOMETHING='value'}

通过实验,我知道这会将环境变量设置为$SOMETHING'value'但是为什么呢?

“只是因为它确实是”是一个有效的答案,但是请向我指出它的文档(我似乎找不到),或者使用一个恰当的名称对此很有用。我希望有一个更启发性的解释。


2
请注意,:内置文件存在于bourne shell和ksh以及bash中。
ghoti 2012年

Answers:


93

如果尚未将表达式${SOMETHING='value'}设置为SOMETHING,value则将其设置为。这在许多情况下都是有用的运算符。但是,它也返回分配的值,因此,如果您简单地执行

${SOMETHING='value'}

那么您的shell将尝试调用该命令value。这可能会或可能不会做不需要的事情;至少它将抛出一条消息“值:找不到命令”。

为了避免这种情况,您可以使用no-op :,它先评估其参数然后将其丢弃,而不是执行它。这在此处记录


13
:内建命令是记录在这里。这也是POSIX标准
亚当·罗森菲尔德

3
这里也解释。
x-yuri 2015年

1
:$ {SOMETHING =“ $ HMMM”}和:$ {SOMETHING:=“ $ HMMM”}之间有什么区别?注意最后一个示例中的第二个冒号
Yury Kozlov

1
@YuryKozlov=如果参数为unset,则第一个变体()将使用默认值;:=如果参数为null unset
Dave L

7

在这里解释:http : //tldp.org/LDP/abs/html/parameter-substitution.html

如果未设置参数,请将其设置为默认值。

两种形式几乎相等。仅当$ parameter已声明且为null时,:才有所不同,如上[1]。

echo ${var=abc}   # abc
echo ${var=xyz}   # abc
# $var had already been set to abc, so it did not change.

3
我建议wiki.bash-hackers.org/syntax/pemywiki.wooledge.org/BashFAQ/073(及其链接)比ABS(长期维护不足并且倾向于在ABS上展示不良做法)作为更好的参考。其示例)。
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.