在 bash 中将变量默认值设置为空的目的是什么?

Joh*_*n P 3 bash default-value

一般来说,此语法用于保证一个值,可能是默认参数。

(来自 Bash 参考手册)

${参数:-word}

如果参数未设置或为 null,则替换单词的扩展。否则,将替换参数的值。

如果仅在变量为空时才选择替换,那么将变量默认为空的目的是什么?

作为参考,我正在查看 /lib/lsb/init-functions。

Fre*_*red 6

“Null”表示该变量有一个值,并且该值是一个空字符串。shell 知道变量存在。

“Unset”意味着该变量尚未定义:就 shell 而言,它不存在。

在通常的模式下,shell 会将 null 和 unset 变量扩展为空字符串。但是有一种模式 ( set -u) 允许 shell 在变量未设置时展开时抛出运行时错误。启用此模式是一个很好的做法,因为很容易简单地错误输入变量名称并且很难调试错误。

从计算的角度来看,它实际上有助于区分未设置的变量和空变量,您可以为每种情况分配单独的语义。例如,假设您有一个可以接收参数的函数。如果未设置参数,您可能需要使用(非空)默认值;如果设置了参数,则可能需要使用传递给函数的任何值(包括空字符串)。你会做类似的事情:

my_function()
{
  echo "${1-DEFAULT_VALUE}"
}
Run Code Online (Sandbox Code Playgroud)

然后,下面的两个命令将提供不同的输出:

my_function     # Echoes DEFAULT_VALUE
my_function ""  # Echoes an empty line
Run Code Online (Sandbox Code Playgroud)

还有一种扩展类型不区分 null 和 not set :

"${VAR:-DEFAULT_VALUE}"
Run Code Online (Sandbox Code Playgroud)

它们都很有用,具体取决于您的需要。

测试变量是否已设置的方法(不冒运行时错误的风险)是以下类型的扩展:

"${VAR+VALUE}"
Run Code Online (Sandbox Code Playgroud)

如果未设置,它将扩展为空字符串VAR;如果设置了(空或带有值),则扩展为 VALUE。当你需要的时候非常有用。

一般来说,它有助于:

  • 显式声明变量
  • set -u防止静默扩展失败
  • 通过适当的扩展显式处理未设置的变量

这将使您的脚本更加可靠,并且更易于调试。