sop 2009 lab07


Uniwersytet w Białymstoku
Wydział Matematyki i Informatyki
Instytut Informatyki
Materiały bazowe do zajęć z przedmiotu:
Systemy operacyjne
Laboratorium nr 07
Temat:
Argumenty wywołania, interakcja skryptów, instrukcje warunkowe if-then-else
mgr Adam Bonda
Białystok 2008
Cel laboratorium: Zapoznanie się z budową skryptów powłoki bash. Określanie
interpretera składni skryptu i cel jego u\ycia. Poznanie kodów wyjścia zwracanych
przez polecenia, oraz tworzonych argumentów wywołania w tym zmiennych
specjalnych. Komenda strukturalna konstrukcji warunkowej if-then-else z
wykorzystaniem polecenia test i interakcja z u\ytkownikiem.
Operacje na potokach i przekierowania wejścia-wyjścia w połączeniu z ró\nymi
poleceniami dają du\e mo\liwości. Nie są on jednak zbyt elastyczne, by tworzyć
zaawansowane bloki instrukcji budowane w oparciu o małe fragmenty, które
przedstawione były do tej pory w ramach zajęciach laboratoryjnych. Aby w obrębie
jednego bloku instrukcji połączyć funkcjonalność i wzajemną interakcje wielu poleceń
nale\y umieścić to wszystko w skrypcie.
Ogólne zało\enia stosowania skryptów są zbli\one do plików wsadowych znanych w
innych środowiskach. Mają one za zadanie kontrolowanie działanie programów. Ze
względu jednak na mo\liwość zastosowania zmiennych, instrukcji warunkowych, pętli, jak i
wielu innych składników dają du\o większe mo\liwości np.: zapewniają bezpośrednią
komunikację z jądrem systemowym przy u\yciu funkcji systemowych.
Systemy UNIX-owe cechuje mnogość występowania języków skryptowych. Ka\da z
powłok (bash, sh, tcsh, ksh) zapewnia taką mo\liwość, nie wspominając ju\ o
wyspecjalizowanych językach skryptowych jak perl, tcl/tk, pyhton, czy php.
Skrypt jest plikiem tekstowym zawierającym polecenia, które wykonywane są podczas
jego pracy. Jego działanie mo\e być zbli\one do działania programu z tą jednak ró\nicą,
\e skryptu nie poddaje się kompilacji, a zawarte w nim instrukcje wykonywane są linia po
linii (chyba, \e w wyniku zastosowania odpowiedniej składni interpreter przeskakuje do
wskazanych części skryptu).
Rozpoczynając pisanie skryptu, dobrze jest poinformować powłokę, jaki program
zinterpretuje nasz kod. Zastosowanie sekwencji #!program, jako pierwszej linii, określa
właśnie ten wybór. Wprawdzie znak # oznacza komentarz, ale zastosowany w powy\szej
konstrukcji nie wpływa na zignorowanie tej linii przez interpreter, a powoduje u\ycie
programu: program do wykonania skryptu.
Tak więc jeśli u\ywanym do interpretacji programem będzie np.: bash, to pierwsza linia
skryptu powinna być postaci: #!/bin/bash.
Jest to o tyle istotne, \e czasem zachodzi potrzeba przekazania interpreterowi
dodatkowego parametru. Na przykład wywołanie bash'a z parametrem -x spowoduje
wyświetlanie ka\dej linii skryptu w miarę jego wykonywania.
Pierwszy skrypt
Pierwszy skrypt zwróci ogólnie znaną frazę:  Hello World!
Tworzymy plik o nazwie skrypt01.sh (np. edytorem vi, lub mcedit) i umieszczamy
w nim:
cat skrypt01.sh
#!/bin/bash
echo "Hello World!"
Rozszerzenie .sh jest standardowym u\ywanym dla skryptów pisanych w bash'u. Dla tak
prostego skryptu w którym nie wykorzystuje się ani tablic, ani funkcji, ani nawet operacji
arytmetycznych, mo\liwe jest wskazanie programu sh zamiast bash do wykonanie tego
zestawu instrukcji. Ze względu jednak na to, \e bash jest rozszerzeniem powłoki sh
wszystko co  umie zinterpretować sh, zostanie równie poprawnie zinterpretowane przez
bash'a.
Nale\y pamiętać, \e aby mo\liwym było uruchomienie (wykonanie) pliku, musi on mieć
odpowiednie prawa. Ponadto uruchomienie skryptu jest to\same z wywołaniem polecenia.
Aby System  znał uruchamiane polecenia i mógł je wywołać, muszą one znajdować się w
jednej ze znanych mu lokalizacji. Zmienna środowiskową PATH pełni właśnie tą funkcję.
Dlatego wywołanie skryptu będzie mo\liwe, gdy jego nazwa będzie znana systemowi, a
spełnione to będzie w trzech przypadkach:
ą gdy podamy bezwzględną ście\kę i nazwę skryptu (dość ucią\liwa metoda)
ą dopiszemy lokalizację skryptu do zmiennej PATH (je\eli umieszczamy pliki w wielu
katalogach to będzie to równie\ czasochłonne rozwiązanie)
ą skorzystamy z symbolu katalogu bie\ącego ściśle wią\ącego nazwę
wywoływanego skryptu
Argumenty skryptów
Podczas uruchamiania skryptów powłoki, zmiennym o nazwach [0-9] nadawane są
wartości odpowiadające kolejnym argumentom z jakimi wywołany został skrypt.
Warto zwrócić fakt na zmienne specjalne powłoki bash przedstawione w tabeli poni\ej:
Zmienne specjalne powłoki bash
# Przechowuje liczbę parametrów przekazanych podczas wywołania skryptu.
@ Przechowuje wszystkie parametry przekazanych podczas wywołania skryptu (je\eli
argumenty zawierają spacje nale\y skorzystać ze znaków podwójnego cytowania.
? Przechowuje kod wyjścia zwrócony przez ostatni zakończony proces pierwszego
planu.
! Przechowuje kod wyjścia zwrócony przez ostatni zakończony proces tła.
$ Przechowuje numer procesu powłoki.
0 Zwraca nazwę wywoływanego polecenia.
* Przechowuje wszystkie parametry przekazanych podczas wywołania skryptu. Je\eli
zmienna otoczona zostanie podwójnymi znakami cytowania to pomiędzy argumenty
wstawiony zostanie znak zdefiniowany przez zmienną środowiskową IFS.
Polecenie shift [n] słu\y do usuwania argumentów według zadanej wartości [n].
$ cat skrypt02.sh
#!/bin/bash
echo "uruchomiłes '${0##*/}'"
echo "skrypt wywołano z $# argumentami"
echo "ich wartości to: '$1', '$2', '$3', '$4', '$5'"
echo "polecenie shift usunie teraz 3 pierwsze zmienne"
echo shift 3
shift 3
echo "skrypt wywołano z '$#' argumentami"
echo "ich wartości to: '$1', '$2', '$3', '$4', '$5'"
A oto przykład działania skryptu korzystającego z argumentów wywołania:
$ ./1.sh 1 2 3 "A to jest czwarta" 5
uruchomiłes '1.sh'
skrypt wywołano z 5 argumentami
ich wartości to: '1', '2', '3', 'A to jest czwarta', '5'
polecenie shift usunie teraz 3 pierwsze zmienne
shift 3
skrypt wywołano z '2' argumentami
ich wartości to: 'A to jest czwarta', '5', '', '', ''
Interakcja
Niekiedy w trakcie wykonywania skryptu istnieje potrzeba pobrania dodatkowych
informacji od u\ytkownika (ze standardowego wejścia), np.: podczas instalacji
oprogramowania skrypt mo\e zapytać gdzie umieścić pliki programu. Słu\y do tego
polecenie read.
Wywołane bez argumentu polecenie read wczytuje ze standardowego wejścia jedną linię i
przypisuje to zmiennej REPLY.
$ cat skrypt03.sh
#!/bin/bash
read
echo '$REPLY'
Jeśli podamy argument read, to potraktowane zostanie to jako nazwa zmiennej i to jej
zostanie przypisana wartość.
$ cat skrypt04.sh
#!/bin/bash
read var1
echo '$var1'
Jeśli podanych zostanie więcej argumentów (odseparowanych spacjami) ni\ oczekuje
tego polecenie read, to kolejne słowa przypisane zostaną odpowiednim zmiennym, a
ostatniej zmiennej przypisana zostanie reszta wartości
$ cat skrypt05.sh
#!/bin/bash
read var1 var var3 var4
echo '$var1', '$var', '$var3', '$var4'
Kody błędów zgłaszanych przez Linux'a przy wyjściu z polecenia (zmienna $?
przechowuje wartość wyjścia z ostatnio wywołanej komendy)
Kod błedu opis
0 Komenda zakończona sukcesem
1 Nieznany błąd zakończenia polecenia
2 Niewłaściwie u\yte polecenie
126 Komendy nie mo\na wykonać
127 Komenda nieznana
128 Nieprawidłowy argument wyjścia
128+x Powa\ny błąd pochodzący z sygnału x
130 Komenda przerwana przy u\yciu CTRL+C
255 Kod wyjścia spoza zakresu

