Sunteți pe pagina 1din 6

LABORATOR NR.

4 - SISTEME DE OPERARE
TEMA LABORATORULUI
1. Limbajul de programare Shell -instruciuni de control
2. Aplicaii
1. INSTRUCIUNI DE CONTROL
1.1. DECIZIA
Limbajul de programare Shell implementeaz decizia i selecia i ca urmare ramificarea programului n
funcie de anumite condiii. Pentru decizie sintaxa este urmtoarea:
if <lista-1>
then
<lista-2>

if <lista-1>
then
<lista-2>
elif <lista-3>

else
(1)

then
<lista-3>

(2)
<lista-4>

fi

else
<lista-5>
fi

Cuvintele if, then, else, elif, fi sunt cuvinte cheie care marcheaz elementele structurii.
n primul caz se execut lista de comenzi <lista-1> iar dac codul de retur este 0 (comand reuit
= adevrat), se va executa lista de comenzi <lista-2>. Dac codul de retur este diferit de 0 (comand
nereuit=fals), se va executa lista de comenzi <lista-3>.
n a doua form: dac <lista-1> ntoarce codul de retur 0, se va executa <lista-2>, altfel se
executa <lista-3> i dac codul de retur este 0 se execut <lista-4>, altfel se execut <lista-5>.
Exemplul 1:
if test -e fifi
then echo Fisierul fifi exista in directorul curent
else echo Fisier negasit
fi
n acest eexemplu s-a folosit n condiie comanda test cu optiunea -e, care ntoarce 0 dac fiierul
specificat exist i este accesibil la citire i 1 dac fisierul nu exist. Comanda test este intern Shell-ului i are
urmtoarea sintax:
test expr
evalueaz expresia condiionat <expr>. Se permite i forma [ expr ].
ntr-o expresie acceptat de comanda test pot apare urmtoarele :
-e nume_fis
fiierul nume_fis exist n directorul curent
-r nume_fis
fiierul nume_fis exist i are drept de citire
-x nume_fis
fiierul nume_fis exist i are drept de execuie
-w nume_fis
fiierul nume_fis exist i are drept de scriere
-f nume_fis
fiier obinuit
(Atenie: dac nume_fis este un ir vid comanda test ntoarce adevrat !)
-z ir
lungimea irului este 0
-n ir
lungimea irului nu este 0
ir
irul nu este vid
ir1 = ir2
irurile sunt egale
1

sir1 != sir2
n1 -eq n2
n1 -ne n2

irurile nu sunt egale, etc.


numerele sunt egale
numerele nu sunt egale , etc.

Comanda test expr (sau mai simplu [ expr ]), unde expr este o expresie, este foarte des utilizat n
instruciunile de decizie precum i n structurile de ciclare while i until.
Exemplul 2:
if [ $1 = ls ]
then
$1
else
echo Ai tastat un ir diferit de ls
fi
1.2. SELECIA
Instruciunea de selecie are urmtoarea sintax:
case <sir> in
<sablon-1>
<lista-1> ;;
<sablon-2>
<lista-2> ;;
........................
esac
la execuia instruciunii se verific dac <ir> este identic cu unul din abloanele <ablon-i> i n caz
afirmativ se execut lista de comenzi <lista-i>.
Exemplul 3:
echo -e Introducei D sau N: \c
read raspuns rest
case $raspuns in
[Dd]*)
echo Ai rspuns Da ;;
[Nn]*)
echo Ai rspuns Nu ;;
*)
echo Nici Da nici Nu ;;
esac
n acest exemplu s-a folosit comanda intern read care are urmtoarea sintax:
read a1 [a2..]

Exemplul 4:
case $1 in
*7)
*15)
*)
esac

citete un rind de la intrarea standard; variabila a1 primete ca valoare primul


cuvnt din linia citit, a2 pe la doilea, etc. Ultimul argument primete ca valoare restul
liniei citite.

echo Ai tastat valoarea 7 ;;


echo Ai tastat valoarea 15 ;;
echo Nici 7, nici 15 ;;

n acest exemplu se alege un caz n funcie de valoarea parametrului $1 din linia de comand a
scriptului.

1.3. CICLAREA
Limbajul de programare Shell implementeaz ciclarea, adic executarea repetat a unei comenzi (sau
secvene de comenzi), pn la ndeplinirea unei condiii. Condiia este testat fie la nceputul ciclului
(instruciunea while) sau la sfiritul ciclului (instruciunea until). Instruciunea while -ciclul cu test iniial- are
sintaxa:
while <lista-1>
do
<lista-2>
(1)
done
Secvena de instruciuni <lista-2> se va executa pn cnd lista de instruciuni <lista-1>
ntoarce 0, adic succes (adevrat). Se iese din ciclu cu valoarea 1, adic eec (false), ntoars de <lista1>. While, do i done sunt cuvinte cheie care marcheaz elementele structurii.
Instruciunea until - ciclul cu test final - are sintaxa:
until <lista-1>
do
<lista-2>
done

