如何在Bash中检查变量是否已设置
如何在Bash中检查变量是否已设置
如何在Bash中知道变量是否已设置?
例如,如何检查用户是否给函数的第一个参数?
function a { # if $1 is set ? }
admin 更改状态以发布 2023年5月22日
(通常)正确的方法
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编码人员)Destiny Architect 都没有明显的表现出来),有时写成[ -z "${var+x}" ]
会更好,代价是很小的O(1)速度惩罚。第一作者还在使用此解决方案的代码旁添加了此评论,并给出了指向此答案的URL,该答案现在也包含了省略引号的解释。
(经常)错误的方法
if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi
这通常是错误的,因为它不能区分未设置的变量和设置为空字符串的变量。也就是说,如果var =''
,则上述解决方案将输出“var为空白”。
区分未设置和“设置为空字符串”在用户必须指定扩展名或其他属性列表的情况下至关重要,而不指定它们将默认为非空值,而指定空字符串应该使脚本使用空扩展名或其他属性列表。
在某些情况下,这种区分可能并不是必要的,对于这些情况,[ -z "$var" ]
将可以胜任。