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)
小智 17
如上所述,使用unset也与数组不同
$ foo=(4 5 6)
$ foo[2]=
$ echo ${#foo[*]}
3
$ unset foo[2]
$ echo ${#foo[*]}
2
Run Code Online (Sandbox Code Playgroud)