协慌网

登录 贡献 社区

如何检查 Bash 中是否设置了变量?

我如何知道 Bash 中是否设置了变量?

例如,如何检查用户是否将第一个参数提供给函数?

function a {
    # if $1 is set ?
}

答案

(通常)正确的方式

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

其中${var+x}是一个参数扩展 ,如果未设置var则求值为空,否则替换字符串x

行情题外话

引号可以省略(所以我们可以说${var+x}而不是"${var+x}" ),因为这种语法和用法保证只会扩展到不需要引号的东西(因为它扩展为x (它不包含单词中断,因此它不需要引号),或者不包含任何内容(这会产生[ -z ] ,它可以方便地计算出[ -z "" ]的相同值(true))。

然而,尽管可以安全地省略引号,并且它并不是立即显而易见的( 对于这个引用解释的第一作者来说,这也是一个主要的 Bash 编码器并不明显),编写解决方案有时会更好。引号为[ -z "${var+x}" ] ,以极低的 O(1)速度罚款成本。第一作者还在代码旁边添加了这个注释,使用此解决方案给出了这个答案的 URL,现在还包括为什么可以安全地省略引号的解释。

(经常)错误的方式

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

这通常是错误的,因为它不区分未设置的变量和设置为空字符串的变量。也就是说,如果var='' ,那么上面的解决方案将输出 “var is blank”。

unset 和 “设置为空字符串” 之间的区别在用户必须指定扩展名或其他属性列表并且未指定它们默认为非空值的情况下是必不可少的,而指定空字符串应该使脚本使用空扩展或其他属性列表。

但是,在每种情况下,这种区别可能并不重要。在那些情况下[ -z "$var" ]会很好。

要检查非 null / 非零字符串变量,即如果设置,请使用

if [ -n "$1" ]

它与-z相反。我发现自己使用-n超过-z

您会像以下一样使用它:

if [ -n "$1" ]; then
  echo "You supplied the first parameter!"
else
  echo "First parameter not supplied."
fi

以下是如何测试参数是否未设置 ,或者为空(“Null”)使用值设置

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

来源: POSIX:参数扩展

在使用 “替换” 显示的所有情况下,表达式将替换为显示的值。在使用 “assign” 显示的所有情况下,都会为参数分配该值,该值也会替换表达式。