You are on page 1of 6

Sisteme de operare i tehnologii de reea

Lucrare de laborator nr. 4

Scripturi shell UNIX


Acest laborator are drept scop familiarizarea cu procedurile de scrire i rulare a scripturilor shellurilior Unix.
Un script UNIX este un program care poate fi interpretat de ctre shell-ul UNIX al calculatorului
dumneavoastr. El este compus din :
comenzi UNIX;
instruciuni de control;
comentarii.
Creai un director LAB4 n care vei depune fiierele corespunztoare urmtoarelor fiiere de
scripturi UNIX :

Noiuni generale
Variabile de mediu
Variabilele de mediu pot sa conin ca valoare un sir de caractere. Atribuirea de valori se face astfel:
variabila=valoare
n UNIX exista cteva variabile predefinite.
variabile read-only, actualizate de interpretor:

$? - codul returnat de ultima comanda executata


$$ - identificatorul de proces al interpretorului de comenzi
$! - identificatorul ultimului proces lansat n paralel
$# - numrul de argumente cu care a fost apelat fiierul de comenzi curent
$0 - conine numele comenzii executate de interpretor
$1, $2 ... - argumentele cu care a fost apelat fiierul de comenzi care se afla n
execuie

variabile iniializate la intrarea n sesiune:


$HOME - numele directorului "home" afectat utilizatorului;
$PATH - cile de cutare a programelor;
$PS1 - prompter-ul pe care l afieaz interpretorul atunci cnd ateapt o
comanda;
$PS2 - al doilea prompter;
$TERM - tipul terminalului pe care se lucreaz.

Directive de control (informaii succinte)


Directivele de control ale interpretorului bash (sau sh) sunt structurile de limbaj care pot fi utilizate
n scrierea de programe. n continuare vor fi prezentate cteva din cele mai folosite structuri de
control.
Pentru detalii consultai pagina de manual a interpretorului de comenzi bash (i/sau sh), analizai cu
atenie directivele i facilitile pe care acesta le pune la dispoziie.
Instruciuni de decizie
Instruciunea if
if lista1
then lista2
else lista3
fi
if lista1
then lista2
elif lista3
then lista4
else lista5
fi
O comanda returneaz o valoare la terminarea ei. n general, dac o comanda s-a terminat cu succes
ea va returna 0, altfel va returna un cod de eroare nenul.
n prima forma a comenzii if, se executa lista1, iar dac si ultima instruciune din lista returneaz
codul 0 (succes) se executa lista2, altfel se executa lista3.
n a doua forma se pot testa mai multe condiii: cnd lista1 se termina cu succes, se va executa
lista2, altfel se executa lista3. Dac aceasta se termina cu succes se executa lista4, altfel se executa
lista5.
Instruciunea case
case cuvant in
tipar1) lista1;;
tipar2) lista2;;
...
esac
Aceasta instruciune implementeaz decizia multipla. ablonul tipar este o construcie care poate
conine simbolurile ? si *, similara celor folosite la specificarea generica a numelor de fiiere.
Comanda expandeaz (evalueaz) irul cuvant i ncearc sa l potriveasc pe unul din tipare. Va fi
executata lista de comenzi pentru care aceasta potrivire poate fi fcut.
Instruciuni de ciclare
Instruciunea while
while lista1
do lista2
done
Se executa comenzile din lista2 n mod repetat, cat timp lista de comenzi lista1 se ncheie cu cod de
2

