bash 参数扩展中不带冒号的等号/减号

bra*_*zzi 3 bash environment-variables variable-expansion

我最近在 Bash 脚本中发现了这样的片段:

$ echo ${A=3}
Run Code Online (Sandbox Code Playgroud)

现在,我知道如果是“falsy”,${A:=3}则会设置变量,或者如果是“falsy”,则会返回 3 。不过,我从未见过这些类似的不带冒号的表达式,而且我在Bash 文档中找不到这些不带冒号的表达式的解释。AA${A:-3}A

这里发生了什么?

bra*_*zzi 7

实际上,文档确实解释了这里发生的情况,即使稍微隐藏了 lede

\n
\n

当不执行子字符串扩展时,使用下面描述的形式(例如,\xe2\x80\x98:-\xe2\x80\x99),Bash 测试未设置或为 null 的参数。省略冒号会导致仅测试未设置的参数。换句话说,如果包含冒号,则运算符会测试两个参数\xe2\x80\x99 是否存在且其值不为空;如果省略冒号,则运算符仅测试是否存在。

\n
\n

实际上,这意味着如果未设置变量,它们的行为方式相同:

\n
$ echo ${A=no-colon}\nno-colon\n$ echo ${B:=with-colon}\nwith-colon\n$ echo $A\nno-colon\n$ echo $B\nwith-colon\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果变量设置为空字符串,则行为会有所不同。带冒号的表达式将设置变量并返回值,不带冒号的表达式将使变量保持原样(即设置为空字符串)并返回其空值:

\n
$ A=\'\' ; B=\'\'\n$ echo ${A=no-colon}\n\n$ echo ${B:=with-colon}\nwith-colon\n$ echo $A\n\n$ echo $B\nwith-colon\n
Run Code Online (Sandbox Code Playgroud)\n

如文档中所述,相同的行为适用于其他“运算符”(-?+)。

\n

本着“我可以回答我自己的问题吗?”的精神发布它。而且因为我花了相当长的时间来学习它,即使是在代码中找到它之后也是如此。也许通过一些例子使它更明确一点,可以帮助其他人:)

\n