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
这里发生了什么?
实际上,文档确实解释了这里发生的情况,即使稍微隐藏了 lede:
\n\n\n当不执行子字符串扩展时,使用下面描述的形式(例如,\xe2\x80\x98:-\xe2\x80\x99),Bash 测试未设置或为 null 的参数。省略冒号会导致仅测试未设置的参数。换句话说,如果包含冒号,则运算符会测试两个参数\xe2\x80\x99 是否存在且其值不为空;如果省略冒号,则运算符仅测试是否存在。
\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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n如文档中所述,相同的行为适用于其他“运算符”(-、?、+)。
本着“我可以回答我自己的问题吗?”的精神发布它。而且因为我花了相当长的时间来学习它,即使是在代码中找到它之后也是如此。也许通过一些例子使它更明确一点,可以帮助其他人:)
\n