succes.
Instruciunea until
until lista1
do lista2
done
Se executa comenzile din lista2 in mod repetat, pana cnd lista de comenzi lista1 se ncheie cu cod
de succes.
Instruciunea for
for variabila [in val1 val2 ...]
do lista
done
Se executa lista de comenzi n mod repetat, variabila lund pe rand valorile val1, val2, ... Dac
lipsete cuvntul cheie in, valorile pe care le va lua pe rand variabila vor fi parametrii din linia de
comanda pe care i-a primit fiierul de comenzi atunci cnd a fost lansat n execuie.
Alte comenzi
break - permite ieirea din ciclu nainte de ndeplinirea condiiei;
continue - permite reluarea ciclului cu urmtoarea iteratie, inainte de terminarea iteratiei
curente;
exec cmd - comenzile specificate ca argumente sunt executate de interpretorul de comenzi n
loc sa se creeze procese separate de execuie; dac se dorete rularea comenzilor n procese
separate ele se scriu direct, asa cum se scriu si in linia de comanda
shift - realizeaz deplasarea argumentelor cu o poziie la stnga ($2$1, $3$2 etc);
wait [pid] - permite sincronizarea unui proces cu sfritul procesului cu pid-ul indicat sau cu
sfarsitul tuturor proceselor "fii";
expr expresie - permite evaluarea unei expresii.

Mersul lucrrii
Primul script Hello World
Orice script trebuie sa nceap cu linia
#!/bin/bash
Pentru a afla adresa bash exact de pe calculatorul Dumneavoastr utilizai instruciunea which:
whichbash
Aceast linie este utilizat pentru a specifica faptul ca scriptul dumneavoastr trebuie interpretat de
ctre shell-ul bash care se gsete la adresa indicat.
Scriptul care permite afiarea unui mesaj de ntmpinare Buna ziua ! este expus mai jos :
#!/bin/bash
echoBunaziua!
3

Mai departe este expus procesul prin care se editeaz scriptul shell i se ruleaz :
$cat>BunaZiua.sh
#!/bin/bash
echoBunaziua!
Ctrl+C
chmod+xBunaZiua.sh
./BunaZiua.sh
Bunaziua!
$
Orice script shell trebuie salvat ntr-un fiier cu un nume NumeScript.sh , extensia este opional.
Fiierul trebuie s fie cu drept de executare. Execuia scriptului se realizeaz cu ajutorul comenzii
sau

$bashcaleacatrescriptuldumneavoastra
$./numescript

Scripturi simple
1. Creai un script care afieaz numrul de argumente ce i-au fost transmise i le afieaz n
continuare unul cte unul. n cazul cnd nu i-au fost transmise argumente, ea emite mesajul:
"Nici un argument transmis". Modificai scriptul pentru a afia argumentele n ordine
inversa
2. Analizai scriptul urmtor:
#!/bin/bash
((test$1lt$2)&&(echo'$1<$2'))||(echo'$2<$1')
Ce face el ? Dup testarea scriptului nlocuii ghilimelele simple cu ghilimele duble. Lansai
din nou scriptul. Ce ai constatat? Explicai.
Studiati codul returnat dup executarea acestui script. Explicati.
Rescriei scriptul utiliznd structura if then else fi
3. Cnd executai un script, un shell nou demar pentru a executa instruciunile coninute n
script. Sa testam aceasta afirmaie cu un exemplu. Creai un script cu urmtorul coninut:
echoPIDulmeueste$$
Variabila special $$ ne da PID-ul procesului. Executai scriptul de mai multe ori i
comparai rezultatele. Ce constatai? Vi se pare normal? Explicai.
Exerciii
1. Modificai scriptul BunaZiua.shredenumindu-l nBunaZiuaNume.shdup cum
urmeaz:
a) dac i transmitei doua argumente, primul coninnd numele iar al doilea prenumele, el
trebuie s le afieze dup salutare (de ex. Buna ziua, Nume Prenume)
b) dac nu-i transmitei nici un argument, el trebuie sa va afieze dup salutare numele de
conectare al utilizatorului (LOGNAME)
2. Realizai un script shell UNIX care permite curarea ecranului iar apoi afieaz structura
de fiiere i directoare a directorului pe care l-ai furnizat ca argument. Indicaie: comanda
care cur ecranul este clear. Studiai pagina de manual a acestei comenzi !
3. Modificai scriptul precedent pentru a afia structura de fiiere i directoare a dosarului
4

personal al utilizatorului n cazul cnd scriptul este lansat fr de argument.


