在Bash脚本中,${VAR:=value}的结果是什么?

6

我正在查看几个使用${ }之间的:=的bash脚本。例如,模式如下:

export VAR=${VAR:=value}

这是在做什么? 如果VAR不存在,它会给VAR赋值吗?

请注意,除非您希望子进程看到此值,否则export不是必需的。更典型的用法是: "${var:=value}"(是的,小写 - 全大写名称通常保留给环境变量和内置函数)。:是一个无操作符,因此唯一的副作用是:=参数扩展的副作用,它不仅有条件地扩展,而且在适当的情况下修改var本身。 - Charles Duffy
更多关于传统/典型用法的内容:引号有两个作用:首先,它们防止 shell 做不必要的工作(对将被丢弃的值进行字符串拆分和通配符扩展);其次,它们确保如果你正在使用 set -x,你会看到一个没有被这样的扩展修改的值,从而在调试时提供更好的信息。 - Charles Duffy
参见http://mywiki.wooledge.org/BashFAQ/073了解更多关于参数展开的一般知识。 - Charles Duffy
3个回答

5
根据文档: ${parameter:=word}
如果 parameter 未设置或为空,则将 word 的扩展分配给 parameter。 然后替换参数的值。 不能以这种方式分配位置参数和特殊参数。
因此,它将 VAR 值与其值一起导出,或者如果未设置/为空,则导出具有文字值的 VAR。

5

来自man页面:

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

换句话说,它基本上允许您为变量指定默认值。如果变量未设置/为空,则将其设置为该值,并且该值也将用作扩展。


@AvinashRaj:那么它的当前值将被使用,变量不会改变。 - FatalError
因此,它将以当前值替换先前的值(无论其是否存在)。 - Avinash Raj
@AvinashRaj:不会。它只有在变量未设置/为空时才替换它,因此称为“默认值”。该值仅在变量未设置时使用。 - FatalError

2

这是一种为名称分配默认值的方法。

${foo:=bar}

如果设置了,它将扩展为$foo。否则,它会将值"bar"分配给名称foo,并将整个表达式扩展为该值。我从未在实际生活中看到过任何好的示例使用它。我看到过像这样使用:

: ${foo:=bar}

这种方法通过执行任务,但是会丢弃其输出。我不认为这是一个好的例子,因为你同样可以编写如下代码:

foo=${foo:-bar}

我认为这对大多数读者来说更显而易见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接