Przewodnik po tablicach Bash

Z tego przewodnika po tablicach Bash dowiesz się, jak deklarować i pracować z tablicami indeksowanymi i asocjacyjnymi w Bash.

W Bash możesz tworzyć tablice do przechowywania kolekcji elementów. Tablice Bash to kolekcje jednowymiarowe. W językach programowania, takich jak C i C++, tablice są zbiorami elementów tego samego typu danych. Jednak w Bash, w zależności od przypadku użycia, możesz przechowywać liczby całkowite i łańcuchy w tej samej tablicy.

W tym samouczku dowiesz się, jak zadeklarować tablicę Bash i uzyskać dostęp do jej elementów. Następnie nauczysz się przeglądać elementy tablicy i dołączać elementy do tablicy. Na koniec dowiesz się o tablicach asocjacyjnych w Bash.

Zaczynajmy!

⚙ Chcesz razem kodować? Oto wymagania wstępne:

Jak zadeklarować tablicę Bash

W tej sekcji poznasz składnię deklarowania tablicy Bash oraz przykłady kodu.

Składnia deklaracji tablicy Bash

Możesz zadeklarować tablicę w Bash, używając następującej składni:

$ arrayName=(elt1 elt2 ... eltN)

# arrayName is the name of the array
# elt1 through eltN are the N elements in the array

W powyższej składni nazwatablicy oznacza nazwę tablicy zawierającej N elementów elt1…eltN.

Elementy tablicy są ujęte w nawiasy otwierające i zamykające (). Zwróć też uwagę, że elementy tablicy są oddzielone spacją. Podobnie jak w przypadku każdej zmiennej Bash, przed operatorem przypisania = ani po nim nie powinno być spacji.

📑 W większości innych języków programowania elementy tablicy lub podobnych kolekcji oddziela się przecinkami. Ale w Bash białe znaki są separatorem.

W Bash takie tablice, w których elementy są identyfikowane przez ich indeks, nazywane są tablicami indeksowanymi.

Deklarowanie tablic indeksowanych w Bash

Stwórzmy ceny, tablicę liczb.

$ prices=(24 27 18 30 15)

Jak wspomniano w składni, liczby w tablicy cen są oddzielone spacją ujętą w nawiasy, bez spacji przed i po operatorze przypisania =.

W Bash możesz użyć polecenia echo, aby wydrukować wartość zmiennej. Użycie $variableName powoduje wydrukowanie wartości zmiennej Nazwa_zmiennej. Jednak widać, że użycie nazwy tablicy powoduje wyświetlenie tylko pierwszego elementu.

$ echo $prices
24

Tablice Bash stosują indeksowanie zerowe. Tak więc pierwszy element ma indeks 0, drugi element ma indeks 1 i tak dalej. Możesz także użyć indeksowania ujemnego; indeks ostatniego elementu tablicy to -1.

Co się stanie, jeśli spróbujesz uzyskać dostęp do elementu w określonym indeksie i wydrukować go? Spróbujmy wydrukować element o indeksie 1.

$ echo $prices[1]
24[1]

Dlaczego wyjście 24[1]? 🤔 Dzieje się tak, ponieważ Bash zastępuje $prices liczbą 24, pierwszym elementem tablicy i [1] jest drukowany jako taki.

Aby wydrukować element w określonym indeksie, możesz użyć rozwinięcia parametru postaci ${prices[index]}.

$ echo ${prices[1]}
# 27
$ echo ${prices[2]}
# 18

Aby wydrukować wszystkie elementy w tablicy, możesz podać @ zamiast określonego indeksu.

$ echo ${prices[@]}
24 27 18 30 15

Następnie utwórzmy tablicę ciągów znaków. Uruchomienie następującego polecenia tworzy indeksowaną tablicę:

$ declare -a fruits

Opcja -a tworzy indeksowaną tablicę. Możesz teraz wypełnić tablicę po jednym elemencie na raz, deklarując element pod określonym indeksem, jak pokazano poniżej:

$ fruits[0]="cherry"
$ fruits[1]="berry"
$ fruits[2]="apple"
$ fruits[3]="pear"
$ fruits[4]="melon"
$ fruits[5]="orange"

Teraz, aby wydrukować wszystkie elementy tablicy, możesz użyć ${fruits[@]}.

$ echo ${fruits[@]}
cherry berry apple pear melon orange

Uzyskaj dostęp do elementów tablicy Bash

Dostęp do elementów tablicy można uzyskać na następujące sposoby:

  • Przejdź przez tablicę i uzyskaj bezpośredni dostęp do elementu
  • Przejrzyj zestaw indeksów i uzyskaj dostęp do elementów w określonym indeksie

Zapętlanie elementów tablicy i dostępu

Jeśli kodowałeś w Pythonie, użyłeś pętli for używając następującej składni:

for elt in some_list:
    print(elt)

Teraz napiszmy odpowiednik powyższej pętli for w Bash.

Wiemy, że {ceny[@]} rozwija się do wszystkich elementów w tablicy cen. I ${ceny[@]} podaje nam wartości wszystkich elementów.

Pętla for w Bash jest podobna do składni pętli for w Pythonie, ale instrukcje w treści pętli powinny być ujęte w polecenia do i done, jak pokazano:

$ for price in ${prices[@]}
> do
> echo $price
> done

Ponieważ używamy polecenia echo i drukujemy wartość zmiennej price, otrzymujemy następujący wynik:

# output
24
27
18
30
15

Uzyskaj dostęp do elementów za pomocą indeksu tablicy