4. Realizai un script shell UNIX care calculeaz suma primelor n numere naturale, n fiind
argumentul scriptului.
5. Realizai un script shell UNIX care cere utilizatorului sa introduc doua iruri de caractere i
apoi afieaz un mesaj de informare dac cele doua iruri sunt sau nu egale. Mai exact, dac
cele doua iruri de caractere sunt egale se afieaz la terminal un mesaj de tipul Cele doua
iruri de caracter sunt egale, iar dac sunt diferite - un mesaj de tipul Cele doua iruri de
caractere sunt diferite.
6. Realizai un script care primete drept argument calea ctre un director, verifica dac acesta
este un director i n caz afirmativ afieaz coninutul acestuia i al subdirectoarelor.
7. Realizai un script care permite copierea unui director specificat de ctre utilizator, cu ntreg
coninutul sau de fiiere i directoare ntr-un director numit copie.
8. Realizai un script shell UNIX care calculeaz suma primelor cinci numere pare, utiliznd
un ciclu while.
9. Realizai un script care permite afiarea denumirii unei luni, n situaia n care utilizatorul
specifica numrul lunii. De exemplu pentru 3 afieaz martie.
10. Realizai un script shell UNIX care nu afieaz dect fiierele dintr-un anumit director
furnizat ca argument.
11. Analog, creai un script shell UNIX care nu afieaz dect subdirectoarele dintr-un anumit
director furnizat ca argument.
12. Realizai un script shell UNIX care permite afiarea numrului de fiiere i de subdirectoare
dintr-un director furnizat drept argument (verificai pentru nceput dac directorul exista). Se
vor lua n considerare doua cazuri :
a) cutare superficiala (va limitai doar la directorul curent fr a va preocupa de
subdirectoare);
b) cutare n profunzime (cutare n toate sub-directoarele din dosarul de baza)
13. Scriei un script care afieaz numrul de utilizatori conectai i numrul de procese lansate
n momentul lansrii scriptului.
14. Scriei un script care afieaz numerele de la 1 pn la valoarea N transmisa scriptului n
calitate de parametru:
a) Folosii n acest scop o bucl while do done
b) Rescriei script-ul folosind structura until do done.
c) Schimbai script-ul pentru a calcula media tuturor valorilor afiate anterior.
15. Realizai un script shell UNIX care realizeaz un meniu afiat n bucla care permite
urmtoarele opiuni :
a) pentru opiunea 1 afieaz un mesaj de ntmpinare ;
b) pentru opiunea 2 afieaz data curenta;
c) pentru opiunea 3 afieaz procesele care ruleaz la acel moment (comanda ps);
d) pentru opiunea 4 va ntreab numrul procesului care trebuie a fie oprit ("ucide" procesul
trimindu-i semnalul SIGKILL);
e) pentru opiunea 5 cura ecranul;
f) pentru opiunea 6 prsete scriptul;
16. (opional) Scriei un script care consulta pagina web www.kernel.org i afieaz versiunea
curenta (mainline) a nucleului Linux i ultima dat de actualizare (Indicaie: utilizatu wget
pentru a descrca n prealabil pagina de garda a site-ului).

Coninutul raportului
Facei un raport prezentnd mersul exerciiilor i prezentai-l pentru validare la sfritul lucrrii de
laborator sau n decurs de o sptmna dup efectuarea lucrrii (prin e-mail la adresa
victor.moraru@utm.md). Includei n fiecare rspuns textul scriptului respectiv. Punei toate
fiierele cu scripturi ntr-o arhiva tar.gz cu numele: NumePrenume-Lab4.tar.gz. Numii scripturile n
funcie de numrul exerciiului (de exemplu 7.sh pentru exerciiul 7, 15b.sh pentru punctul b al
exerciiului 15, etc.). Trimitei arhiva mpreun cu raportul prin pota electronic.
5

Referine

Pagina de manual bash


Machtelt Garrels "Bash Guide for Beginners" http://tldp.org/LDP/Bash-BeginnersGuide/html/index.html
Linux Documentation Project Guides: http://www.tldp.org/guides.html
Diverse surse pe Internet

You might also like