":$ {foo = value}"中冒号运算符的说明

Pet*_*ton 71 bash

我理解bash中的冒号操作符就像null一样,我知道它在参数扩展中使用,以及以其他方式使用,但有人可以解释一下:

: ${SOMETHING='value'}
Run Code Online (Sandbox Code Playgroud)

从实验中我知道这会将环境变量设置$SOMETHING'value'但为什么?

"只是因为它确实"是一个有效的答案,但请指出我的文档(我似乎无法找到)或这个用法的正确名称将是有用的.我希望有一个更有启发性的解释.

Kil*_*oth 77

value如果尚未设置,则表达式将SOMETHING 设置为.在许多情况下,这是一个有用的操作员.但是,它也会返回指定的值,因此如果您只是执行了

${SOMETHING='value'}
Run Code Online (Sandbox Code Playgroud)

然后你的shell会尝试调用该命令value.这可能会或可能不会做不需要的事情; 至少它会抛出一条消息"value:command not found".

为了避免这种情况,您可以使用no-op :来计算其参数,然后抛弃它,而不是执行它.

  • `:`builtin命令记录在这里(http://www.gnu.org/software/bash/manual/bashref.html#Bourne-Shell-Builtins).它也是[POSIX标准](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#colon). (13认同)
  • @YuryKozlov 如果参数“unset”,第一个变体(`=`)将使用默认值;如果参数为“null”*或*“unset”,则后者 (`:=`) 将使用默认值 (4认同)
  • [解释] [此处](http://www.tldp.org/LDP/abs/html/special-chars.html#COLON0REF). (3认同)
  • : ${SOMETHING="$HMMM"} 和 : ${SOMETHING:="$HMMM"} 之间有什么区别吗?请注意最后一个示例中的第二个冒号 (3认同)

Arn*_* F. 6

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

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

两种形式几乎相同.:只有当声明了$参数并且为null时才会有所不同,如上所述[1].

echo ${var=abc}   # abc
echo ${var=xyz}   # abc
# $var had already been set to abc, so it did not change.
Run Code Online (Sandbox Code Playgroud)

  • 我建议http://wiki.bash-hackers.org/syntax/pe或http://mywiki.wooledge.org/BashFAQ/073(和它的链接)作为比ABS(长期维护不足和倾向于在其示例中展示不良做法). (2认同)