Ordbok i skallskript som bare viser siste tilknyttede element

Jeg prøver å bruke ordbøker og snublet over en merkelig oppførsel. Når jeg oppretter en ordbok som denne:

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

Det siste elementet «prd» blir skrevet ut på skjermen, ikke den første. Slette hver oppføring bortsett fra den første, vil resultere i riktig utdata. Jeg er ikke sikker på hva jeg gjør galt, fordi hvert kodeeksempel jeg så på, bruker ordbøker som ovenfor. Kan noen få øye på feilen min?

Hilsen

Kommentarer

  • Hvordan kjører du skriptet?
  • Jeg kjører den fra bash ved hjelp av sh binær med root privs
  • Den oppfører seg som om servers var en matrise i stedet for en assosiativ matrise. Se etter skrivefeil, og sjekk at bash-versjonen er minst 4,0 (den første som støtter assosiative matriser).
  • Bruker du sh eller bash?
  • Hva er versjonen av bash du bruker (det oppfører seg som om du bruker en versjon av bash før 4)?

Svar

Jeg tror @Yurkos kommentar er riktig spor.

Med bash før versjon 4 (som /bin/bash på en Mac):

  1. declare -A -linjen avgir en feil (declare: -A: invalid option) og matrisen er ikke erklært .
  2. 2. linje vil opprette en indeksert matrise: siden indeksen blir evaluert som et aritmetisk uttrykk
  3. i basiske aritmetiske uttrykk: «bare» ord blir behandlet som navn på variabler, og usett variabler får verdien null

Derfor tildeles hver streng til indeksen 0.

Prøv dette:

declare -p servers

og du bør se utdata

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *