2016-09-27 26 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

看到我更新的答案。我希望你會喜歡風格的根本改變:) –