(2)

Secvena de instruciuni <lista-2> se va executa pn cnd lista de instruciuni <lista-1>


ntoarce 1, adic eec (fals). Se iese din ciclu cu valoarea 0, adic eec (false), ntoars de <lista-1>.
Until, do i done, sunt cuvinte cheie care marcheaz elementele structurii.
Limbajul de programare Shell pune la dispoziie i o instruciune de ciclare cu contor:
for <variabila> [ in <val-1>, <val-2> ..]
do
<lista>
(3)
done
Se execut n mod repetat lista> pn cnd <variabila> ia succesiv toate valorile <val-i>.
n cazul n care lipsete lista de valori <variabila> va lua succesiv valorile parametrilor procedurii.
1.4. SUBSTITUIA COMENZILOR
Atunci cnd ntr-un program Shell o comand este ncadrat de caracterul ` (accent grav), ea este
executat de Shell, iar rezultatul ei va substitui locul comenzii n program.
Exemplul 5:
var1=`date`
echo $var1
Variabila var1 va lua ca valoare rezultatul comezii date, adic irul de caractere care conine data i ora
curent.
Substituia poate fi folosit i pentru a construi expresii aritmetice cu variabile Shell.
Exemplul 6:
contor=1
contor = `expr $contor + 1`
3

Se execut comanda <expr>, care va calcula valoarea expresiei $contor + 1; valoarea acestei expresii
va fi atribuit variabilei contor.
Interpretarea comenzilor dintr-un program Shell se face n cteva faze (vezi laboratorul nr. 1, seciunea
1.4), iar printre fazele premergtoare se afl:
- substituia comenzilor ncadrate n accente grave `;
- substituia variabilelor cu valoarea lor;
- generarea numelor de fiiere pe baza metacaracterelor *, ? , [...].
Observaie: n cadrul scripturilor Shell se folosesc n mod curent comenzile:
test expr
evalueaz expresia expr; se poate folosi i [ expr ] (vezi lab 4, 1.1)
expr <exp> evalueaz (calculeaz) o expresie <exp>
shift
realizeaz deplasarea argumentului. cu o poziie la stnga ( $2->$1, $3->$2);
break
permite ieirea din ciclu nainte de ndeplinirea condiiei;
continue
permite reluarea ciclului cu urmtoarea iteraie, nainte de terminarea iteraiei curente.
eval arg
argumentele comenzii sunt interpretate ca intrare pentru Shell
(exemplu: cmd=pwd; eval $cmd afieaz directorul curent).
exit n
termin execuia scriptului Shell, ntorcnd codul de stare n; daca n lipsete, exit rentoarce
codul de strare ntors de ultima comand executat.
Utilizarea limbajului Shell poate aduce o important simplificare a efortului de programare, n cazul
unor categorii de probleme cum ar fi:
- aplicaii a cror rezolvare implic mai multe operaii care sunt oricum furnizate de diverse comenzi Shell;
- aplicaii care manipuleaz date sub forma de linii de text sau chiar fiiere text;
- aplicaii care implic consultarea directoarelor i parcurgerea arborelui de directoare.
Exemplul 7:
until test -r fifi
do
echo Fiierul fifi nu are drept de citire
echo Ateptare de 5 secunde
sleep 5
done
Programul testeaza dac un fiierul fifi permite citirea, i n caz c nu, ateapt 5 sec i apoi reia ciclul.
Exemplul 8:
contor=$#
cmd=echo
while test $contor -gt 0
do
cmd=$cmd \$$contor
contor=`expr $contor - 1`
eval $cmd
done
Scriptul afieaza argumentele cu care el a fost apelat. irul \$ este pentru caracterul $, folosit la
expandarea variabilei $cmd n comanda eval. Variabila $cmd are coninutul: echo $contor, unde $contor are
pe rnd valorile $1, $2,, etc., la fiecare pas din ciclu.

