Jak pracować z tablicami w skryptach Bash

Tablice w Bash to potężne narzędzie do zarządzania danymi. W artykule omówiono ich deklarację, iterację oraz manipulację, co ułatwi pisanie bardziej efektywnych skryptów.
Jeśli pracujesz z dużą ilością danych w swoich skryptach Bash, tablice znacznie ułatwią Ci życie. Niektórzy ludzie czują się zaniepokojeni składnią. Ale gdy ją opanujesz, Twoje skrypty staną się mocniejsze, z mniejszą liczbą zmiennych do przemyślenia.
Deklarowanie tablicy
Tablice w Bash pozwalają przechowywać wiele elementów w jednej zmiennej, podobnie jak lista w Pythonie. Czyni to je potężnymi narzędziami do zarządzania zestawami powiązanych wartości, takich jak nazwy plików, nazwy użytkowników, opcje konfiguracyjne lub argumenty wiersza poleceń.
W przeciwieństwie do wielu innych języków programowania, Bash nie wymaga, abyś jawnie deklarował typ tablicy. Po prostu przypisujesz wartości, używając określonej składni, a Bash wie, że to tablica. Metoda deklaracji różni się w zależności od typu tablicy (opisanej później).
Aby zadeklarować tablicę indeksowaną, która jest najczęściej używanym typem tablicy, wystarczy wpisać nazwę, znak równości i nawiasy.
arr=()
To wszystko. Właśnie zadeklarowałeś pustą tablicę. Możesz zobaczyć jej elementy, używając polecenia echo, w ten sposób:
echo $arr
Ponieważ nie ma elementów, nie zobaczysz nic oprócz pustej linii. Możesz przypisać wartości do tablicy w tej samej linii. Aby to zrobić, wpisz oddzielone spacjami elementy w nawiasach.
fruits=("apple" "banana" "cherry")Każda wartość oddzielona spacją staje się elementem tablicy. Możesz to zweryfikować za pomocą:
echo "${fruits[@]}"Możesz również zadeklarować pustą tablicę i dodać elementy później.
fruits=()
fruits+=("apple")
fruits+=("banana" "cherry")Wydrukowanie tablicy wyświetli nowo dodane elementy.
To podejście jest przydatne, jeśli musisz dynamicznie wypełnić tablicę. Możesz także przypisywać poszczególne elementy według indeksu.
fruits[0]="apple" fruits[1]="banana" fruits[2]="cherry"
Innym sposobem zadeklarowania tablicy jest użycie wbudowanej komendy declare, aby jawnie zdefiniować tablicę indeksowaną.
declare -a colors=("red" "green" "blue")To jasno pokazuje innym, że 'colors' ma być tablicą, co może być przydatne w większych skryptach. Aby potwierdzić, czy zmienna Bash jest tablicą (i jakiego rodzaju), użyj polecenia declare -p.
Jest to szczególnie przydatne podczas debugowania skryptów.
Pętla przez tablicę
Gdy zadeklarujesz tablicę, zazwyczaj chcesz coś zrobić z jej elementami: wydrukować je, przetworzyć lub przekazać do poleceń. W Bash istnieje kilka sposobów na iterację przez tablice, a zrozumienie tych podejść jest kluczowe dla pisania elastycznych, wolnych od błędów skryptów.
Najczęstszym sposobem iteracji przez każdy element tablicy jest prosta pętla for w Bash.
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; do
echo "Lubię $fruit"
doneTo jest świetne do przeglądania wartości. Ale co jeśli potrzebujesz także indeksów? W takim przypadku możesz użyć pętli for w stylu C, takiej jak ta:
for ((i=0; i<${#fruits[@]}; i++)); do
echo "Owoc #$i to ${fruits[$i]}"
doneTo jest idealne, jeśli potrzebujesz zarówno pozycji, jak i wartości. Aby uzyskać tylko indeksy, możesz użyć specjalnego rozwinięcia ${!array[@]}, w ten sposób:
for index in "${!fruits[@]}"; do
echo "Indeks $index = ${fruits[$index]}"
doneTa technika jest również przydatna, gdy tablica nie jest sekwencyjna (na przykład, jeśli niektóre elementy zostały usunięte). Jeśli twoja tablica pochodzi z wyjścia polecenia, pętla while read może być bardziej efektywna lub czytelna.
printf '%s\n' "${lines[@]}" | while read -r file; do
echo "Przetwarzam $file"
doneTo podejście jest doskonałe, gdy odczytujesz dane dynamicznie z poleceń lub plików. Kolejną fajną sztuczką jest to, że możesz przeglądać wiele tablic razem. Oto przykład:
names=("Alice" "Bob" "Charlie")
ages=(25 30 35)
for ((i=0; i echo "${names[$i]} ma ${ages[$i]} lat"
donePodczas przeglądania wielu tablic razem, zawsze upewnij się, że mają tę samą długość.
Różne rodzaje tablic w Bash
Tablice Bash występują w kilku odmianach, a zrozumienie ich różnic pomoże Ci wybrać odpowiednie narzędzie do swojego skryptu. Bash obsługuje dwa główne typy tablic:
- Tablice indeksowane: standardowe.
- Tablice indeksowane: uporządkowane listy indeksowane liczbami.
- Tablice asocjacyjne: pary klucz-wartość indeksowane ciągami znaków.
- Tablice indeksowane: standardowe.
Jest też specjalny typ wart uwagi, zwany tablicami rzadkimi, w których indeksy liczbowe nie są sekwencyjne. Przejdźmy przez każdy typ.
Tablice indeksowane
Tablice indeksowane to najczęstszy typ, idealny do przechowywania uporządkowanych list, takich jak nazwy plików, identyfikatory użytkowników czy liczby. Każdy element jest identyfikowany przez indeks całkowity, zaczynający się od 0.
owoce=("jabłko" "banan" "wiśnia")
echo "${owoce[0]}"
echo "${owoce[1]}"Możesz wyświetlić wszystkie elementy jednocześnie lub sprawdzić liczbę elementów:
echo "${owoce[@]}"
echo "${#owoce[@]}"Tablice indeksowane są przydatne, gdy masz listę z naturalnym porządkiem lub chcesz iterować przez wyniki poleceń.
Tablice asocjacyjne
Tablice asocjacyjne działają jak słowniki lub mapy haszy w wielu innych językach. Pozwalają przypisywać wartości do kluczy tekstowych zamiast indeksów numerycznych.
declare -A stolice=(
[Francja]="Paryż"
[Włochy]="Rzym"
[Japonia]="Tokio"
)
echo "${stolice[Francja]}"Możesz łatwo przez nie iterować:
for kraj in "${!stolice[@]}"; do
echo "$kraj → ${stolice[$kraj]}"
doneZauważ, że kolejność kluczy w tablicach asocjacyjnych nie jest określona. Jeśli kolejność ma znaczenie, będziesz musiał posortować je ręcznie. Tablice asocjacyjne są przydatne, gdy potrzebujesz mapować relacje lub obsługiwać dane w formacie JSON.
Tablice rzadkie
Tablice rzadkie to mniej znana, ale interesująca funkcja. To tablice indeksowane z lukami w numeracji. Możesz przypisywać elementy do dowolnych indeksów. Bash nie wymaga, aby były sekwencyjne.
liczby=()
liczby[2]=200
liczby[10]=1000
liczby[42]=4200
echo "${!liczby[@]}"Dostęp do niezdefiniowanych indeksów zwróci nic:
echo "${liczby[5]}"Mimo to możesz bezpiecznie iterować przez istniejące elementy. Jeśli masz dużą bazę danych, w której nie każdy indeks jest używany lub pracujesz z wynikami, które naturalnie mają "dziury", to cecha rzadkości może być przydatna.
Dostęp, modyfikacja i usuwanie elementów tablic
Po zadeklarowaniu i wypełnieniu tablicy, następnym krokiem jest nauczenie się, jak wydobywać wartości, aktualizować je i usuwać, gdy zajdzie taka potrzeba. Praca z elementami tablic w Bash jest prosta, ale istnieje kilka subtelnych zachowań, które warto zapamiętać.
Możesz uzyskać dostęp do elementu przez jego indeks (dla tablic indeksowanych) lub klucz (dla tablic asocjacyjnych). Dla tablic indeksowanych:
owoce=("jabłko" "banan" "wiśnia")
echo "${owoce[0]}"
echo "${owoce[2]}"Dla tablic asocjacyjnych:
declare -A stolice=(
[Francja]="Paryż"
[Włochy]="Rzym"
[Japonia]="Tokio"
)
echo "${stolice[Japonia]}"W obu przypadkach, jeśli indeks lub klucz nie ma wartości, uzyskasz pusty ciąg jako wynik. Jeśli chcesz uzyskać dostęp do wszystkich elementów lub indeksów jednocześnie, istnieją pewne specjalne składnie. Oto ściągawka, której możesz użyć.
| Składnia ekspansji | Opis |
|---|---|
| ${tablica[@]} | Wszystkie wartości |
| ${!tablica[@]} | Wszystkie indeksy lub klucze |
| ${#tablica[@]} | Liczba elementów |
| ${tablica[*]} | Wszystkie wartości (połączone w ciąg) |
Zawsze cytuj swoje ekspansje: "${tablica[@]}". Ekspansje bez cytatów mogą się zepsuć, gdy elementy zawierają spacje lub znaki wieloznaczne.
Aby zmodyfikować element tablicy, po prostu przypisz mu nową wartość:
owoce[1]="jeżyna"
echo "${owoce[1]}"
owoce[1]="borówka"
echo "${owoce[1]}"Możesz również dodać nowe elementy:
owoce+=("dragonfruit")Dla tablic asocjacyjnych, zmieniasz wartości przypisane do kluczy.
stolice["Francja"]="Paryż"
echo "${stolice[Francja]}"
stolice["Francja"]="Marsylia"
echo "${stolice[Francja]}"Przypisanie nowej wartości nadpisuje starą, więc bądź ostrożny podczas jego wykonywania.
Aby usunąć element, możesz użyć polecenia unset. Możesz usunąć konkretne elementy lub całą tablicę.
unset 'owoce[1]' echo
${fruits[@]}Aby usunąć wiele elementów:
unset 'fruits[0]' 'fruits[2]'
Aby usunąć całą tablicę, wystarczy podać nazwę tablicy:
unset fruits
To samo dotyczy tablic asocjacyjnych. Użyj polecenia unset i klucza (zamiast indeksu), aby usunąć dany element.
unset 'capitals[Francja]'
Jeśli chcesz zmodyfikować lub usunąć wiele wartości, użycie pętli for do iteracji po tablicy jest dobrym pomysłem.
Niektóre zaawansowane triki z tablicami
Teraz wiesz, jak deklarować, iterować i manipulować tablicami. Jednak Bash potrafi znacznie więcej. Przyjrzyjmy się kilku zaawansowanym technikom tablic, które mogą uczynić Twoje skrypty mądrzejszymi i łatwiejszymi do utrzymania.
Krojenie
Możesz wydobywać podzbiory tablic, używając składni krojenia.
${array[@]:start:length}Tutaj, start odnosi się do pierwszego elementu w kawałku, a length do liczby elementów, które chcesz zachować w podzbiorze. Pamiętaj, że tablice Bash mają indeksowanie liczone od zera. Przykład:
numbers=(10 20 30 40 50)
echo "${numbers[@]:1:3}"Otrzymaliśmy trzy środkowe elementy, ponieważ zaczęliśmy z indeksu jeden. To jest użyteczne, gdy chcesz przetworzyć część wyników z polecenia.
Kopiowanie i łączenie
Kopiowanie tablicy polega po prostu na przypisaniu elementów tablicy do nowej tablicy.
copy=("${fruits[@]}")Bash kopiuje tablice przez wartość, a nie przez referencję. Więc modyfikacja 'copy' nie wpłynie na oryginał.
Aby połączyć dwie lub więcej tablic w jedną, przekaż ich elementy do nowej tablicy, używając składni ekspansji.
numbers=(1 2 3)
more_numbers=(4 5 6)
combined=("${numbers[@]}" "${more_numbers[@]}")
echo "${combined[@]}"Sortowanie
Sortowanie tablicy oznacza uporządkowanie jej w określonym porządku. Może to być numeryczne lub alfabetyczne (w zależności od typu elementu), rosnące lub malejące. Bash nie ma wbudowanej funkcji sort, ale można to łatwo osiągnąć za pomocą podstawienia poleceń i polecenia sort.
fruits=("banan" "jabłko" "czereśnia" "daktyl")
IFS=$'\n' sorted=($(sort unset IFS
echo "${sorted[@]}"W tym przypadku polecenie sort sortuje elementy alfabetycznie. IFS=$'\n' zapewnia, że elementy zawierające spacje nie zostaną podzielone niewłaściwie. Przechowujemy posortowane wyniki w nowej tablicy.
Podobnie, możemy wykonać sortowanie odwrotne.
IFS=$'\n' sorted=($(sort -r unset IFS
W przypadku danych numerycznych można użyć sort -n.
numbers=(42 5 19 100 3)
IFS=$'\n' sorted_nums=($(sort -n unset IFS
echo "${sorted_nums[@]}"Usuwanie duplikatów
Klasyczny problem. Usuń wszelkie powtarzające się elementy w tablicy, aby wszystkie pozostałe elementy były unikalne. Możemy znów skorzystać z polecenia sort.
numbers=(1 2 2 3 4 3 5)
unique=($(printf "%s\n" "${numbers[@]}" | sort -u))
echo "${unique[@]}"To podejście działa, drukując wszystkie elementy, sortując je i usuwając duplikaty przy pomocy -u. Jednak ta metoda zależy od kolejności. Sortuje Twoją tablicę w tym procesie. Jeśli potrzebujesz zachować oryginalną kolejność, musisz ręcznie iterować i śledzić widziane elementy.
Filtrowanie tablic
Ostatni trik, który chciałbym omówić, to filtrowanie elementów z tablicy. Zrealizujemy to przy użyciu dopasowania wzorców i ekspansji parametrów.
files=("data.txt" "image.png" "notes.txt" "script.sh")
txt_files=()
for f in "${files[@]}"; do
[[ $f == *.txt ]] && txt_files+=("$f")
done
echo "${txt_files[@]}"Ten trik jest prosty, ale potężny podczas obsługi mieszanych list plików lub zbiorów danych.
Dzięki temu powinieneś dobrze zrozumieć, jak używać tablic w Bashu do manipulacji danymi. Pomoże Ci to pisać lepsze skrypty. Możesz zacząć, przeglądając kilka przykładowych skryptów Bash.
Jeśli ciekawią Cię artykuły podobne do Jak pracować z tablicami w skryptach Bash, zajrzyj do kategorii Linux i odkryj jeszcze więcej interesujących treści.
Dodaj komentarz

Możesz być zainteresowany