2016-09-27 29 views
1

我想存储键值来存储人们的地址。bash 4中的键值字典错误地认为它有一个键

以下代码构建一个bash 4阵列,把一个键 - 值,然后尝试获取该值对于(不存在的)关键:

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

containsElement() { 
    local e 
    for e in "${@:2}"; do [[ "$e" == "$1" ]] && 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 

不幸的是,它返回:

$ ./run.sh 
Address is known: 

$ 

我在做什么错了?

+0

ERR返回1时,地址是未知。对我来说似乎没问题。它应该是'如果[[$? -eq 0]]'对吗? –

+0

Btw .: array'addresses'是全局的,不需要传递给你的函数。 – Cyrus

+0

另外,您正在检查值,而不是键。 – anishsane

回答

1

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

  • 你通过字典循环找到值:不是字典的原则,真的没有高性能。使它成为200000个条目,你会发现它实施起来很慢,但它不应该。
  • 你真的不需要一个循环来查看是否存在,因为你最终检索的值!

另类:只检索值,并检查是否为空

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

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

NAME=$1 

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 
+0

看到我更新的答案。我希望你会喜欢风格的根本改变:) –