Innym sposobem przeglądania tablic jest użycie indeksu elementów. Jest to podobne do konstrukcji pętli for w Pythonie wykorzystującej funkcję range():

for i in range(len(some_list)):
    print(i)

Aby uzyskać listę indeksów do przejścia, możesz umieścić wykrzyknik (!) przed nazwą tablicy w rozwinięciu parametru. To da ci listę wszystkich prawidłowych indeksów dla tablicy, jak pokazano:

$ echo ${!prices[@]}
0 1 2 3 4

Tablica cen zawiera 5 elementów, więc indeks zaczyna się od 0 i rośnie do 4.

Następnie możemy przejść przez listę indeksów i uzyskać dostęp do elementu w każdym indeksie. Dla indeksu i ${prices[i]} to element o indeksie i.

$ for i in ${!prices[@]}
> do
> echo ${prices[i]}
> done

Powyższa pętla wypisuje wszystkie elementy tablicy.

# output
24
27
18
30
15

💬 Tutaj po uzyskaniu dostępu do każdego elementu wykonujemy prostą operację wydrukowania jego wartości. Ogólnie rzecz biorąc, możemy mieć dowolne prawidłowe przetwarzanie elementów.

Dołącz elementy do tablicy Bash

W tablicy cen mamy pięć elementów (o indeksach 0,1,2,3 i 4). Jeśli chcesz dodać element na końcu tablicy w indeksie 5, możesz to zrobić w następujący sposób:

$ prices[5]=21

Widzimy, że na końcu tablicy cen dodano liczbę 21.

$ echo ${prices[@]}
24 27 18 30 15 21

Jednak wygodniej jest dołączyć na końcu tablicy — bez zapamiętywania — indeks ostatnio dodanego elementu lub liczbę elementów znajdujących się aktualnie w tablicy.

Możesz użyć arrayName+=(elements(s)) it, aby dołączyć jeden lub więcej elementów do tablicy, jak pokazano:

$ prices+=(10)

Teraz, jeśli wydrukujemy tablicę cen, zobaczymy, że na końcu tablicy dodano 10.

$ echo ${prices[@]}
24 27 18 30 15 21 10

Następnie nauczmy się deklarować tablice asocjacyjne w Bash.

Tablice asocjacyjne w Bash

Jeśli chcesz zdefiniować relację w kategoriach par klucz-wartość, możesz użyć tablicy asocjacyjnej. Tablicę asocjacyjną można zadeklarować przy użyciu następującej ogólnej składni. Zauważ, że używamy opcji -A zamiast -a.

$ declare -A fruits_prices

Możesz dodawać elementy do tablicy asocjacyjnej, określając klucz i odpowiadającą mu wartość. Tutaj dodaliśmy nazwy owoców jako klucze i liczby z tablicy cen jako wartości.

$ fruits_prices[cherry]=24
$ fruits_prices[berry]=27
$ fruits_prices[apple]=18
$ fruits_prices[pear]=30
$ fruits_prices[melon]=15
$ fruits_prices[orange]=21

Jak więc uzyskać dostęp do elementów w tablicy asocjacyjnej?

Podobnie jak w przypadku wyszukiwania wartości za pomocą odpowiedniego klucza w słowniku Pythona, dostęp do wartości w tablicy asocjacyjnej można uzyskać za pomocą kluczy.

$ echo ${fruits_prices[berry]}
# 27

Widzimy, że ${fruits_prices[@]} rozwija się do wartości i ${!fruits_prices[@]} rozwija się do klawiszy.

$ echo ${fruits_prices[@]}
# Output: 18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# Output: apple berry orange cherry pear melon

Uwaga: Kolejność elementów nie jest taka sama, jak kolejność ich dodawania. Dzieje się tak, ponieważ w przeciwieństwie do tablic indeksowanych tablice asocjacyjne nie są zbiorami uporządkowanymi. Zamiast tego pracują nad powiązaniami między kluczami a wartościami. Dlatego klucze są dla tablic asocjacyjnych tym, czym indeksy dla tablic indeksowych.

Możesz także przejść przez tablicę asocjacyjną i uzyskać dostęp do klawiszy, jak pokazano:

$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# Output
apple
berry
orange
cherry
pear
melon

Poniższa pętla pokazuje, jak uzyskać dostęp do wartości.

$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# Output
18
27
21
24
30
15

Chociaż zaleca się użycie arrayName[key]=wartość, możesz również zadeklarować to jako sekwencję taką jak ta:

declare -A arrayName
arrayName=(key1 value1 key2 value2 ... keyN valueN)

W ten sposób Bash określa pierwszy element jako pierwszy klucz, drugi element jako pierwszą wartość i tak dalej.

Podsumowując

Mam nadzieję, że teraz rozumiesz, jak tworzyć i pracować z tablicami Bash. Oto krótki przegląd tego, czego się nauczyłeś.

  • Możesz zadeklarować indeksowaną tablicę w Bash, używając składni nazwa_tablicy=(elt1 elt2 elt3 … eltN) lub uruchomić zadeklarować -a nazwa_tablicy i dodać elementy do tablicy.
  • Aby uzyskać dostęp do elementów, możesz przejść przez pętlę, używając ${arrayName[@]}. Alternatywnie możesz uzyskać listę wszystkich prawidłowych indeksów, używając rozszerzenia parametru ${!arrayName[@]}.
  • Na koniec nauczyłeś się również, jak zadeklarować tablicę asocjacyjną do przechowywania par klucz-wartość w Bash.

Następnie zapoznaj się z samouczkiem dotyczącym pętli w Bash.