如何检查是否在 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
where
${var+x}
是一个参数扩展,如果未设置,则评估为空,否则var
替换字符串x
。行情题外话
引号可以省略(所以我们可以说
${var+x}
,而不是"${var+x}"
),因为这种语法和用法保证这只会扩展为不需要引号的内容(因为它要么扩展为x
(不包含断字,所以它不需要引号),或者什么都没有(这导致[ -z ]
,它方便地评估为相同的值(true)[ -z "" ]
))。然而,虽然引号可以安全地省略,而且对所有人来说并不是很明显,他也是一个主要的 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”。在用户必须指定扩展名或附加属性列表并且不指定它们默认为非空值的情况下,未设置和“设置为空字符串”之间的区别是必不可少的,而指定空字符串应该使脚本使用空扩展名或附加属性列表。
但是,这种区别可能并非在每种情况下都必不可少。在这些情况下
[ -z "$var" ]
会很好。 -
要检查非空/非零字符串变量,即如果设置,请使用
if [ -n "$1" ]
是相反的
-z
。我发现自己使用-n
超过-z
.你会像这样使用它:
if [ -n "$1" ]; then echo "You supplied the first parameter!" else echo "First parameter not supplied." fi