2016-09-27 1 views
1

Je souhaite stocker des paires valeur/clé pour stocker les adresses de personnes.Le dictionnaire de valeur-clé dans bash 4 pense à tort qu'il a une clé

Le code suivant construit un bash 4 tableau, met une valeur clé, puis tente d'obtenir la valeur d'une clé (non existante):

#!/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 

Malheureusement, il retourne:

$ ./run.sh 
Address is known: 

$ 

Qu'est-ce que je fais mal?

+0

err vous revenez 1 lorsque l'adresse est pas connu. semble OK pour moi. Cela devrait être 'if [[$? -eq 0]] 'droite? –

+0

Btw .: array 'addresses' est global, pas besoin de passer à votre fonction. – Cyrus

+0

En outre, vous vérifiez les valeurs, pas les clés. – anishsane

Répondre

1

Il y a quelques problèmes dans ce fichier bash, plus je reconnais que je suis actuellement incapable de passer le dictionnaire en paramètre. MAIS globalement c'est faux:

  • vous parcourez le dictionnaire pour trouver les valeurs: pas le principe d'un dictionnaire, et vraiment pas performant. Faites-en 200000 entrées, vous verrez qu'il est sacrément lent avec une implémentation O(n), mais il ne devrait pas.
  • vous n'avez vraiment pas besoin d'une boucle pour voir si elle est présente, puisque vous récupérez finalement la valeur!

Alternative: il suffit de récupérer la valeur et vérifier si elle est vide

version simplifiée avec le nom en tant que paramètre:

#!/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 

test:

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

voir ma réponse mise à jour. J'espère que vous aimerez le changement radical de style :) –