Widziałem sztuczkę polegającą na implementacji tablic asocjacyjnych w skrypcie powłoki. Na przykład print array["apples"]
może być skryptowany jako echo \$array$key
gdzie klucz = jabłka.
Nie wspomniano jednak o tym, jak wygenerować klucze do iteracji po tablicy. Jedynym sposobem, w jaki mogłem wymyślić, było przechowywanie kluczy w zmiennej ograniczonej spacjami, aby móc użyć pętli for do iteracji po tablicy.
Czy istnieje jakiś inny sposób przechowywania kluczy do późniejszego wykorzystania?
shell-script
associative-array
Jajogłowy
źródło
źródło
Odpowiedzi:
Pociski z tablicami asocjacyjnymi
Niektóre nowoczesne powłoki zapewniają tablice asocjacyjne: ksh93, bash ≥4, zsh. W ksh93 i bash, jeśli
a
jest tablicą asocjacyjną,"${!a[@]}"
to tablica jej kluczy:W zsh ta składnia działa tylko w trybie emulacji ksh. W przeciwnym razie musisz użyć natywnej składni zsh:
${(k)a}
działa również, jeślia
nie ma pustego klucza.W Zsh możesz także zapętlać jednocześnie
k
eys iv
alue:Pociski bez tablic asocjacyjnych
Emulowanie tablic asocjacyjnych w powłokach, które ich nie mają, to dużo więcej pracy. Jeśli potrzebujesz tablic asocjacyjnych, prawdopodobnie czas wprowadzić większe narzędzie, takie jak ksh93 lub Perl.
Jeśli potrzebujesz tablic asocjacyjnych w zwykłej powłoce POSIX, oto sposób ich symulacji, gdy klucze są ograniczone tylko do znaków
0-9A-Z_a-z
(cyfry ASCII, litery i podkreślniki). Przy takim założeniu klucze mogą być używane jako część nazw zmiennych. Poniższe funkcje działają na tablicę identyfikowaną przez przedrostek nazewnictwa „rdzeń”, który nie może zawierać dwóch kolejnych znaków podkreślenia.(Ostrzeżenie, nieprzetestowany kod. Wykrywanie błędów dla składniowo niepoprawnych rdzeni i kluczy nie jest zapewnione).
źródło
Nie jestem pewien, co masz na myśli mówiąc o sklepie, ale możesz iterować po kluczach, używając
${!array[@]}
składni:Tak więc, aby iterować:
Tutaj znalazłem ładny, krótki samouczek .
Jak wskazano w komentarzach poniżej, tablice asocjacyjne zostały dodane w
bash
wersji 4. Zobacz tutaj artykuł w dzienniku Linux na ten temat.źródło
(bash version 4 only)
To ważna rzecz do zapamiętania. Tradycyjniebash
tablice są tylko numeryczne.typeset
zamiastdeclare
w swoich przykładach. Dzięki temu byłyby przenośne między bash 4 a ksh93, które jako pierwsze zaimplementowały tablice asocjacyjne powłoki.Pociski bez tablic asocjacyjnych
Nie jest to takie trudne, gdy klawisze są ograniczone do
[0-9A-Za-z_]
(cyfr, liter, podkreślenia).Sztuczka polega na tym, że zamiast zapisywać w tablicy [ $ key ], przechowywać w zmiennych tablica_ $ key .
Zestaw:
Dostać:
Uwaga: Wartości nie mogą zawierać
'
(pojedynczy cytat).źródło
to działa w trybie bash
LUB
Nie trzeba używać eval afaik
źródło