Dicționarul în script shell afișează doar ultimul element asociat

Încerc să folosesc dicționare și am dat peste un comportament ciudat. Când creez un dicționar de genul acesta:

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

Ultimul element „prd” va fi tipărit pe ecran, nu primul. Ștergerea fiecărei intrări, cu excepția primei, va duce la ieșirea corectă. Nu sunt sigur ce fac greșit, deoarece fiecare exemplu de cod la care am analizat folosește dicționare precum cele de mai sus. Poate cineva să vadă greșeala mea?

Salutări

Comentarii

  • Cum rulați scriptul?
  • Îl rulez din bash folosind sh binar cu privs de rădăcină
  • Se comportă ca și cum servers ar fi un tablou în loc de un tabel asociativ. Verificați dacă există greșeli de tipar și verificați dacă versiunea bash este de cel puțin 4.0 (prima care acceptă matrici asociative).
  • Folosiți sh sau bash?
  • Care este versiunea de bash pe care îl utilizați (se comportă ca și cum ați folosi o versiune de bash înainte de 4)?

Răspuns

Cred că comentariul lui @Yurko este drumul cel bun.

Cu bash înainte de versiunea 4 (cum ar fi /bin/bash pe un Mac):

  1. linia declare -A va emite o eroare (declare: -A: invalid option) și matricea este nedeclarat .
  2. a doua linie va crea o matrice indexată : deoarece indexul este evaluat ca o expresie aritmetică
  3. în expresii aritmetice bash: cuvintele „goale” sunt tratate ca numele variabilelor, iar variabilelor nesetate au valoarea zero

Prin urmare, fiecare șir este atribuit indexul 0.

Încercați acest lucru:

 declare -p servers  

și ar trebui să vedeți rezultatul

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *