从bash映射中检索时如何区分null和空字符串

时间:2012-09-26 10:18:38

标签: bash testing map null string

我在查找如何在bash映射中检查null(或取消设置?)时遇到问题。 也就是说,我想把我可以放在地图中的空字符串与我在地图中根本没有放置任何内容的情况(对于那个特定的键)区别对待。

例如,查看代码:

#!/bin/bash

declare -A UsersRestrictions
UsersRestrictions['root']=""


if [[ -z "${UsersRestrictions['root']}" ]] ; then
    echo root null
else 
    echo root not null
fi

if [[ -z "${UsersRestrictions['notset']}" ]]; then
    echo notset null
else 
    echo notset not null
fi

我希望对“root”的测试给我“not null”,而对“notset”的测试给我'null'。但是我在两种情况下都得到了相同的结果。我已经搜索了其他可能的方法,但到目前为止所有方法都给了我相同的结果。有没有办法实现这个目标?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用-z ${parameter:+word}作为测试条件。如果参数为null或未设置,则始终为true,否则为false。

来自bash手册页:

  

<强> $ {参数:+字}

     

使用替代值。如果参数为null或未设置,则不替换任何内容,否则单词的扩展为   取代

测试脚本:

#!/bin/bash

declare -A UsersRestrictions
UsersRestrictions['root']=""
UsersRestrictions['foo']="bar"
UsersRestrictions['spaces']="    "

for i in root foo spaces notset
do
    if [[ -z "${UsersRestrictions[$i]+x}" ]]; then
        echo "$i is null"
    else 
        echo "$i is not null. Has value: [${UsersRestrictions[$i]}]"
    fi
done

输出:

root is not null. Has value: []
foo is not null. Has value: [bar]
spaces is not null. Has value: [    ]
notset is null

答案 1 :(得分:0)

尝试以下方法:

if [[ -z "${UsersRestrictions['notset']}" && "${UsersRestrictions['notset']+x}" ]]; then
    echo "notset is defined (can be empty)"
else 
    echo "notset is not defined at all"
fi

诀窍是连接一个伪x字符,只有在定义 变量时才会附加该字符(无论它是否为空)。另请注意,root的第一个测试应该为您提供root null,因为该值实际上是空的。如果您想测试值是否为空,请改用if [[ ! -z $var ]]

<强> DEMO

参考文献: