我有一系列动物:
declare -A animals=()
animals+=([horse])
我想检查动物是否存在:
if [ -z "$animals[horse]"]; then
echo "horse exists";
fi
但这不起作用。
答案 0 :(得分:11)
在bash
4.3中,-v
运算符可以应用于数组。
declare -A animals
animals[horse]=neigh
# Fish are silent
animals[fish]=
[[ -v animals[horse] ]] && echo "horse exists"
[[ -v animals[fish] ]] && echo "fish exists"
[[ -v animals[unicorn] ]] && echo "unicorn does not exist"
在以前的版本中,您需要更加小心地区分不存在的密钥和引用任何空字符串的密钥。
animal_exists () {
# If the given key maps to a non-empty string (-n), the
# key obviously exists. Otherwise, we need to check if
# the special expansion produces an empty string or an
# arbitrary non-empty string.
[[ -n ${animals[$1]} || -z ${animals[$1]-foo} ]]
}
animal_exists horse && echo "horse exists"
animal_exists fish && echo "fish exists"
animal_exists unicorn || echo "unicorn does not exist"
答案 1 :(得分:9)
您的脚本中有几个拼写错误
当我按原样运行它时,我从BASH收到以下错误消息:
1. animals: [horse]: must use subscript when assigning associative array
2. [: missing `]'
第一个说如果你想使用horse
作为关联数组的索引,你必须为它分配一个值。空值(null)没问题。
-animals+=([horse])
+animals+=([horse]=)
第二条消息表示您需要将要测试的值与括号分开,因为方括号被视为值的一部分(如果没有用空格分隔)
-if [ -z "$animals[horse]"]; then
+if [ -z "$animals[horse]" ]; then
最后,当分配了一个值时,关联数组中的元素就存在(即使该值为null)。由于测试是否已设置数组值的问题已经是answered on this site,我们可以借用解决方案
-if [ -z "$animals[horse]"]; then
+if [ -n "${animals[horse]+1}" ]; then
为了您的方便,这里是完整的脚本:
declare -A animals=()
animals+=([horse]=)
if [ -n "${animals[horse] + 1}" ]; then
echo "horse exists";
fi
答案 2 :(得分:3)
在BASH,你可以这样做:
declare -A animals=()
animals+=([horse]=)
[[ "${animals[horse]+foobar}" ]] && echo "horse exists"
如果"${animals[horse]+foobar}"
是数组中的有效索引,则 foobar
返回horse
,否则返回任何内容。
答案 3 :(得分:0)
有点旧,但在我搜索答案时出现了,我的系统没有 bash 4.3
,我特别关注 animals[horse-2]
示例
另一种方法是将内容从数组中转储出来,然后检查子字符串是否匹配 -
declare -A animals
animals[horse-2]=neigh-2
animals[dog]=woof
animals_as_string=$(declare -p animals)
other_animals="horse-2 moose cow"
for animal in $other_animals
do
if [[ "$animal" == *$animals_as_string" ]]; then
echo "found $animal"
fi
done
当然,您需要更多的东西来确保在搜索 animals[horse]
时没有找到动物 [horse-2](如果您的数组中有该)