Słownik w skrypcie powłoki pokazuje tylko ostatnią powiązaną pozycję

Próbuję użyć słowników i natknąłem się na dziwne zachowanie. Kiedy tworzę taki słownik:

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

Ostatni element „prd” zostanie wydrukowany na ekranie, a nie pierwszy. Usunięcie każdego wpisu z wyjątkiem pierwszego spowoduje uzyskanie prawidłowego wyniku. Nie jestem pewien, co robię źle, ponieważ każdy przykład kodu, któremu się przyjrzałem, używa słowników takich jak powyżej. Czy ktoś może zauważyć mój błąd?

Pozdrowienia

Komentarze

  • Jak uruchamiasz skrypt?
  • Uruchamiam go z basha używając pliku binarnego sh z uprawnieniami roota
  • Zachowuje się tak, jakby servers był tablicą zamiast tablicy asocjacyjnej. Sprawdź, czy nie ma literówek i sprawdź, czy wersja basha to co najmniej 4.0 (pierwsza obsługuje tablice asocjacyjne).
  • Czy używasz sh lub bash?
  • Jaka jest wersja bash, którego używasz (zachowuje się tak, jakbyś używał wersji basha wcześniejszej niż 4)?

Odpowiedź

Myślę, że komentarz @Yurko jest właściwy.

W przypadku basha przed wersją 4 (np. /bin/bash na Macu):

  1. wiersz declare -A wyemituje błąd (declare: -A: invalid option), a tablica to nie zadeklarowane .
  2. 2. linia utworzy tablicę indeksowaną : ponieważ indeks jest obliczany jako wyrażenie arytmetyczne
  3. w wyrażeniach arytmetycznych basha: „nagie” słowa są traktowane jako nazwy zmiennych; a nieustawione zmienne otrzymują wartość zero

Dlatego każdy ciąg jest przypisany do indeks 0.

Spróbuj:

 declare -p servers  

i powinieneś zobaczyć wynik

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *