使用unset与将变量设置为空

hel*_*hod 100 variables syntax bash

我正在编写一个bash测试框架,在测试函数中,可以使用标准bash测试([[)和预定义匹配器.Matchers是'[['的包装器,除了返回返回代码之外,设置一些有意义的消息说出预期的内容.

例:

string_equals() {
    if [[ ! $1 = $2 ]]; then
            error_message="Expected '$1' to be '$2'."

            return 1
    fi
}
Run Code Online (Sandbox Code Playgroud)

因此,当使用匹配器并且失败时,只会设置error_message.

现在,稍后,我测试测试是否成功.如果成功,我打印出绿色的期望,如果红色失败了.

此外,可能有一个error_message设置,所以我测试一条消息是否存在,打印它,然后取消设置它(因为以下测试可能没有设置error_message):

if [[ $error_message ]]; then
    printf '%s\n' "$error_message"

    unset -v error_message
fi
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果最好取消设置变量,或者只是将其设置为'',就像

error_message=''
Run Code Online (Sandbox Code Playgroud)

哪一个更好?它真的有所作为吗?或者我应该有一个额外的标志,表明该消息已设置?

cda*_*rke 135

除非您使用set -u以下内容,否则大多数情况下您没有看到任何区别:

/home/user1> var=""
/home/user1> echo $var

/home/user1> set -u
/home/user1> echo $var

/home/user1> unset var
/home/user1> echo $var
-bash: var: unbound variable
Run Code Online (Sandbox Code Playgroud)

所以,这取决于你将如何测试变量.

我将补充说,我设置的首选测试方法是:

[[ -n $var ]]  # True if the length of $var is non-zero
Run Code Online (Sandbox Code Playgroud)

要么

[[ -z $var ]]  # True if zero length
Run Code Online (Sandbox Code Playgroud)

  • `var =`不是"未设置".它只是一个不带引号的空字符串.除了`set -u`之外,bash的各种形式的参数扩展还可以区分unset和null值:`$ {foo:bar}`当`foo`未设置时扩展为"bar",但是当`foo'时扩展为"bar" `是null,而`$ {foo:-bar}`如果foo未设置或为null则扩展为"bar". (38认同)
  • @chepner应该是`$ {foo-bar}`而不是`$ {foo:bar}`.为自己考试:'unset a; echo"> $ {a:-foo} - $ {a:foo} - $ {a-foo} <"` (3认同)

小智 17

如上所述,使用unset也与数组不同

$ foo=(4 5 6)

$ foo[2]=

$ echo ${#foo[*]}
3

$ unset foo[2]

$ echo ${#foo[*]}
2
Run Code Online (Sandbox Code Playgroud)