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
Odpowiedź
Myślę, że komentarz @Yurko jest właściwy.
W przypadku basha przed wersją 4 (np. /bin/bash
na Macu):
- wiersz
declare -A
wyemituje błąd (declare: -A: invalid option
), a tablica to nie zadeklarowane . - 2. linia utworzy tablicę indeksowaną : ponieważ indeks jest obliczany jako wyrażenie arytmetyczne
- 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")"
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).