【问题标题】:What is the result of ${VAR:=value} in a bash scriptbash 脚本中 ${VAR:=value} 的结果是什么
【发布时间】:2014-04-04 01:38:46
【问题描述】:

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

export VAR=${VAR:=value}

这是在做什么? 如果 VAR 不存在,是否将 value 分配给 VAR

【问题讨论】:

  • 仅供参考,export 不是必需的,除非您希望子进程看到此值。更典型的用法是: "${var:=value}"(是的,小写——按照惯例,全大写名称是为环境变量和内置函数保留的)。 : 是一个 noop,所以唯一的副作用是 := 参数扩展的副作用,它不仅有条件地扩展,而且在适当的时候修改 var 本身。
  • ...更多关于常规/典型用法的信息:引号有两个原因:首先,它们可以防止 shell 做不必要的工作(字符串拆分和全局扩展一个值,这将是丢弃);其次,他们确保如果您使用set -x,您会看到一个未被此类扩展修改的值,从而在调试时为您提供更好的信息。
  • 有关一般参数扩展的更多信息,另请参阅mywiki.wooledge.org/BashFAQ/073

标签: bash shell


【解决方案1】:

根据documentation

${参数:=字}

如果参数未设置或为空,则将单词的扩展分配给参数。然后替换参数的值。位置参数和特殊参数不能这样赋值。

因此,它使用其值导出 VAR 值,或者如果它未设置/为空,则使用文字 value 导出。

【讨论】:

    【解决方案2】:

    来自手册页:

       ${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:那么使用它的当前值,变量不变。
    • 所以它将以前的值(存在或不存在)替换为当前值。
    • @AvinashRaj:不。它仅在变量未设置/为空时替换它,因此术语“默认值”。仅当未设置变量时才使用该值。
    【解决方案3】:

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

    ${foo:=bar}
    

    如果设置,将扩展为$foo。否则,它将值"bar" 分配给名称foo,并将整个表达式扩展为该值。我从来没有在现实生活中看到过任何好的例子。我见过它是这样使用的:

    : ${foo:=bar}
    

    通过执行分配工作,但丢弃其输出。我不认为这是一个很好的例子,因为你可以很容易地写

    foo=${foo:-bar}
    

    我认为这对大多数读者来说更为明显。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多