Sunteți pe pagina 1din 5

UNIVERSITATEA “DUNAREA DE JOS GALATI” SISTEME DE OPERARE I 2006-2007

PECHEANU

LABORATOR NR. 5 - SISTEME DE OPERARE I

TEMA LABORATORULUI
1. Limbajul de programare Shell -instructiuni de control
2. Aplicatii

1. INSTRUCTIUNI DE CONTROL

1.1. CICLAREA

Limbajul de programare Shell implementeaza ciclarea, adica executarea repetata a unei


comenzi (sau secvente de comenzi) , pina la indeplinirea unei conditii. Conditia este testata
fie la inceputul ciclului (instructiunea while) sau la sfirsitul ciclului (instructiunea until).
Instructiunea while -ciclul cu test initial- are sintaxa:

while <lista-1>
do
<lista-2> (1)
done
Secventa de instructiuni <lista-2> se va executa pina cind lista de istructiuni <lista-
1> intoarce 0, adica succes (adevarat). Se iese din ciclu cu valoarea 1, adica esec (false),
intoarsa de <lista-1>.
While, do, done, sunt cuvinte cheie care marcheaza elementele structurii.

Instructiunea until - ciclul cu test final - are sintaxa:

until <lista-1>
do
<lista-2> (2)
done
Secventa de instructiuni <lista-2> se va executa pina cind lista de istructiuni <lista-
1> intoarce 1, adica esec (fals). Se iese din ciclu cu valoarea 0, adica esec (false), intoarsa de
<lista-1>.
Until, do, done, sunt cuvinte cheie care marcheaza elementele structurii.

Limbajul de programare Shell pune la dispozitie si o instructiune de ciclare cu contor:

for <variabila> [ in <val-1>, <val-2> ..]


do
<lista> (3)
done
Se executa in mod repetat lista> pina cind <variabila> ia succesiv toate valorile
<val-i>. In cazul in care lipseste lista de valori <variabila> va lua succesiv valorile
parametrilor procedurii.
1.2. SUBSTITUTIA COMENZILOR

Atunci cind intr-un program Shell o comanda este incadrata de caracterul ` (accent grav), ea
este executata de Shell, iar rezultatul ei va substitui locul comenzii in program.
UNIVERSITATEA “DUNAREA DE JOS GALATI” SISTEME DE OPERARE I 2006-2007
PECHEANU
Exemplul 1:
var1=`date`
echo $var1
Variabila var1 va lua ca valoare rezultatul comezii date, adica sirul de caractere care contine
data si ora curenta.

Substitutia este folosita pentru a construi expresii aritmetice cu variabile Shell.

Exemplul 2:
contor=1
contor = `expr $contor + 1`
Se executa comanda expr, care va calcula valoarea expresiei $contor + 1; valoarea acestei
expresii va fi atribuita variabilei contor.

Interpretarea comenzilor dintr-un program Shell se face in citeva faze (vezi laboratorul nr. 1,
sectiunea 1.4), iar printre fazele premergatoare se afla:
- substitutia comenzilor incadrate in accente grave `;
- substitutia variabilelor cu valoerea lor;
- generarea numelor de fisiere pe baza metacaracterelor *, ? , [...].

Observatie: In cadrul scripturilor Shell se folosesc comenzile in mod curent comezile:

test expr evalueaza expresia expr; se poate folosi si [ expr ] (vezi lab 4, 1.1)

expr <exp> evalueaza (calculeaza) o expresie <exp>

shift realizeaza deplasarea argum. cu o pozitie la stinga ( $2->$1, $3->$2);

break permite iesirea din ciclu inainte de indeplinirea conditiei;

continue permite reluarea ciclului cu urmatoarea iteratie, inainte de terminarea


iteratiei curente.

eval arg argumentele comenzii sunt interpretate ca intrare pentru Shell (ex:
cmd=pwd; eval $cmd afiseaza directorul curent).

exit n termina executia scrptului Shell, intorcind codul de stare n; daca n


lipseste, exit reintoarce codul de strare intors de ultima comanda
executata.
UNIVERSITATEA “DUNAREA DE JOS GALATI” SISTEME DE OPERARE I 2006-2007
PECHEANU
Utilizarea limbajului Shell poate aduce o importanta simplificare a efortului de programare,
in cazul unor categorii de probleme cum ar fi:
- aplicatii a caror rezolvare implica mai multe operatii care sunt oricum furnizate de diverse
comenzi Shell;
- aplicatii care manipuleaza date sub forma de linii de text sau chiar fisiere text;
- apicatii care implica consultarea directoarelor si parcurgerea arborelui de directoare.

