bash 4 中的键值字典错误地认为它有一个键

Key-value dictionary in bash 4 wrongly thinks it has a key

我想存储键值来存储人的地址。

以下代码构建一个 bash 4 数组,放入一个键值,然后尝试获取(不存在的)键的值:

#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"

containsElement () {
  local e
  for e in "${@:2}"; do [[ "$e" == "" ]] && return 0; done
  return 1
}

NAME="ian nothere"
containsElement "${NAME}" "${addresses[@]}"
if [[ $? -eq 1 ]]; then
  echo "Address is known: "
  echo ${addresses[${NAME}]}
else
  echo "Address unknown"
fi

不幸的是,它 returns:

$ ./run.sh
Address is known: 

$

我做错了什么?

这个 bash 文件中有几个问题,而且我承认我目前无法将字典作为参数传递。但在全球范围内这是错误的:

  • 你循环遍历字典来查找值:不是字典的原理,而且确实不高效。将其设置为 200000 个条目,您会发现 O(n) 实现速度非常慢,但它不应该如此。
  • 您真的不需要循环来查看是否存在,因为您最终会检索到该值!

备选方案:只检索值并检查是否为空

以名称作为参数的简化版本:

#!/bin/bash
declare -A addresses
addresses["john doe"]="Cows street 67"
addresses["freddy"]="Cat street 23"

NAME=

r=${addresses[${NAME}]}
if [ -z "$r" ] ; then
  echo "Address unknown"
else
  echo "Address is known: $r"
  echo 
fi

测试:

$ dict.sh "john doe"
Address is known: Cows street 67
$ dict.sh "john doeff"
Address unknown