Exemplul 9:
for var1
do
grep $var1 fifi > cici
done
Scriptul va copia toate liniile coninnd un ir dat ca parametru, din fiierul <fifi> n fiierul <cici>.
n fiierul cici se va copia o singur linie din fifi, cea care conine irul dat ca argument n linia de comand.
Exemplul 10:
for fisier in *.c
echo $fisier
done // n acest script variabila fiier va lua pe rnd valorile rezultate din expandarea numelui ambiguu
*.c, respectiv toate fiierele cu extensia .c.
Exemplul 11:
list=
for var1
do
list=$var1 $list
done
echo $list //Variabila list va stoca parametrii de apel. Scriptul va afia la execuie parametrii de apel n
ordine invers.
2. APLICAII
I.
a). S se studieze paginile de manual ale comenzilor test, read, expr, shift, eval, break continue,
exit.
b). S se implementeze i s se testeze exemplele din acest referat de laborator. S se arate (acolo
unde este cazul) ce este afiat pe ecran n urma execuiei fiecrui script, n funcie de parametrii
transmii prin linia de comand.
c). S se scrie un script Shell numit fifi care s conin exemplul 8 din referatul de laborator. S se
testeze folosind 4 parametri de tip ir de caractere. S se modifice acest program astfel nct el s
afieze la fiecare iteraie numai un singur parametru.
II. Sa se rezolve exercitiile urmatoare:
1. Sa se creeze un script Shell care primete ca argumente numele unui fiier i valoarea unui ir de
caractere. irul de caractere s se adauge la sfritul fiierului. S se trateze n script situaiile de eroare
(parametri inexisteni, fiier inexistent).
2. S se creeze un script Shell care primete ca argument un ir de caractere. S se afieze toate
apariiile acestui ir n fiierele text din directorul curent. S se trateze situaiile de eroare (argument
inexistent).
3. S se creeze un script Shell numit del care terge toate fiierele date ca argument n linia de
comand. S se trateze n cadrul script-ului situaiile de eroare. (Indicaie: man bash pentru expandare
nume ambigui).
4. S se creeze un script Shell numit type care afieaz coninutul unui fiier al crui nume a fost primit
ca argument n linia de comand. S se analizeze i trateze situaiile de eroare.
5. S se creeze un script Shell care terge un fiier al crui nume este dat ca parametru, dup ce a fost
solicitat rspunsul explicit al utilizatorului (Y sau N). S se analizeze i trateze i situaiile de eroare.
5

6. S se scrie un script shell cu o bucl while infinit (while true), care primete 5 argumente.
Programul s afieze argumentele primite, cte unul la o iteraie, apoi s se opreasc. S se trateze i
situaiile de eroare. (Indicaie: while true, continue, exit).
7. S se scrie un script Shell care primete 5 parametri i i afieaz n ordinea invers tastrii lor:
ultimul, penultimul, etc. S se trateze i situaiile de eroare. (Indicaie: while true, if, break)
8. S se arate care este rezultatul scriptului din exemplul 10 al referatului de laborator nr.4. S se scrie
un script Shell care afieaz acelai lucru, dar cu informaii suplimentare: drepturi de acces, lungime,
data creerii. S se trateze i situaiile de eroare. (Indicaie: vezi i exemplul 8.)
9. S se creeze mai multe fiiere cu extensia .c (daca nu exist deja n directorul curent). S se scrie un
script Shell printr-o singur comand care s afieze numele tuturor fiierelor cu extensisa .c din
director (scriptul va avea acelai efect cu comanda ls -l *.c). S se trateze i situaiile de eroare.
(Indicaie: man bash, capitolul despre parametri.)
10. S se creeze un script Shell care afieaza numele directoarelor coninute de directorul indicat ca
argument. Dac nu se indic nici un argument, se vor afia numele directoarelor coninute de directorul
curent. S se trateze i situaiile de eroare. (Indicaie: if, for, ls -l )
11. S se creeze un script Shell care afieaz directoarele coninute de directorul indicat ca argument.
Dac nu se indic nici un argument, se vor afia informaiile despre directoarele coninute de cel
curent. (Indicaie:if, test -d, for, ls -l .)
12. S se creeze un script Shell care primete ca parametri numele unui fiier text surs, dou valori
numerice n1 si n2, precum i numele unui fiier text destinaie. S se nscrie n fiierul destinaie numai
caracterele din fiecare linie a fiierului surs, care sunt ntre poziiile n1 i n2. S se trateze i situaiile
de eroare. (Indicaie:for, cut)
13. S se creeze un script Shell care afieaz numrul de linii din toate fiierele cu extensia .c din
directorul curent. S se trateze i situaiile de eroare. (Indicaie: for, wc)
14. S se creeze un script Shell care realizeaz redenumirea unui fiier. Numele vechi i cel nou vor fi
date ca argumente n linia de coamand. S se trateze i situatiile de eroare. (Indicaie: for, cut)
15. S se creeze un script Shell care primete ca parametri numele unui fiier text surs, i un anumit
caracter. S se creeze un fiier text destinaie care conine numai liniile cu caracterul dat ca parametru,
pn la prima apariie a sa. S se trateze i situatiile de eroare. (Indicaie: for, cut)
16. S se creeze un script Shell care primete ca argumente dou iruri de caractere. S se nlocuiasc
cele dou promptere sistem cu aceste iruri de caractere. S se analizeze i situaiile de eroare.

S-ar putea să vă placă și