2012-09-04 27 views
76

我目前正在编写一个bash测试框架,在测试函数中,可以使用标准bash测试([[)以及预定义的匹配器。匹配器是'[''的包装,并且除了返回一个返回码,还设置了一些有意义的信息来说明预期的结果。使用未设置与设置变量为空

实施例:

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

      return 1 
    fi 
} 

所以,当使用一个匹配器,并且它出现故障,只有一个ERROR_MESSAGE被设置。

现在,在稍后的某个时刻,我测试测试是否成功。如果成功了,我会打印绿色的期望,如果红色失败。

此外,也有可能是ERROR_MESSAGE集,所以我测试是否存在消息,打印出来,然后再取消它(因为下面的测试可能不会设置error_message):

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

    unset -v error_message 
fi 

现在我的问题是的,如果是更好地取消设置变量,或只是将其设置为“”,像

error_message='' 

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

+1

如果你从不比较'error_message'和其他任何东西,我会说没关系。但是,我认为你需要'[[$ error_message]]',否则你正在测试字符串“error_message”存在。 – chepner

+0

@chepner是的,是一个错字。修复。 – helpermethod

回答

108

晴看不到有差别,除非你使用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 

所以真的,这取决于你如何去测试变量。

我会补充说,测试我的首选方式,如果它被设置为:

[[ -n $var ]] # True if the length of $var is non-zero 

[[ -z $var ]] # True if zero length 
+31

'var ='不是“未设置”。这只是一个没有引号的空字符串。除'set -u'之外,bash的各种形式的参数扩展还可以区分unset和null值:'foo:bar}'在'foo'未设置时扩展为“bar”,而'foo '为空,而如果foo未设置或为空,则“$ {foo:-bar}”扩展为“bar”。 – chepner

+0

如果将'var'设置为空字符串,'[[-n $ var]]'为false。 – chepner

+0

@chepner:好的,这就是我的意思,我会做一个编辑。 – cdarke

10

正如人们所说的,使用未设置与数组不同以及

$ foo=(4 5 6) 

$ foo[2]= 

$ echo ${#foo[*]} 
3 

$ unset foo[2] 

$ echo ${#foo[*]} 
2