如何检查变量是否在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 "" ]相同的值(真)))。

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

错误的方法

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

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

但是,这种区分在用户必须指定扩展名或附加属性列表并且未指定它们的情况下必须默认为非空值,而指定空字符串应使脚本使用空白扩展名或列表的附加属性。


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

if [ -n "$1" ]

这与-z相反。 我发现自己使用-n多于-z


以下是如何测试参数是未设置还是为空(“空”)设置值

+--------------------+----------------------+-----------------+-----------------+
|                    |       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:参数扩展:

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

链接地址: http://www.djcxy.com/p/4957.html

上一篇: How to check if a variable is set in Bash?

下一篇: When do we need curly braces around shell variables?