Ordbok i skalskript som bara visar senast associerade objekt

Jag försöker använda ordböcker och snubblade över ett konstigt beteende. När jag skapar en sådan ordbok:

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

Det sista elementet ”prd” skrivs ut på skärmen, inte den första. Att radera varje post utom den första kommer att resultera i rätt utdata. Jag är inte säker på vad jag gör fel för varje kodexempel jag tittade på använder ordböcker som ovan. Kan någon upptäcka mitt misstag?

Hälsningar

Kommentarer

  • Hur kör du skriptet?
  • Jag kör det från bash med sh binär med root privs
  • Det beter sig som om servers var en matris istället för associerande matris. Sök efter stavfel och kontrollera att bash-versionen är minst 4,0 (den första som stöder associerande matriser).
  • Använder du sh eller bash?
  • Vad är versionen av bash du använder (fungerar det som om du använder en version av bash före 4)?

Svar

Jag tror att @Yurkos kommentar är rätt spår.

Med bash före version 4 (som /bin/bash på en Mac):

  1. declare -A raden avger ett fel (declare: -A: invalid option) och matrisen är inte deklarerat .
  2. Den andra raden skapar en indexerad array: eftersom index utvärderas som ett aritmetiskt uttryck
  3. i basiska aritmetiska uttryck: ”nakna” ord behandlas som namnen på variabler och unset-variabler får värdet noll

Därför tilldelas varje sträng till indexet 0.

Prova detta:

 declare -p servers  

och du ska se utdata

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *