Przewodnik po tablicach Bash

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