我目前正在编写一个bash测试框架,在测试函数中,可以使用标准bash测试([[
)以及预定义匹配器。 Matchers是'[['的包装器,除了返回返回代码之外,设置一些有意义的消息说明预期的内容。
示例:
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=''
哪一个更好?它真的有所作为吗?或者我应该有一个额外的标志,表明该消息已被设置?
答案 0 :(得分:130)
除非您使用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
答案 1 :(得分:16)
如前所述,使用unset与数组不同
$ foo=(4 5 6)
$ foo[2]=
$ echo ${#foo[*]}
3
$ unset foo[2]
$ echo ${#foo[*]}
2
答案 2 :(得分:1)
因此,通过取消设置数组索引2,你基本上删除了数组中的那个元素并减少了数组大小(?)。
我做了自己的测试..
/task/{id}
结果是......
foo=(5 6 8)
echo ${#foo[*]}
unset foo
echo ${#foo[*]}
所以只是为了澄清一下,取消设置整个阵列实际上会完全删除它。
答案 3 :(得分:0)
根据上面的评论,这是一个简单的测试:
>>> s = '"start", 0xe1b04048, FUTEX_WAIT, 0, NULL , "Hey, World, how, are, you", not, a, string, "another, string"'
>>> s.split('"')
['',
'start',
', 0xe1b04048, FUTEX_WAIT, 0, NULL , ',
'Hey, World, how, are, you',
', not, a, string, ',
'another, string',
'']
>>> [x.strip() for i, w in enumerate(s.split('"'))
... for x in (['"%s"'%w] if i%2 else w.split(", ")) if x]
['"start"',
'0xe1b04048',
'FUTEX_WAIT',
'0',
'NULL',
'"Hey, World, how, are, you"',
'not',
'a',
'string',
'"another, string"']
示例:
isunset() { [[ "${!1}" != 'x' ]] && [[ "${!1-x}" == 'x' ]] && echo 1; }
isset() { [ -z "$(isunset "$1")" ] && echo 1; }