bash脚本中${VAR:=value}的结果是什么

bash脚本中${VAR:=value}的结果是什么,bash,shell,Bash,Shell,我正在看几个bash脚本,它们在${}之间使用:=。例如,模式如下所示: export VAR=${VAR:=value} : ${foo:=bar} 这是干什么的? 如果VAR不存在,是否将值分配给VAR 换句话说,它基本上允许您为变量指定默认值。如果变量为unset/null,则将其设置为该值,该值也将用作扩展。根据: ${参数:=word} 如果参数未设置或为空,则word的展开式将指定给参数。然后替换参数的值。位置参数和特殊参数不能以这种方式指定给 因此,它将VAR值与其值一起导出,

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

export VAR=${VAR:=value}
: ${foo:=bar}
这是干什么的? 如果VAR不存在,是否将值分配给VAR

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

根据:

${参数:=word}

如果参数未设置或为空,则word的展开式将指定给参数。然后替换参数的值。位置参数和特殊参数不能以这种方式指定给


因此,它将VAR值与其值一起导出,或者如果未设置/null,则将其与literal
值一起导出,这是为名称指定默认值的一种方法

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

export VAR=${VAR:=value}
: ${foo:=bar}
它通过执行赋值但放弃其输出来工作。我不认为这是一个很好的例子,因为你可以很容易地写

foo=${foo:-bar}

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

仅供参考,
导出是不必要的,除非您希望子流程看到此值。更典型的用法是
:“${var:=value}”
(是的,小写——按照惯例,所有大写名称都是为环境变量和内置名称保留的)
是noop,因此唯一的副作用是
:=
参数扩展的副作用,它不仅有条件地扩展,而且在适当的情况下修改
var
本身……更多关于传统/典型用法的信息:引用的存在有两个原因:第一,它们防止shell做不必要的工作(字符串拆分和全局展开将被丢弃的值);其次,它们确保如果您使用的是
set-x
,您会看到一个未被此类扩展修改的值,从而在调试时为您提供更好的信息。有关一般参数扩展的详细信息,请参阅。可能重复@AvinashRaj:然后使用其当前值,并且变量不变。因此它将替换以前的变量值(存在或不存在)与当前值一起使用。@AvinashRaj:否。它仅在变量未设置/null时替换它,因此术语“默认值”。仅当变量未设置时才使用该值。