我在查找如何在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'。但是我在两种情况下都得到了相同的结果。我已经搜索了其他可能的方法,但到目前为止所有方法都给了我相同的结果。有没有办法实现这个目标?
谢谢!
答案 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 强>