Instrukcja IF-ELSE

Sprawdza czy warunek jest prawdziwy, jeśli tak to wykonane zostanie polecenie lub polecenia znajdujące się po słowie kluczowym then. Instrukcja kończy się słowem fi.

Samo polecenie if sprawdza tylko czy wynik polecenia jakie wstawiamy to true (w bash to 0) lub false (w bash to wszystko różne 0). Za dokonania sprawdzenia warunków odpowiadają polecenia test lub polecenie [.

Składnia if/else

if <warunek> ; then
    polecenia1
else
    polecenia2
fi
if <warunek> ; then
   polecenia1
fi

Podpowiedź

Część else jest opcjonalna. Jezeli jej nie będzie i warunek w instrukcji if przyjmie wartość false to instrukcje będące wewnątrz bloku if (polecenia1) nie zostaną wykonane.

Przykład użycia

#!/bin/bash
if [ -e ~/.bashrc ] ; then
  echo "Masz plik .bashrc"
fi

Powyższy plik ma za zadanie sprawdzić, czy w katalogu uzytkownika znajduje się plik .bashrc jeżeli tak ma wypisać tą informację.

  • Najpierw sprawdzany jest warunek czy istnieje w twoim katalogu domowym plik .bashrc, zapis ~/ oznacza to samo co /home/twój_login lub $HOME.
  • Jeśli sprawdzany warunek jest prawdziwy to wyświetlony zostanie napis Masz plik .bashrc.
  • W przeciwnym wypadku nic się nie stanie.

W sytuacji gdy test warunku zakończy się wynikiem negatywnym można wykonać inny zestaw poleceń, które umiesczamy po słowie kluczowym else.

#!/bin/bash
if [ -e ~/.bashrc ]
then
  echo "Masz plik.bashrc"
else
  echo "Nie masz pliku .bashrc"
fi

Gdy użytkownik nie będzie miał w katalogu pliku .bashrc to skrypt wypisze komunikat Nie masz pliku .bashrc.

Składnia if/elif/else

W Bashu nie jesteśmy ograniczeni do testowania jednego warunku, język ten pozwala testować dowolną ilość warunków np.

  • jeśli pierwszy warunek nie będzie prawdziwy, sprawdzony zostanie drugi,
  • jeśli drugi warunek nie będzie prawdziwy, sprawdzony zostanie trzeci,
  • jeśli trzeci warunek nie będzie prawdziwy, sprawdzony zostanie czwarty,
  • itd.

Kolejne testy warunków umieszczamy po słowie kluczowym elif jeżeli wszystkie warunki elif zostaną sprawdzone i żaden z nich nie będzie prawdziwy skrypt wykona blok else - zgodnie z przykładem poniżej.

if <warunek> ; then
    polecenia
elif <warunek> ; then
    polecenia_2
else
    polecenia_3
fi

Przykład użycia

#!/bin/bash
if [ -x /opt/kde/bin/startkde ] ; then
   echo "Masz KDE w katalogu /opt"
elif [ -x /usr/bin/startkde ] ; then
  echo "Masz KDE w katalogu /usr"
elif [ -x /usr/local/bin/startkde ] ; then
  echo "Masz KDE w katalogu /usr/local"
else
  echo "Nie wiem gdzie masz KDE"
fi

Ten skrypt sprawdza gdzie jest zainstalowane środowisko graficzne KDE, sprawdzane są trzy warunki,

  • najpierw czy plik wykonywalny startkde znajduje się w katalogu /opt/kde/bin
  • jeśli go tam nie ma, szukany jest w katalogu /usr/bin,
  • gdy i tam nie występuje sprawdzany jest katalog /usr/local/bin.
  • w przypadku kiedy wszystkie trzy sprawdzenia okazały sie błędne skrypt wypisze informację Nie wiem gdzie masz KDE

Podpowiedź

Często do sprawdzania wielu wykluczających się warunków wykorzystuje się polecenie case, które jest trochę bardziej czytelne.

AND - łączenie warunków i poleceń w listy

Składnia

instrukcja1 && instrukcja2 && instrukcja3 && instrukcja4 ...

Wykonywane są instrukcje po kolei aż do momentu określenia wyniku całości wyrażenia, np. instrukcja1 zwróci FALSE, to instrukcja2 się już nie wykona - ponieważ całość wyrażenia przyjmie wartość FALSE (zobacz Algebrę Boola).

Aby otrzymać TRUE, wszystkie spośród instrukcji muszą zwrócić TRUE, w tym wypadku wszystkie one zostaną wykonane poprawnie (zwrócą 0).

Zamiast instrukcji może wystąpić dowolne wyrażenie, wtedy zamiast wykonywania instrukcji zostanie obliczona wartość tego wyrażenia. Całość można traktować jako ciąg iloczynów logicznych przetwarzany od lewej do prawej, w którym instrukcje są wykonywane dopóki wartość wyrażenia nie jest określona.

OR - łączenie warunków i poleceń w listy

Składnia

instrukcja1 || instrukcja2 || instrukcja3 || instrukcja4 ...

Analogicznie jak w przypadku listy AND instrukcje są wykonywane do momentu określenia całości wyrażenia, tylko w tym przypadku jest odwrotnie, mianowicie jeśli dowolna z instrukcji przyjmie wartość TRUE, to wartość wyrażenia będzie określona jako TRUE i dalsze instrukcje się nie wykonają.

Zwrócenie przez instrukcję FALSE powoduje dalsze przetwarzanie wyrażenia. Aby otrzymać FALSE, wszystkie instrukcje muszą zwrócić FALSE.

Podpowiedź

Wyrażenie można traktować jako ciąg sum logicznych. Można łączyć ze sobą listy AND i OR, by uzyskać bardziej skomplikowane warunki. Operatory && i || mają taki sam priorytet.

Ostrzeżenie

Całość wyrażenia jest wykonywana sekwencyjnie od lewej do prawej, jeśli chcemy to zmienić można użyć nawiasów zwykłych.