Exemplul 3:
until test -r fifi
do
echo “Fisierul fifi nu are drept de citire”
echo “Asteptare de 5 secunde”
sleep 5
done

Programul testeaza daca un fisierul fifi permite citirea, si in caz ca nu, asteapta 5 sec si apoi
reia ciclul.

Exemplul 4:
Fie scriptul Shell denumit fifi cu urmatorul continut:

contor=$#
cmd=echo
while test $contor -gt 0
do
cmd=“$cmd \$$contor”
contor=`expr $contor - 1`
eval $cmd
done

Acest script afiseaza argumentele cu care el a fost apelat. Sirul \$ pentru caracterul $, folosit
la expandarea variabilei $cmd in comanda eval. Variabila $cmd are continutul: echo $contor,
unde $contor are pe rind valorile $1, $2, $3, etc, la fiecare pas din ciclu.

Exemplul 5:
Fie scriptul lili cu urmatorul continut:
for var1
do
grep $var1 fifi > cici
done

Scriptul va copia toate liniile continind un sir dat ca parametru, din fisierul fifi in fisierul cici.
Lansarea acestui script se face astfel:
mars:~$lili gt
In fisierul cici se va copia o singura linie din fifi, cea care contine sirul gt.Exemplul 6:
Fie scriptul Shell numit gigel care are urmatorul continut:

for fisier in *.c


echo $fisier
UNIVERSITATEA “DUNAREA DE JOS GALATI” SISTEME DE OPERARE I 2006-2007
PECHEANU
done

In acest script variabila fisier va lua pe rind valorile rezultate din expandarea numelui
ambiguu *.c

Exemplul 7:
Fie scriptul Shell cu urmatorul continut:

list=“ “
for var1
do
list=“$var1 $list”
done
echo $list

Variabila list va stoca pe rind parametrii de apel. Scriptul va afisa la executie parametrii de
apel in ordine inversa.

2. APLICATII

I. Sa se studieze paginile de manual ale comenzilor test, read, expr, shift, eval, break
continue, exit.
II. Sa se rezolve exercitiile urmatoare:

1. Sa se implementeze si sa se testeze exemplele din acest referat de laborator. Sa se arate


(acolo unde este cazul) ce este afisat pe ecran in urma executiei fiecarui script, in functie de
parametrii transmisi prin linia de comanda.

2. Sa se scrie un script Shell numit fifi care sa contina exemplul 4 din referatul de laborator.
Sa se testeze folosind 4 parametri de tip sir de caractere. Sa se modifice acest program astfel
incit el sa afiseze la fiecare iteratie numai un singur parametru.

3. Sa se scrie un script shell cu o bucla while infinita (while true), care primeste 5 argumente.
Programul sa afiseze argumentele primite, cite unul la o iteratie, apoi sa se opreasca.
(Indicatie: while true, continue, exit)

4. Sa se scrie un script Shell care primeste 5 parametri si ii afiseaza in ordinea inversa tastarii
lor: ultimul, penultimul, etc. (Indicatie: while true, if, break).

5. Sa se arate care este rezultatul scriptului gigel din exemplul 6. Sa se scrie un script Shell
care afiseaza acelasi lucru, dar cu informatii suplimentare: drepturi de acces, lungime, data
crearii. Indicatie: vezi si exemplul 4.

6. Sa se creeze mai multe fisiere cu extensia .c (daca nu exsita deja in directorul curent). Sa se
scrie un script Shell continind o singura comanda care sa afiseze toate fisierele .c din director
(scriptul va avea acelasi efect cu comanda ls -l *.c). Indicatie: man bash, capitolul despre
parametri.
UNIVERSITATEA “DUNAREA DE JOS GALATI” SISTEME DE OPERARE I 2006-2007
PECHEANU
7. Sa se creeze un script Shell care afiseaza numele directoarelor continute de directorul
indicat ca argument. Daca nu se indica nici un argument, se vor afisa numele directoarelor
continute de directorul curent. Indicatie:if, for, ls -l .

8. Sa se creeze un script Shell care afiseaza directoarele continute de directorul indicat ca


argument. Daca nu se indica nici un argument, se vor afisa informatiile despre directoarele
continute de cel curent. Indicatie:if, test -d, for, ls -l .

9. Sa se creeze un script Shell care primeste ca parametri numele unui fisier text sursa, doua
valori numerice n1 si n2, precum si numele unui fisier text destinatie. Sa se inscrie in fisierul
destinatie numai caracterele din fiecare linie a fisierului sursa, care sunt intre pozitiile n1 si
n2. Indicatie:for, cut

10. Sa se creeze un script Shell care afiseaza numarul de linii din toate fisierele cu extensia .c
din directorul curent. Indicatie: for, wc

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