Shell-komentosarjassa oleva sanakirja, joka näyttää vain viimeisimmän liittyvän kohteen

Yritän käyttää sanakirjoja ja törmäsin outoon käyttäytymiseen. Kun luot tällaisen sanakirjan:

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

Viimeinen elementti ”prd” tulostetaan näytölle, ei ensimmäiselle. Jokaisen merkinnän poistaminen lukuun ottamatta ensimmäistä merkitsee oikeaa tulosta. En ole varma, mitä teen väärin, koska jokaisessa koodiesimerkissä, jota tarkastelin, käytetään edellä mainittuja sanakirjoja. Voiko kukaan havaita virheeni?

Terveisiä

Kommentteja

  • Kuinka suoritat komentosarjaa?
  • Suoritin sitä bashista käyttämällä sh binääriä pääkäyttäjillä
  • Se käyttäytyy ikään kuin servers olisi matriisi assosiatiivisen taulukon sijaan. Tarkista kirjoitusvirheet ja tarkista, että bash-versio on vähintään 4.0 (ensimmäinen, joka tukee assosiatiivisia taulukoita).
  • Käytätkö sh: tä tai bashia?
  • Mikä on version bash, jota käytät (se käyttäytyy samalla tavalla kuin jos käytät versiota bashista ennen 4: tä)?

Vastaa

Mielestäni @Yurkon kommentti on oikea raita.

Bashilla ennen versiota 4 (kuten /bin/bash Macissa):

  1. rivi declare -A lähettää virheen (declare: -A: invalid option) ja taulukko on ei ilmoitettu .
  2. 2. rivi luo indeksoitu taulukon: koska hakemisto arvioidaan aritmeettisena lausekkeena
  3. bash-aritmeettisissa lausekkeissa: ”paljaita” sanoja käsitellään muuttujien niminä; ja asettamattomille muuttujille annetaan arvo nolla

Siksi jokainen merkkijono määritetään hakemisto 0.

Kokeile tätä:

 declare -p servers  

ja sinun pitäisi nähdä tulos

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *