Ten przewodnik pokaże Ci, jak efektywnie wykorzystywać tablice w skryptach Bash, zarówno te z indeksami liczbowymi, jak i asocjacyjne.
W Bash, tablice umożliwiają przechowywanie grup danych. Są to struktury jednowymiarowe, które w odróżnieniu od języków takich jak C czy C++, nie wymagają, by wszystkie elementy były tego samego typu. W jednej tablicy Bash możesz umieścić zarówno liczby, jak i tekst.
W dalszej części artykułu dowiesz się, jak utworzyć tablicę, jak odczytywać jej zawartość, jak dodawać nowe elementy oraz jak korzystać z tablic asocjacyjnych.
Zaczynamy!
⚙️ Chcesz spróbować samodzielnie? Oto, czego potrzebujesz:
Tworzenie Tablic w Bash
W tej sekcji omówimy, w jaki sposób definiuje się tablice w Bash wraz z przykładami.
Składnia Definiowania Tablicy
Tablicę w Bash utworzysz, używając następującej konstrukcji:
$ nazwaTablicy=(element1 element2 ... elementN) # nazwaTablicy to nazwa tworzonej tablicy # element1 aż elementN to elementy tablicy
Powyższy zapis oznacza, że tworzymy tablicę o nazwie „nazwaTablicy”, która zawiera elementy od „element1” do „elementN”.
Elementy tablicy umieszczamy w nawiasach okrągłych. Pamiętaj, że elementy są oddzielone spacjami. Jak przy każdej zmiennej, przed i za znakiem równości nie może być spacji.
📑 W wielu językach programowania elementy tablic oddzielane są przecinkami. W Bash używamy do tego celu spacji.
W Bash tablice, gdzie elementy są identyfikowane przez ich pozycję (indeks), nazywamy tablicami indeksowanymi.
Przykłady Tablic Indeksowanych
Stwórzmy tablicę „ceny” przechowującą liczby:
$ ceny=(24 27 18 30 15)
Jak widać, liczby w tablicy są oddzielone spacjami i ujęte w nawiasy, bez spacji przed i po znaku równości.
Do wyświetlania zawartości zmiennych używamy polecenia `echo`. Użycie `$nazwaZmiennej` pokaże wartość zmiennej „nazwaZmiennej”. Jednak, gdy użyjemy samej nazwy tablicy, wyświetli się tylko jej pierwszy element.
$ echo $ceny 24
W Bash, numeracja elementów tablicy zaczyna się od 0. Pierwszy element ma indeks 0, drugi ma 1 i tak dalej. Możemy też używać indeksów ujemnych; indeks -1 oznacza ostatni element tablicy.
Co się stanie, jeśli chcemy wyświetlić element o określonym indeksie? Spróbujmy wyświetlić element o indeksie 1.
$ echo $ceny[1] 24[1]
Dlaczego otrzymujemy „24[1]”? 🤔 Bash interpretuje `$ceny` jako pierwszy element (24), a `[1]` drukuje tak, jak jest.
Aby prawidłowo wyświetlić element tablicy, musimy użyć konstrukcji `${ceny[indeks]}`.
$ echo ${ceny[1]} # 27 $ echo ${ceny[2]} # 18
Aby zobaczyć wszystkie elementy tablicy, użyjemy `@` zamiast konkretnego indeksu.
$ echo ${ceny[@]} 24 27 18 30 15
Utwórzmy teraz tablicę przechowującą tekst. Użyjemy do tego polecenia:
$ declare -a owoce
Opcja `-a` deklaruje zmienną jako tablicę indeksowaną. Teraz możemy dodawać elementy do tablicy pojedynczo, przypisując wartość do konkretnego indeksu, jak poniżej:
$ owoce[0]="wisnia" $ owoce[1]="jagoda" $ owoce[2]="jablko" $ owoce[3]="gruszka" $ owoce[4]="melon" $ owoce[5]="pomarancza"
Aby wyświetlić wszystkie elementy tablicy, użyjemy `${owoce[@]}`.
$ echo ${owoce[@]} wisnia jagoda jablko gruszka melon pomarancza
Dostęp do Elementów Tablicy
Możemy uzyskać dostęp do elementów tablicy na dwa sposoby:
- Przechodząc po wszystkich elementach
- Odwołując się do elementów za pomocą konkretnych indeksów
Przeglądanie Elementów Tablicy
Jeśli pracowałeś z Pythonem, zapewne znasz pętlę `for`, która wygląda tak:
for element in lista: print(element)
Zobaczmy, jak to zrobić w Bash.
Wiemy, że `${ceny[@]}` daje nam wszystkie elementy tablicy „ceny”, a `echo $element` wypisuje wartości tych elementów.
Pętla `for` w Bash jest podobna do tej w Pythonie, z tym że kod pętli umieszczamy pomiędzy słowami `do` i `done`:
$ for cena in ${ceny[@]} > do > echo $cena > done
Używając polecenia `echo` do wyświetlenia zmiennej `cena`, otrzymujemy:
# wynik 24 27 18 30 15
Dostęp do Elementów za Pomocą Indeksów
Inną metodą przeglądania tablic jest użycie indeksów. Jest to analogiczne do korzystania z `range()` w Pythonie:
for i in range(len(lista)): print(i)
Aby otrzymać listę indeksów tablicy, umieszczamy wykrzyknik (!) przed jej nazwą w rozwinięciu parametru. W ten sposób otrzymamy wszystkie prawidłowe indeksy tablicy:
$ echo ${!ceny[@]} 0 1 2 3 4
Tablica „ceny” ma 5 elementów, więc indeksy zaczynają się od 0 i kończą na 4.
Teraz możemy przejść po indeksach i dostać się do każdego elementu. Dla indeksu `i`, elementem będzie `${ceny[i]}`.
$ for i in ${!ceny[@]} > do > echo ${ceny[i]} > done
Powyższa pętla wyświetli wszystkie elementy tablicy.
# wynik 24 27 18 30 15
💬 W tym przypadku wyświetlamy elementy, ale możemy wykonywać dowolne operacje na elementach.
Dodawanie Elementów do Tablicy
Nasza tablica „ceny” ma 5 elementów (o indeksach od 0 do 4). Jeśli chcemy dodać nowy element na końcu, na pozycji 5, możemy to zrobić tak:
$ ceny[5]=21
W ten sposób na końcu tablicy dodaliśmy liczbę 21.
$ echo ${ceny[@]} 24 27 18 30 15 21
Jednak wygodniej jest dodawać elementy bez potrzeby pamiętania o ostatnim indeksie.
Możemy użyć `nazwaTablicy+=(element(y))`, aby dodać jeden lub więcej elementów, jak poniżej:
$ ceny+=(10)
Teraz, jeśli wyświetlimy tablicę „ceny”, zobaczymy liczbę 10 dodaną na końcu.
$ echo ${ceny[@]} 24 27 18 30 15 21 10
Teraz przejdźmy do tablic asocjacyjnych.
Tablice Asocjacyjne w Bash
Tablice asocjacyjne są przydatne, gdy chcemy przechowywać dane w formie par klucz-wartość. Deklarujemy je za pomocą opcji `-A` zamiast `-a`:
$ declare -A ceny_owocow
Możemy dodawać elementy do takiej tablicy, przypisując wartość do klucza. W naszym przykładzie, nazwy owoców będą kluczami, a wartościami będą ceny:
$ ceny_owocow[wisnia]=24 $ ceny_owocow[jagoda]=27 $ ceny_owocow[jablko]=18 $ ceny_owocow[gruszka]=30 $ ceny_owocow[melon]=15 $ ceny_owocow[pomarancza]=21
Jak odczytać wartości z tablicy asocjacyjnej?
Podobnie jak w słownikach Pythona, aby odczytać wartość, używamy klucza.
$ echo ${ceny_owocow[jagoda]} # 27
Wartości tablicy uzyskujemy przez `${ceny_owocow[@]}`, a klucze przez `${!ceny_owocow[@]}`.
$ echo ${ceny_owocow[@]} # Wynik: 18 27 21 24 30 15 $ echo ${!ceny_owocow[@]} # Wynik: jablko jagoda pomarancza wisnia gruszka melon
Ważne: Kolejność elementów nie jest taka sama jak kolejność dodawania. Tablice asocjacyjne nie są uporządkowane, jak tablice indeksowane. Klucze w tablicach asocjacyjnych są tym, czym indeksy w tablicach indeksowanych.
Możemy przeglądać tablicę asocjacyjną, aby uzyskać dostęp do kluczy:
$ for klucz in ${!ceny_owocow[@]} > do > echo $klucz > done
# Wynik jablko jagoda pomarancza wisnia gruszka melon
A ta pętla wyświetli wartości:
$ for wartosc in ${ceny_owocow[@]} > do > echo $wartosc > done
# Wynik 18 27 21 24 30 15
Chociaż najczęściej używa się `nazwaTablicy[klucz]=wartość`, można też zadeklarować tablicę w formie:
declare -A nazwaTablicy nazwaTablicy=(klucz1 wartość1 klucz2 wartość2 ... kluczN wartośćN)
W ten sposób Bash interpretuje pierwszy element jako klucz, drugi jako wartość i tak dalej.
Podsumowanie
Mam nadzieję, że ten artykuł pomógł Ci zrozumieć, jak tworzyć i wykorzystywać tablice w Bash. Oto podsumowanie najważniejszych informacji:
- Tablicę indeksowaną w Bash zadeklarujesz za pomocą konstrukcji `nazwa_tablicy=(elt1 elt2 elt3 … eltN)` lub `declare -a nazwa_tablicy`, a następnie dodajesz do niej elementy.
- Aby uzyskać dostęp do elementów, można przejść po nich pętlą za pomocą `${nazwaTablicy[@]}`, lub wykorzystać indeksy, uzyskując ich listę za pomocą `${!nazwaTablicy[@]}`.
- Nauczyłeś się, jak tworzyć tablice asocjacyjne do przechowywania danych w formie par klucz-wartość.
Zachęcam do zapoznania się z kolejnym samouczkiem dotyczącym pętli w Bash.
newsblog.pl