使用unset与将变量设置为空

时间:2012-09-04 11:37:57

标签: bash variables syntax

我目前正在编写一个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=''

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

4 个答案:

答案 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; }