Lekcja 10
Programowanie w shellu cz.2
Celem zajęć jest zapoznanie słuchaczy z realizacją komend warunkowych.
Instrukcja warunkowa
Wszystkie języki programowania oferują sposoby podejmowania decyzji, czyli wykonywania kodu programu w zależności od spełnienia określonego warunku. Wszystkie shelle unixa umożliwiają sterowanie wykonaniem kodu poprzez instrukcję IF - THEN - ELSE - FI. Graficznie komendę if można przedstawić następująco:
Jeżeli warunek jest spełniony wykonywane jest polecenie1, w przeciwnym przypadku polecenie2. Do zapisu i sprawdzania warunków najczęściej wykorzystuje się poznaną na poprzedniej lekcji komendę test.
Najprostsza postać komendy fi ma następującą składnię:
if warunek
then
lista poleceń
fi
Jeżeli warunek jest prawdą wykonywane są polecenia z listy.
Najczęściej komendę if stosuje się z alternatywną listą poleceń, które są wykonywane w przypadku nie spełnienia podanego warunku. Ta postać komendy if ma następującą składnię:
if warunek
then
lista poleceń 1
else
lista poleceń 2
fi
Jeżeli warunek jest prawdą wykonywane są polecenia z listy1, jeżeli jest fałszem wykonywane są polecenia z listy2.
Najbardziej rozbudowana składnia instrukcji if wygląda następująco:
if warunek 1
then
lista poleceń 1
elif warunek 2
then
lista poleceń 2
else
lista poleceń 3
fi
Jeżeli warunek1 jest prawdą wykonywane są polecenia z listy1, jeżeli jest fałszem sprawdzany jest warunek2. Jeżeli jest on prawdą wykonywane są polecenia z listy2, jeżeli jest fałszem wykonywane są polecenia z listy3.
Komenda if jest przydatna przy podejmowaniu decyzji dwukierunkowych i decyzji zagłębionych do jednego poziomu. Jeżeli sprawdzany warunek może przyjmować wiele wartości sprawdzanie ich komendą if staje się mało czytelne.
2. Instrukcja wyboru
Jeżeli chcemy dać użytkownikowi możliwość wyboru ze zbioru opcji i w zależności od dokonanego wyboru wykonać określone polecenia, to wygodnym sposobem realizacji tego celu daje komenda case. Graficznie komendę case można przedstawić następująco:
Jeżeli zmienna przyjmie wartość w1 wówczas wykonywane jest polecenie1, jeżeli przyjmie wartość w2 wykonywane jest poleceni2 itd. Jeżeli zmienna nie przyjmie żadnej z określonych wartości wówczas wykonywane jest polecenie*.
Składnia komendy case wygląda następująco:
case $zmienna in
wartość1)
lista poleceń1;;
wartość2)
lista poleceń2;;
wartość3|wartość4...)
lista poleceń3;;
:
:
*)
lista poleceń*;;
esac
Jeżeli zmienna przyjmie wartość1 wykonane zostaną polecenia z listy1, jeżeli zmienna przyjmie wartość2 zostaną wykonane polecenia z listy2. W przypadku gdy zmienna przyjmie wartość3 lub wartość4 wykonane zostaną polecenia z listy3. Gdy zmienna przyjmie wartość różną od wymienionych (wartość1,2,3,4) wykonane zostaną polecenia z listy*.
3. Zakończenie pracy skryptu
Kiedy skrypt napotka koniec swojego pliku kończy działanie. Do shella zwracany jest kod zakończenia ostatniego wykonanego polecenia. Jeżeli chcemy w sposób jawny przekazać do shella kod powrotu z całego skryptu musimy skorzystać z polecenia exit. Jeżeli skrypt zakończy swą pracę poprawnie wówczas przypisujemy do kodu powrotu wartość zero (exit 0). Jeżeli musimy zakończyć skrypt z powodu błędu wówczas kod powrotu powinien mieć wartość różną od zera, na przykład jeden (exit 1). W ten sposób możemy przekazać informacje na temat zakończenia pracy skryptu i wykorzystać ją w innym skrypcie.
Lista komend
if - instrukcja warunkowa
if warunek 1
then
lista poleceń 1
elif warunek 2
then
lista poleceń 2
else
lista poleceń 3
fi
Jeżeli warunek1 jest prawdą wykonywane są polecenia z listy1, jeżeli jest fałszem sprawdzany jest warunek2. Jeżeli jest on prawdą wykonywane są polecenia z listy2, jeżeli jest fałszem wykonywane są polecenia z listy3. Części elif i case są opcjonalne i nie muszą występować w poleceniu.
case - instrukcja wyboru
case wyrażenie in
wzorzec_1| wzorzec_2...)
lista poleceń1;;
:
:
wzorzec_i|wzorzec_j...)
lista poleceń3;;
*)
lista poleceń*;;
esac
Jeżeli wyrażenie pasuje do wzorca_1 lub wzorca_2 lub innych podanych w tej samej linii, wykonane zostaną polecenia z listy1. Jeżeli wyrażenie nie pasuje do tych wzorców sprawdzane są następne aż do ostatnich wartości wzorzec_i lub wzorzec_j. Gdy wyrażenie przyjmie wartość różną od wymienionych wzorców (1,2...i,j) wykonane zostaną polecenia z listy*.
Ćwiczenia
Nawiąż połączenie z serwerem solaris.wlodkowic.pl i zaloguj się swoim nazwiskiem i hasłem. System powinien wyświetlić znak zgłoszenia shella Korna - $.
Wykonaj zadania z bieżącej lekcji:
Napisz skrypt „wybor”, który umożliwia wykonanie na wybranym pliku trzech operacji: kompresję, wyświetlenie dostępnych informacji oraz skasowanie.
Kolejność poleceń w skrypcie:
wyczyszczenie ekranu,
wyświetlenie menu zawierającego trzy opcje:
1) kompresja pliku
2) wyświetlenie informacji
3) skasowanie pliku
wczytanie wyboru użytkownika,
wczytanie nazwy pliku,
sprawdzenie czy taki plik istnieje, jeżeli nie wyświetlenie odpowiedniego komunikatu i zakończenie pracy skryptu,
w zależności od dokonanego wyboru przez użytkownika wykonanie odpowiedniej operacji na wskazanym pliku,
wyświetlenie właściwego komunikatu w przypadku wyboru niedozwolonej opcji.
rozwiązanie tylko w wersji on-line
Napisz skrypt „znak”, który sprawdza czy podana przez użytkownika jako parametr wywołania skryptu liczba jest większa, mniejsza czy równa zero.
Kolejność poleceń w skrypcie:
wyczyszczenie ekranu
sprawdzenie czy użytkownik podał parametr podczas wywołania skryptu, jeżeli nie - wyświetlenie zachęty do wpisania liczby i wczytanie jej,
sprawdzenie czy wprowadzony parametr nie jest pusty (gdy użytkownik naciśnie Enter bez podania liczby), jeżeli tak - wyświetlenie odpowiedniego komunikatu i zakończenie skryptu,
sprawdzenie czy podany parametr jest liczbą, a nie literą czy innym znakiem graficznym, jeżeli nie - wyświetlenie odpowiedniego komunikatu i zakończenie skryptu,
sprawdzenie czy podana liczba jest większa od zera, mniejsza od zera czy równa zero i wyświetlenie właściwego komunikatu.
rozwiązanie tylko w wersji on-line