Komendy strukturalne
Wiele problemów, z jakimi spotyka się piszący skrypty wią\e się zastosowaniem w
nich pewnej logiki kontrolującej działanie poleceń z poziomu skryptu. Oznacza to,
\e powłoka wykonuje określone polecenia przy zadanych warunkach, bądz jest w
stanie wykonać zupełnie inne instrukcje, jeśli dane warunki nie są spełnione.
Istnieje całą klasa poleceń pozwalających skryptowi do pomijania, lub zapętlania
komend w oparciu sprawdzaną wartość zmiennych, czy w zale\ność od wyników
innych programów.
Polecenia te określane są mianem komend komend strukturalnych.
Instrukcje warunkowe if-then
Najbardziej powszechną komendą strukturalną jest konstrukcja if-then. Format the
polecenia jest następujący:
if komenda
then
komendy
fi
Konstrukcja if wywołuje polecenie zdefiniowane po niej. Jeśli kod wyjścia tego polecenia
(patrz tabela wy\ej) jest równy zero (polecenie zakończone sukcesem  true) komenda,
bądz ciąg komend zawartych w sekcji then jest wykonywany. Je\eli natomiast kod wyjścia
polecenia jest ró\ny od zera, wtedy \adna z komend nie zostanie wykonana, a powłoka
bash przejdzie do wykonywania kolejnego polecenia skryptu.
$ cat if_skrypt01.sh
#!/bin/bash
# testowanie konstrukcji if
if date
then
echo "działa!!!"
fi
Shell wywołuje polecenie date określone po if. Komenda date zwraca aktualną datę,
kończy się sukcesem, co warunkuje wykonaniem konstrukcji then, a więc wypisaniem
ciągu tekstowego.
$ cat if_skrypt02.sh
#!/bin/bash
# testowanie nieistniejącego polecenia
if blablabla
then
echo "polecenie istnieje i zwrócona została wartość true"
fi
echo "konstrukcja if zakończyła działanie, cos jest nie tak z poleceniem"
$ ./if_skrypt02.sh
./if_skrypt02.sh: line 3: blablabla: command not found
konstrukcja if zakończyła działanie, cos jest nie tak z poleceniem
$
Wywołanie nieistniejącej komendy zwraca wartość kodu wywołania ró\ną od zera.
Warunek nie jest spełniony, a blok komend sekcji then nie jest wykonywany. Powłoka
wychodzi ze struktury warunkowej if i wykonuje kolejną część kodu.
Instrukcje warunkowe if-then-else
Konstrukcja if-then u\ywa się uwzględniając tylko jedną opcje  true, wszystkie
pozostałe przypadki nie oznaczają true i nie są interesujące z punktu widzenia logiki
problemu. Je\eli nie spełniony jest warunek if powłoka pomija sekcję then i przechodzi
do dalszej części skryptu. Tutaj właśnie pojawia się odpowiednie miejsce dla konstrukcji
if-then-else, poniewa\ mo\na za\ądać wykonania alternatywnego zestawu instrukcji,
jeśli warunek if nie spełnił oczekiwań skryptu.
Konstrukcja składni if-then-else jest następująca:
if komenda
then
komendy
else
komendy
fi
Je\eli komenda w linii z if zwróci wartość kodu wyjścia równą zero, to podobnie jak w
przypadku wcześniejszym, wykonany zostanie zestaw komend sekcji then, w pozostałych
przypadkach wykonane zostaną polecenia zawarte w sekcji else.
Instrukcje warunkowe elif
Niekiedy nale\y sprawdzić i wykonać odpowiednie działanie dla kilku wartości. Dlatego
zamiast stosowania rozłącznej instrukcji if-then stosuje się alternatywną wersję sekcji
else, elif.
Konstrukcja elif kontynuuje sekcje else z kolejnym warunkiem if-then:
if komenda1
then
komendy
elif komenda2
then
więcej komend
fi
Podobnie do konstrukcji if, elif umo\liwia wykonanie kolejnej komendy. Je\eli kod
wyjścia z elif jest równy zero, powłoka bash wykona komendy z drugiej sekcji then.
Mo\liwe jest więc łączenie konstrukcji elif i tworzenie du\ych bloków if-then-elif:
if komenda1
then
zestaw_komend1
elif komenda2
then
zestaw_komend2
elif komenda3
then
zestaw_komend3
elif komenda4
then
zestaw_komend4
fi
Ka\dy zestaw komend jest wykonywane, zale\nie od tego, która komenda zwróci wartość
zero kodu wyjścia. Nale\y te\ pamiętać, ze powłoka bash wykonuje instrukcje warunkowe
w ustalonym porządku i gdy tylko któryś z warunków zwróci wartość true, sekcja then
zostawanie wykonana.
Komenda test cd.
Na poprzednich zajęciach omówione zostało działanie komendy test. Wiemy ju\, \e
zarówno konstrukcja if-then, jak i test mają podobne działanie. Zasadnicza ró\nica
pomiędzy nimi jest taka, \e if jest wbudowaną funkcją basha, natomiast test jest
zewnętrzną aplikacją. Ponadto konstrukcji if-then u\ywa się tylko do sprawdzania
wartości kodów wyjścia co znacznie zawę\a działanie. Jednak w połączeniu z programem
test, jej zastosowanie jest du\o szersze.
Polecenie test u\yte w konstrukcji if-then umo\liwia sprawdzanie pod wieloma
względami ró\nych warunków. Je\eli polecenie test zwraca wartość true, to jest to
równoznaczne z otrzymaniem zera kody wyjścia aplikacji.
if test warunki
then
komendy
fi
lub
if [ warunki ]
then
komendy
fi
Jak ju\ wiadomo istnieją trzy klasy na których mo\na zastosować działanie polecenia test:
ą sprawdzanie plików
ą porównania numeryczne
ą sprawdzanie łańcuchów znakowych
Zadanie 1
Napisać skrypt pytający u\ytkownika o imię, nazwisko, adres. Skrypt zwraca
wprowadzone wartości w opisanej formie (np.: imię i nazwisko: Jaś Fasola itd.) i zapisuje
je do pliku.
Zadanie 2
Przepisać skrypt z zadania 1 tak, aby dane wprowadzane były jako argumenty wywołania.
Zadanie 3
Napisać skrypt który wyświetli wszystkie pliki kończące się na .sh lub .bash z katalogu
domowego u\ytkownika (o ile on w ogóle istnieje):
a) podanego jako argument pliku
b) zadeklarowanego przy u\yciu zmiennej
Jeśli istnieje taka potrzeba stosować zmienne środowiskowe. Je\eli podany u\ytkownik
nie istnieje powinna być zwrócona stosowna informacja.
Zadanie 4
Napisać skrypt w którym zadeklarowane zostaną wartości dwóch zmiennych. W
zale\ności od porównania ich wartości skrypt ma zwrócić odpowiedni komunikat o
równości, mniejszości, większości względnej zmiennych.
Zadanie 5
Napisać skrypt w którym zadeklarowane zostaną dwie zmienne łańcuchowe. Porównać
łańcuchy znaków i zwrócić odpowiedni komunikat.
Zadanie 6
Zmodyfikować skrypt z zadania 5 w ten sposób, aby u\ytkownik był pytany o
wprowadzane łańcuchy. Działanie skryptu takie samo jak w zadaniu 5. Uwzględnić
mo\liwość wprowadzenia pustego łańcuchu i wyprowadzenie odpowiedniego komunikatu.
Zadanie 7
Napisać skrypt który sprawdzi istnienie katalogu domowego u\ytkownika uruchamiającego
skrypt, jeśli katalog nie istnieje to musi zostać zwrócona odpowiednia informacja, a
działanie skryptu przerwane. W kolejnym kroku skrypt sprawdza istnienie pliku plik_test,
je\eli plik nie istnieje, to jest tworzony i wypisywany jest odpowiedni komunikat o jego
utworzeniu. Je\eli plik plik_test istniał to sprawdzana jest mo\liwość jego zapisu. Je\eli
plik nie posiada odpowiednich praw to zwracany jest stosowny komunikat. W kolejnym
kroku skrypt pyta o imię i nazwisko u\ytkownika, je\eli któraś z wartości nie została
podana to zwracany jest odpowiednia informacja. Na końcu skrypt zapisuje do pliku
plik_test aktualną godzinę, oraz imię i nazwisko.


Wyszukiwarka

Podobne podstrony:
sop 2009 lab04
sop 2009 lab05
sop 2009 lab12
sop 2009 lab10
sop 2009 lab03
sop 2009 lab08
sop 2009 lab01
sop 2009 lab11
sop 2009 lab02
sop 2009 lab06
sop 2009 lab09
2009 2010 rejon
2009 pytania testowe
[W] Badania Operacyjne Zagadnienia transportowe (2009 04 19)
Twilight Saga New Moon 2009 CAM XviD POISON

więcej podobnych podstron