Bash脚本中BUILD_ENV_IMAGE+x末尾的+x含义是什么?
关于
${BUILD_ENV_IMAGE+x}中+x的含义 这是POSIX Shell标准规定的参数扩展特性,并非bash或sh专属,所有符合POSIX标准的shell都支持该特性。
${var+word}的核心规则是:
- 若变量
var已被定义(哪怕值为空),则返回word的内容; - 若变量
var未定义,则返回空字符串。
回到你提供的脚本:
if [[ -z "${BUILD_ENV_IMAGE+x}" ]]; then BUILD_ENV_IMAGE="${CI_CONTAINERS_REGISTRY}/build-env:${CI_CONTAINERS_BASE_TAG}-gcc11" fi
这里的x只是一个占位的"word",实际作用逻辑是:
- 当
BUILD_ENV_IMAGE未定义时,${BUILD_ENV_IMAGE+x}返回空值,-z判断结果为真,执行后续的赋值语句; - 当
BUILD_ENV_IMAGE已定义(哪怕被设为空值),${BUILD_ENV_IMAGE+x}返回x,-z判断结果为假,跳过赋值。
简言之,这段代码的目的是仅在BUILD_ENV_IMAGE未被定义时,为其设置默认值——和判断变量是否为空的逻辑不同,哪怕变量被显式设为空,也不会触发赋值操作。
示例验证
用你给出的代码可以直观验证这个逻辑:
# 变量被设为空值 var= # ${var:+word}:变量非空时返回word,否则返回空 echo ${var:+literal_out_put} abc # ${var+word}:变量已定义(哪怕空)就返回word,未定义返回空 echo ${var+literal_out_put} if [[ -z ${var+literal_out_put} ]]; then echo var is unset; else echo var = $var fi
执行后输出:
abc literal_out_put var =
对应解释:
${var:+literal_out_put}:因var是空值,返回空,最终输出abc;${var+literal_out_put}:var已定义(哪怕为空),返回literal_out_put;- 条件判断中,
${var+literal_out_put}返回非空值,因此执行echo var = $var,输出var =(对应空值)。
参数扩展规则对照表
| 参数扩展形式 | 变量未定义时 | 变量已定义但为空时 | 变量已定义且非空时 |
|---|---|---|---|
${var:-word} | 返回word | 返回word | 返回var的值 |
${var-word} | 返回word | 返回空 | 返回var的值 |
${var:+word} | 返回空 | 返回空 | 返回word |
${var+word} | 返回空 | 返回word | 返回word |
${var:=word} | 设var为word并返回 | 设var为word并返回 | 返回var的值 |
${var=word} | 设var为word并返回 | 返回空 | 返回var的值 |
${var:?message} | 输出message并退出 | 输出message并退出 | 返回var的值 |
${var?message} | 输出message并退出 | 返回空 | 返回var的值 |
内容的提问来源于stack exchange,提问作者smwikipedia
相关产品推荐
相关产品推荐

