【问题标题】:Explanation of colon operator in ": ${foo=value}"":${foo=value}" 中冒号运算符的解释
【发布时间】:2011-11-18 15:49:38
【问题描述】:

我了解 bash 中冒号运算符的作用类似于 a null,并且我知道它在 parameter expansion 中使用,以及以其他方式使用,但有人可以解释一下:

: ${SOMETHING='value'}

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

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

【问题讨论】:

  • 请注意,: 内置存在于 bourne shell 和 ksh 以及 bash 中。

标签: bash


【解决方案1】:

表达式 ${SOMETHING='value'} 将 SOMETHING 设置为 value(如果尚未设置)。在许多情况下,这是一个有用的运算符。但是,它也会返回分配的值,所以如果你只是简单地执行了

${SOMETHING='value'}

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

为避免这种情况,您可以使用无操作 :,它会评估其参数,然后将其丢弃,而不是执行它。这记录在here

【讨论】:

  • : 内置命令记录在 here。它也是一个POSIX standard
  • 还解释了here
  • : ${SOMETHING="$HMMM"} 和 : ${SOMETHING:="$HMMM"} 之间有什么区别吗?注意最后一个例子中的第二个冒号
  • @YuryKozlov 如果参数为unset,第一个变体(=)将使用默认值;如果参数为null unset,则后者(:=)将使用默认值
【解决方案2】:

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

如果参数未设置,则设置为默认值。

两种形式几乎相同。 : 只有在 $parameter 已声明且为空,[1] 同上。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 2013-11-28
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多