background image

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

background image

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

background image

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

background image

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

background image

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.

background image

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.

background image

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.

background image

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.