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

时间:2017-01-28 22:59:00

标签: bash default-value

通常,此语法用于保证值,可能是默认参数。

  

(来自Bash参考手册)

     

$ {参数:-word}

     

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

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

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

1 个答案:

答案 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以防止无声扩展失败
  • 通过适当的扩展
  • 显式处理未设置的变量

这将使您的脚本更可靠,更容易调试。