Ordbog i shell-script viser kun sidste tilknyttede element

Jeg prøver at bruge ordbøger og snuble over en underlig opførsel. Når jeg opretter en ordbog som denne:

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

Det sidste element “prd” bliver udskrevet på skærmen, ikke den første. Sletning af hver post undtagen den første resulterer i den korrekte output. Jeg er ikke sikker på, hvad jeg laver forkert, for hvert kodeeksempel, jeg kiggede på, bruger ordbøger som ovenfor. Kan nogen få øje på min fejl?

Hilsner

Kommentarer

  • Hvordan kører du scriptet?
  • Jeg kører det fra bash ved hjælp af sh binær med root privs
  • Det opfører sig som om servers var et array i stedet for associativt array. Kontroller, om der er skrivefejl, og kontroller, at bash-versionen er mindst 4,0 (den første, der understøtter associative arrays).
  • Bruger du sh eller bash?
  • Hvad er versionen af bash bruger du (det opfører sig som hvis du bruger en version af bash før 4)?

Svar

Jeg tror, @Yurkos kommentar er det rigtige spor.

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

  1. declare -A linjen udsender en fejl (declare: -A: invalid option), og arrayet er ikke deklareret .
  2. 2. linje opretter et indekseret array: da indekset evalueres som et aritmetisk udtryk
  3. i basiske aritmetiske udtryk: “bare” ord behandles som navnene på variabler, og usættede variabler får værdien nul

Derfor tildeles hver streng til indekset 0.

Prøv dette:

declare -p servers

og du skal se output

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *