A shell szkriptben található szótár csak az utolsó társított elemet mutatja

Szótárakat próbálok használni, és furcsa viselkedésben botlottam meg. Amikor ilyen szótárat hozok létre:

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

Az utolsó elem “prd” a képernyőn lesz kinyomtatva, nem az első. Az első bejegyzés kivételével minden bejegyzést a megfelelő kimenet eredményez. Nem vagyok biztos benne, hogy mit csinálok rosszul, mert minden kódpélda, amelyet megnéztem, a fentiekhez hasonló szótárakat használ. Valaki észreveszi a hibámat?

Üdvözlet

Megjegyzések

  • Hogyan futtatja a szkriptet?
  • A bash-ból futtatom, az sh bináris fájl használatával, root jogosultságokkal
  • Úgy viselkedik, mintha az servers tömb lenne asszociatív tömb helyett. Ellenőrizze, hogy vannak-e elírási hibák, és ellenőrizze, hogy a bash verzió legalább 4,0-e (az első támogatja-e az asszociatív tömböket).
  • sh vagy bash-t használ?
  • Mi a verziója bash, amit használsz (úgy viselkedik, mintha a bash 4 előtti verzióját használnád)?

Válasz

Úgy gondolom, hogy @Yurko megjegyzése a helyes út.

A 4. verziót megelőző bash-val (például /bin/bash Mac-en):

  1. a declare -A sor hibát fog kiadni (declare: -A: invalid option), és a tömb nincs deklarálva .
  2. a 2. sor létrehoz egy indexelt tömböt: mivel az indexet aritmetikai kifejezésként értékelik
  3. bash aritmetikai kifejezésekben: a “csupasz” szavakat változók neveként kezelik, és a nem beállított változók nulla értéket kapnak

Ezért minden karaktersorozatot a az index 0.

Próbálja ki:

 declare -p servers  

és látnia kell a kimenetet

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük