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

标签 bash default-value

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

(from the Bash reference manual)

${parameter:-word}

If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.

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

作为引用,我正在查看/lib/lsb/init-functions。

最佳答案

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

“未设置”表示变量尚未定义:就 shell 而言,它不存在。

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

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

my_function()
{
  echo "${1-DEFAULT_VALUE}"
}

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

my_function     # Echoes DEFAULT_VALUE
my_function ""  # Echoes an empty line

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

"${VAR:-DEFAULT_VALUE}"

根据您的需要,它们都有用。

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

"${VAR+VALUE}"

如果 VAR 未设置,这将扩展为空字符串,如果已设置(空或有值),则扩展为 VALUE。在需要时非常有用。

通常,它有助于:

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

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

关于bash - 在 bash 中将变量默认值设置为空的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915810/

相关文章:

ruby-on-rails - 方法忽略 Ruby on Rails 中的参数值,而是使用默认值

bash - 是否可以将内置 "read"与本地、只读或声明选项一起使用?

linux - 如何评估 bash shell 中的给定路径

bash - 为什么对两个大的二进制数进行异或运算会得到十进制输出?

java - String.valueOf(char) 和 + 的区别

Scala:无需创建对象即可获取默认值

linux - 如何使用 bash 替换多行?

linux - 从另一个脚本运行 bash 脚本并在第二个脚本运行时退出第一个脚本

jsf - <f :selectItem> within <h:selectOneMenu> 的默认选择

common-lisp - 区分具有默认值的 &optional 参数和无值