【发布时间】:2022-06-29 06:45:31
【问题描述】:
我最近在 Bash 脚本中有这样的 sn-p:
$ echo ${A=3}
现在,我知道${A:=3} 将设置变量A 如果A 是“假”,或者${A:-3} 将返回3 如果A 是“假”。不过,我从未见过这些没有冒号的类似表达式,我在Bash's documentation 中找不到这些无冒号表达式的解释。
这是怎么回事?
【问题讨论】:
标签: bash
我最近在 Bash 脚本中有这样的 sn-p:
$ echo ${A=3}
现在,我知道${A:=3} 将设置变量A 如果A 是“假”,或者${A:-3} 将返回3 如果A 是“假”。不过,我从未见过这些没有冒号的类似表达式,我在Bash's documentation 中找不到这些无冒号表达式的解释。
这是怎么回事?
【问题讨论】:
标签: bash
实际上,文档确实解释了这些表达方式,即使有点掩饰了lede:
当不执行子字符串扩展时,使用下面描述的形式(例如,':-'),Bash 测试未设置或为空的参数。省略冒号会导致仅对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试两个参数的存在以及它的值是否不为空;如果省略冒号,则运算符仅测试是否存在。
实际上,这意味着如果未设置变量,它们的行为方式相同:
$ echo ${A=no-colon}
no-colon
$ echo ${B:=with-colon}
with-colon
echo $A
no-colon
$ echo $B
with-colon
但是,如果将变量设置为空字符串,则行为会有所不同。带有冒号的表达式将设置变量并返回值,而没有冒号的表达式将保持变量不变(即设置为空字符串)并返回其空值:
$ A='' ; B=''
$ echo ${A=no-colon}
$ echo ${B:=with-colon}
with-colon
$ echo $A
$ echo $B
with-colon
如文档中所述,相同的逻辑适用于其他“运算符”(-、?、+)。
本着 Can I answer my own question? 的精神发布它,因为即使在代码中找到它,我也花了很长时间才学会它。也许通过一些例子让它更明确一点,可以帮助其他人:)
【讨论】: