通常,此语法用于保证值,可能是默认参数。
(来自Bash参考手册)
$ {参数:-word}
如果参数未设置或null ,则替换单词的扩展。 否则,参数的值将被替换。
如果仅在变量为空时才选择替换,那么将变量默认为空的目的是什么?
作为参考,我正在查看/ lib / lsb / init-functions。
答案 0 :(得分:3)
"空"表示变量具有值,该值为空字符串。 shell知道变量存在。
"取消设定"表示尚未定义变量:就shell而言,它不存在。
在通常模式下,shell将展开null并将unset变量设置为空字符串。但是有一种模式(set -u
)允许shell在未设置变量时展开运行时错误。最好启用此模式,因为简单地错误输入变量名称并且难以调试错误非常容易。
从计算的角度来看,区分unset和empty变量实际上是有用的,你可以为每个case分配单独的语义。例如,假设您有一个可能接收参数的函数。如果参数未设置,您可能希望使用(非空)默认值,或者如果设置了参数,则可以使用传递给函数的任何值(包括空字符串)。你可以这样做:
my_function()
{
echo "${1-DEFAULT_VALUE}"
}
然后,下面的两个命令将提供不同的输出:
my_function # Echoes DEFAULT_VALUE
my_function "" # Echoes an empty line
还有一种扩展不区分null和未设置:
"${VAR:-DEFAULT_VALUE}"
根据您的需要,它们都很有用。
测试变量是否设置(不运行运行时错误的风险)的方法是以下类型的扩展:
"${VAR+VALUE}"
如果未设置VAR
,则会扩展为空字符串;如果设置为空,则会扩展为VALUE(空或带值)。在您需要它时非常有用。
通常,它有助于:
set -u
以防止无声扩展失败这将使您的脚本更可靠,更容易调试。