[KURS] Programowanie w powłoce #4 – pętle

[KURS] Programowanie w powłoce #4 - pętle

Czwarta część serii artykułów Programowanie w powłoce zostanie poświęcona pętlom.
Pętle służą do wielokrotnego wykonywania tego samego fragmentu kodu. W Bashu rozróżniamy następujące pętle:

  • for,
  • select,
  • while,
  • until.

Jednak zanim przejdę do opisu poszczególnych pętli, przedstawię dwa polecenia, które przydatne są w działaniu z pętlami – break oraz continue.

Break

Polecenie break przerywa wykonywanie całej pętli tzn. jeśli w trakcie wykonywania pętli napotkana zostanie owa instrukcja, działanie pętli zostaje zakończone i następuje przejście do dalszej części kodu.

Continue

Polecenie continue przerywa wykonywanie aktualnego obiegu pętli tzn. jeśli w trakcie wykonywania pętli napotkana zostanie owa instrukcja, dalsza część kodu nie zostanie wykonana, natomiast rozpocznie się kolejny obieg pętli (o ile obecny nie był ostatnim).

Warto dobrze zapamiętać obie instrukcje i znać różnice między nimi. A teraz do sedna…

Pętla for

Pętla for działa w ten sposób, że dla każdy element ze zbioru wartości przypisuje do zmiennej i wykonuje instrukcje zawarte wewnątrz pętli.

Struktura:

for zmienna in zbiór_wartości
do
  instrukcje
done

Przykład:

#!/bin/bash

for x in 1 -5 3.14 a Ania
do
  echo "$x"
done

exit 0

Jak widać – elementem zbioru wartości może być dowolna wartość (liczba całkowita, rzeczywista, znak, napis).
Rezultat:

1
-5
3.14
a
Ania

Pętla for jest bardzo przydatna w sytuacjach, gdy chcemy wykonać jakąś operację na wszystkich plikach w danym katalogu. Na przykład chcemy uzyskać listę wszystkich plików o danym rozszerzeniu znajdujących się w jakimś katalogu, robimy to tak:

#!/bin/bash

for x in *html
do
  echo "To jest plik $x"
done

exit 0

Inna struktura pętli for:

for(( warunek początkowy; warunek końcowy; operacje))
do
  lista instrukcji
done

Przykład:

#!/bin/bash

for(( i=1; i<=20; i++))
do
echo "$i"
done

exit 0

Pętla select

Pętla select (jak sama nazwa wskazuje), będzie służyć do pewnego rodzaju wyboru. Zbiór wartości pętli jest wyświetlany na standardowym wyjściu, każdą pozycję poprzedza numer. Wyświetlany jest następnie znak zachęty systemu i powłoka oczekuje na wprowadzenie numeru. Jeśli wprowadzimy poprawny numer zmienna z polecenia otrzyma wartość odpowiadającą temu numerowi, jeśli nie jest to numer, bądź numer jest błędny zmienna ta otrzyma wartość NULL. Następnie wykonywane są instrukcje wewnątrz bloku. Potem wszystko zaczyna się od początku. Aby wyjść z pętli należy wśród instrukcji wstawić polecenie break lub return lub też wprowadzić znak EOF.

Brzmi to trochę niejasno, ale struktura i przykład powinny wszystko rozwiać:

select zmienna in zbiór_wartości
do
  instrukcje
done

Przykład:

#!/bin/bash

echo "Co wybierasz?"

select y in X Y Z Quit
do
  case $y in
    "X") echo "Wybrałeś X" ;;
    "Y") echo "Wybrałeś Y" ;;
    "Z") echo "Wybrałeś Z" ;;
    "Quit") exit ;;
    *) echo "Nic nie wybrałeś"
  esac
break
done

exit 0

Zmienna y przyjmuje kolejne wartości ze zbioru wartości (X, Y, Z, Quit). Następuje wypisanie menu w postaci:

Co wybierasz?
1) X
2) Y
3) Z
4) Quit

A następnie znak zachęty:

#?

Teraz pętla czeka na nasz ruch. Wybieramy jedną z pozycji (1,2,3,4) i wciskamy Enter. W zależności od wyboru zostanie wyświetlony stosowny komunikat:

Co wybierasz?
1) X
2) Y
3) Z
4) Quit
#? 3
Wybrałeś Z

Jeśli z powyższego kodu usuniemy instrukcję break pętla wykona się kolejny raz (i kolejny – do momentu wybrania 4 (Quit) lub opcji z poza zakresu).

Pętla while

Pętla while najpierw sprawdza czy prawdziwy jest warunek. Jeśli tak to wykonane zostanie polecenie lub lista poleceń zawartych wewnątrz pętli, gdy warunek stanie się fałszywy pętla zostanie zakończona.
Uwaga! Zwróć uwagę na zapis pętli – spacje są istotne!

Struktura:

while warunek
do
  polecenie
done

Przykład:

#!/bin/bash

echo -n "Podaj swoje imie: "
read imie
echo -n "Ile razy je wypisac? "
read ile
i=1

while [ "$i" -le "$ile" ]
do
echo "$imie"
i=$[i+1]
done

exit 0
Zwróć uwagę na sposób inkrementacji zmiennej i! Istnieje jeszcze możliwość takiej inkrementacji: i=$(($i+1)), ale jest to sposób nieco trudniejszy.

Przyjmijmy, że ile=20. Z każdym obiegiem pętli (również przed jej wykonaniem) sprawdzany jest warunek – w tym wypadku czy i

Pętla until

Pętla until działa przeciwnie do pętli while. Najpierw sprawdza czy warunek jest prawdziwy, gdy jest fałszywy wykonywane jest polecenie lub lista poleceń. Pętla until kończy swoje działanie w momencie gdy warunek stanie się prawdziwy.

Struktura:

until warunek
do
  polecenie
done

Przykład: (analogicznie do poprzedniego zadania)

#!/bin/bash

echo -n "Podaj swoje imie: "
read imie
echo -n "Ile razy je wypisac? "
read ile
i=1

until [ "$ile" -le "$i" ]
do
echo "$imie"
i=$[i+1] 
done

exit 0

Tym razem sprawdzany jest warunek ile < i (poprzednio i < ile). Warunek jest fałszywy, więc następuje wykonanie instrukcji (wypisania imienia na ekran). Gdy warunek zostaje spełniony, wykonywanie pętli zostaje przerwane.

To tyle na dziś. W następnym artykule zajmę się potokami.

Jeżeli powyższy artykuł nie rozwiązał lub rozwiązał częściowo Twój problem, dodaj swój komentarz opisujący, w którym miejscu napotkałeś trudności.
Mile widziane komentarze z uwagami lub informacjami o rozwiązaniu problemu.