Pętla for to fundament każdego języka programowania. Umożliwia ona programom wykonywanie iteracji, czyli powtarzanie danego fragmentu kodu, po określonej liczbie elementów.
Przykładowo, chcąc przeanalizować listę lub tablicę złożoną z 'n’ elementów, niezbędne jest wykorzystanie pętli for. Rozważmy prosty przykład:
1 Fioletowy 2 Indygo 3 Niebieski 4 Zielony Tęczowy Stół
Aby móc operować na elementach przedstawionych w powyższej tabeli, czyli przejrzeć je lub wykonać na nich jakieś operacje, konieczne jest zastosowanie pętli for.
Pętla For w Bash
W skryptach bash składnia pętli for prezentuje się następująco:
#!/bin/bash for ZMIENNA in 1 2 3 4 5.....N do AKCJA 1 AKCJA 2 ..... done
Pętla for w Bash jest dość intuicyjna. Pierwsza linia, czyli #!/bin/bash, informuje, że mamy do czynienia ze skryptem bash. ZMIENNA reprezentuje tymczasową zmienną używaną w procesie iteracji. N oznacza maksymalną liczbę powtórzeń pętli. Słowa kluczowe 'do’ i 'done’ odpowiednio inicjują i kończą działanie pętli. Akcje to polecenia, które są wykonywane w obrębie pętli.
Pętlę for w Bash możemy stosować z różnymi rodzajami danych, takimi jak listy, łańcuchy znaków, liczby całkowite i tablice. W dalszej części tego artykułu przedstawimy kilka typowych przykładów użycia pętli for w Bash.
Przykłady te można uruchomić bezpośrednio w terminalu bash, lub zapisać je w pliku, a następnie wywołać za pomocą polecenia 'bash nazwa_pliku.sh’.
Odczytywanie listy statycznej
Weźmy pod uwagę następującą listę: rainbowColorList = Fioletowy, Indygo, Niebieski, Zielony, Żółty, Pomarańczowy, Czerwony
Aby wypisać powyższą listę łańcuchów znaków za pomocą pętli for w Bash, możemy zrobić to w następujący sposób:
#! /bin/sh # Definicja listy rainbowColorList=Fioletowy,Indygo,Niebieski,Zielony,Żółty,Pomarańczowy,Czerwony # Separator przecinkowy za pomocą //,/ for kolory in ${rainbowColorList//,/ } do echo $kolory done
Efektem działania powyższego kodu będzie wyświetlenie listy, gdzie każdy element będzie znajdował się w nowej linii.
#Wynik Fioletowy Indygo Niebieski Zielony Żółty Pomarańczowy Czerwony
Odczytywanie tablicy
Składnia deklarowania tablicy jest odmienna. Należy użyć nawiasów dla każdego z elementów (łańcucha znaków).
rainbowArray=("Fioletowy" "Indygo" "Niebieski" "Zielony" "Żółty" "Pomarańczowy" "Czerwony") for kolory in "${rainbowArray[@]}"; do echo "Lubię $kolory" done
Znak „@” jest wykorzystywany do iteracji po wszystkich elementach tablicy.
#Wynik Lubię Fioletowy Lubię Indygo Lubię Niebieski Lubię Zielony Lubię Żółty Lubię Pomarańczowy Lubię Czerwony
Możemy również użyć pętli for, aby wyświetlić zarówno indeksy, jak i elementy tablicy.
#Drukowanie z indeksem rainbowArray=("Fioletowy" "Indygo" "Niebieski" "Zielony" "Żółty" "Pomarańczowy" "Czerwony") for i in "${!rainbowArray[@]}"; do echo "Kolor na indeksie " $i " : " "${rainbowArray[$i]}" i=$((i+1)); done
#Wynik Kolor na indeksie 0 : Fioletowy Kolor na indeksie 1 : Indygo Kolor na indeksie 2 : Niebieski Kolor na indeksie 3 : Zielony Kolor na indeksie 4 : Żółty Kolor na indeksie 5 : Pomarańczowy Kolor na indeksie 6 : Czerwony
Zauważmy, że używamy ’!’ w pętli, aby uzyskać indeks elementu.
Iterowanie po zakresie liczb
Pętlę for w Bash możemy również wykorzystać do iterowania po określonym zakresie liczb.
#Iterowanie po zakresie liczb echo "Odliczanie rozpoczyna się..." for N in {10..0} do echo "$N" done
’..’ oznacza zakres liczb.
#Wynik 10 9 8 7 6 5 4 3 2 1 0
Możemy także pominąć niektóre liczby z danego zakresu, definiując krok.
W poniższym przykładzie pomijamy liczenie co 3.
#Iterowanie z pomijaniem liczb echo "Odliczanie rozpoczyna się..." for N in {30..0..3} do echo "$N" done
Powyższy program zaczyna od 30 jako pierwszej liczby i odlicza do 0. Ostatni parametr w pętli for, czyli „3”, określa o ile liczb ma być pomijane w każdym kroku.
#Wynik 30 27 24 21 18 15 12 9 6 3 0
Łańcuchy znaków i pojedyncze znaki
Za pomocą pętli for w Bash możemy wykonywać różnorodne interesujące operacje na łańcuchach znaków.
Przykładowo, możemy odczytać każdy znak łańcucha za pomocą operatora 'seq’ wewnątrz pętli for:
#Odczyt znaków łańcucha mojslowo="witaj" for i in $(seq 1 ${#mojslowo}) do echo "${mojslowo:i-1:1}" done
Należy zauważyć, że 'seq’ powinno zaczynać się od 1, aby najpierw otrzymać pierwszy znak.
#Wynik w i t a j
Możemy również wypisać słowa, które są oddzielone spacjami, jedno po drugim:
#Odczyt każdego słowa z zdania mojezdanie="Witamy na newsblog.pl. Centrum dla wszystkich techies" for slowo in $mojezdanie; do echo $slowo done
#Wynik Witamy na newsblog.pl. Centrum dla wszystkich techies
Wyrażenia
Podobnie jak w innych językach programowania, na przykład Java, możemy umieszczać wyrażenia wewnątrz pętli for w Bash.
for (( zmienna=10; zmienna>=0; zmienna-- )) do echo "Odliczanie...$zmienna" done
#Wynik Odliczanie...10 Odliczanie...9 Odliczanie...8 Odliczanie...7 Odliczanie...6 Odliczanie...5 Odliczanie...4 Odliczanie...3 Odliczanie...2 Odliczanie...1 Odliczanie...0
Odczytywanie argumentów z linii poleceń
Aby odczytać argumenty z linii poleceń, wykorzystujemy polecenie 'read’. W poniższym przykładzie pobierzemy od użytkownika kilka liczb, a następnie wypiszemy ich sumę, używając do tego pętli for w Bash. Do przechowywania sumy użyjemy zmiennej 'suma’.
read -a tablica -p "Wprowadź liczby, które chcesz dodać:" suma=0 for i in ${tablica[@]}; do let suma+=$i done echo "Suma liczb wynosi: $suma"
Oto przykładowy wynik:
#Wynik Wprowadź liczby, które chcesz dodać: 3 4 66 Suma liczb wynosi: 73
Znajdowanie liczb nieparzystych i parzystych
Aby znaleźć liczby nieparzyste i parzyste w zakresie od 1 do 10 (lub dowolnej liczby N), powinniśmy użyć warunku if w połączeniu z pętlą for w Bash. Aby określić, czy liczba jest parzysta, podzielimy ją przez 2, a jeśli reszta z dzielenia wynosi 0, zaklasyfikujemy ją jako parzystą, w przeciwnym wypadku – jako nieparzystą.
#Deklaracja list, w których zostaną umieszczone liczby parzyste i nieparzyste parzyste="" nieparzyste="" for (( i=1; i<=10; i++ )) do reszta=$(( $i % 2 )) if [ $reszta -eq 0 ]; then parzyste="$parzyste $i " else nieparzyste="$nieparzyste $i " fi done echo "Liczby parzyste to: "$parzyste echo "Liczby nieparzyste to: "$nieparzyste
Zauważmy, że w powyższym przykładzie podajemy zakres jako 10. Możemy zmienić tę liczbę, aby uzyskać liczby parzyste i nieparzyste z dowolnego zakresu. Możemy także spróbować odczytać liczbę od użytkownika za pomocą polecenia „read”, które poznaliśmy w poprzedniej sekcji.
#Wynik Liczby parzyste to: 2 4 6 8 10 Liczby nieparzyste to: 1 3 5 7 9
Pętla nieskończona
Pętla nieskończona, czyli taka która nigdy się nie kończy, wymaga zatrzymania programu za pomocą Ctrl+C. Taką pętlę możemy łatwo stworzyć, używając ’; ;’ operatora wewnątrz pętli for:
for (( ; ; )) do echo "Witamy na newsblog.pl" done
#Wynik Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl Witamy na newsblog.pl ^C $
Instrukcja przerywająca (break)
Instrukcja break służy do natychmiastowego zakończenia pętli, gdy spełniony jest określony warunek.
for kolor in Fioletowy Indygo Niebieski Zielony Żółty Pomarańczowy Czerwony do if [[ "$kolor" == 'Zielony' ]]; then break fi echo "Szukam koloru Zielony, aktualny kolor to $kolor" done echo "Znalazłem mój kolor $kolor"
W tym przykładzie szukamy koloru zielonego. Pętla for przegląda kolejne kolory i po napotkaniu koloru zielonego program wychodzi z pętli dzięki instrukcji break.
#Wynik Szukam koloru Zielony, aktualny kolor to Fioletowy Szukam koloru Zielony, aktualny kolor to Indygo Szukam koloru Zielony, aktualny kolor to Niebieski Znalazłem mój kolor Zielony
Instrukcja kontynuująca (continue)
Instrukcja continue służy do pominięcia aktualnej iteracji pętli i przejścia do następnej, na podstawie zdefiniowanego warunku. Przykładowo, jeśli nie chcemy drukować koloru 'Zielony’ z naszego poprzedniego programu, możemy użyć instrukcji continue, a wszystkie inne kolory, z wyjątkiem zielonego, zostaną wyświetlone.
for kolor in Fioletowy Indygo Niebieski Zielony Żółty Pomarańczowy Czerwony do if [[ "$kolor" == 'Zielony' ]]; then continue fi echo "$kolor" done
#Wynik Fioletowy Indygo Niebieski Żółty Pomarańczowy Czerwony
Podsumowanie
Omówiliśmy najczęstsze zastosowania pętli for w Bash, wykorzystując łańcuchy znaków, liczby całkowite, tablice i listy. Jeśli uczysz się systemu Linux, a posiadasz komputer z systemem Windows 10, możesz skorzystać z funkcji WSL i zainstalować system Linux na komputerze z systemem Windows.
Następnie możesz używać terminala Linux w sposób zbliżony do CMD.
Dodatkowo, możesz sprawdzić, jak uruchamiać skrypty bash za pomocą Pythona.
newsblog.pl