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
ą
d
ź
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
ą
d
ź
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
i
f-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.