Woordenboek in shell-script dat alleen het laatste bijbehorende item toont

Ik probeer woordenboeken te gebruiken en stuit op een vreemd gedrag. Wanneer ik een woordenboek als dit maak:

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

Het laatste element “prd” wordt op het scherm afgedrukt, niet op de eerste. Als u elke invoer verwijdert, behalve de eerste, krijgt u de juiste uitvoer. Ik weet niet zeker wat ik verkeerd doe, want elk codevoorbeeld dat ik heb bekeken, gebruikt woordenboeken zoals hierboven. Kan iemand mijn fout herkennen?

Groeten

Reacties

  • Hoe voert u het script uit?
  • Ik draai het vanuit bash met sh binary met root privs
  • Het gedraagt zich alsof servers een array is in plaats van een associatieve array. Controleer op typefouten en controleer of de bash-versie ten minste 4.0 is (de eerste die associatieve arrays ondersteunt).
  • Gebruikt u sh of bash?
  • Wat is de versie van bash die je gebruikt (het gedraagt zich alsof je een versie van bash vóór 4 gebruikt)?

Antwoord

Ik denk dat de opmerking van @Yurko de goede weg is.

Met bash vóór versie 4 (zoals /bin/bash op een Mac):

  1. de regel declare -A geeft een foutmelding (declare: -A: invalid option) en de array is niet gedeclareerd .
  2. de 2e regel zal een geïndexeerde array creëren: aangezien de index wordt geëvalueerd als een rekenkundige uitdrukking
  3. in bash rekenkundige uitdrukkingen: “kale” woorden worden behandeld als de namen van variabelen; en niet-ingestelde variabelen krijgen de waarde nul

Daarom wordt elke string toegewezen aan de index 0.

Probeer dit:

 declare -p servers  

en je zou de uitvoer moeten zien

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *