Dictionnaire dans le script shell affichant uniquement le dernier élément associé

Jessaye dutiliser des dictionnaires et je suis tombé sur un comportement étrange. Lorsque je crée un dictionnaire comme celui-ci:

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

Le dernier élément « prd » sera imprimé à lécran, pas le premier. La suppression de toutes les entrées à lexception de la première aboutira à la sortie correcte. Je ne suis pas sûr de ce que je fais mal, car chaque exemple de code que jai examiné utilise des dictionnaires comme ci-dessus. Quelquun peut-il repérer mon erreur?

Salutations

Commentaires

  • Comment exécutez-vous le script?
  • Je lexécute à partir de bash en utilisant le binaire sh avec des privs root
  • Il se comporte comme si servers était un tableau au lieu dun tableau associatif. Recherchez les fautes de frappe et vérifiez que la version de bash est au moins 4.0 (la première à prendre en charge les tableaux associatifs).
  • Utilisez-vous sh ou bash?
  • Quelle est la version de bash que vous utilisez (il se comporte comme si vous utilisez une version de bash antérieure à 4)?

Answer

Je pense que le commentaire de @Yurko est la bonne voie.

Avec bash avant la version 4 (comme /bin/bash sur un Mac):

  1. la ligne declare -A émettra une erreur (declare: -A: invalid option) et le tableau est non déclaré .
  2. la 2ème ligne créera un tableau indexé : puisque lindex est évalué comme une expression arithmétique
  3. dans les expressions arithmétiques bash: les mots « nus » sont traités comme les noms de variables; et les variables non définies reçoivent la valeur zéro

Par conséquent, chaque chaîne est affectée à lindex 0.

Essayez ceci:

declare -p servers

et vous devriez voir la sortie

 declare -a servers="([0]="prd")"  

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *