如何在Bash中检查变量是否已设置

32 浏览
0 Comments

如何在Bash中检查变量是否已设置

如何在Bash中知道变量是否已设置?

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

function a {
    # if $1 is set ?
}

admin 更改状态以发布 2023年5月22日
0
0 Comments

检查非空/非零字符串变量,即如果有设置,则使用:

if [ -n "$1" ]

这是 -z 的相反。我发现自己比使用 -z 更多地使用 -n

您可以像这样使用它:

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

0
0 Comments

(通常)正确的方法

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" ]将可以胜任。

0