在 bash 中将变量默认设置为空的目的是什么?
What is the purpose of setting a variable default to empty in bash?
通常,此语法用于保证值,可能是默认参数。
(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 知道变量存在。
"Unset" 表示变量尚未定义:就 shell 而言,它不存在。
在通常的模式下,shell 会将 null 和 unset 变量扩展为空字符串。但是有一种模式 (set -u
) 允许 shell 在变量未设置时展开时抛出运行时错误。启用此模式是一种很好的做法,因为它很容易 mis-type 一个变量名并且很难调试错误。
从计算的角度来看,区分未设置变量和空变量实际上很有用,您可以为每种情况分配单独的语义。例如,假设您有一个可以接收参数的函数。如果未设置参数,您可能希望使用 (non-null) 默认值,如果设置了参数,则可能希望使用传递给函数的任何值(包括空字符串)。你会做类似的事情:
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
防止静默扩容失败
- 通过适当的扩展显式处理未设置的变量
这将使您的脚本更可靠,更易于调试。
通常,此语法用于保证值,可能是默认参数。
(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 知道变量存在。
"Unset" 表示变量尚未定义:就 shell 而言,它不存在。
在通常的模式下,shell 会将 null 和 unset 变量扩展为空字符串。但是有一种模式 (set -u
) 允许 shell 在变量未设置时展开时抛出运行时错误。启用此模式是一种很好的做法,因为它很容易 mis-type 一个变量名并且很难调试错误。
从计算的角度来看,区分未设置变量和空变量实际上很有用,您可以为每种情况分配单独的语义。例如,假设您有一个可以接收参数的函数。如果未设置参数,您可能希望使用 (non-null) 默认值,如果设置了参数,则可能希望使用传递给函数的任何值(包括空字符串)。你会做类似的事情:
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
防止静默扩容失败- 通过适当的扩展显式处理未设置的变量
这将使您的脚本更可靠,更易于调试。