Sunteți pe pagina 1din 15

Exercitii de laborator Shell Scripting

Un script se editeaza intr-un editor text oarecare si se salveaza.

OBS:
1. prima linie dintr-un script indica tipul de shell pe care il utilizam: vom lucra cu Bourne Shell deci
prima linie va fi de forma #!/bin/sh
2. dupa salvarea fisierului se acorda acestuia drepturi de executie utlizandu-se comanda $chmod +x
fis_exe
3. executia se realizeaza astfel : din linia de comanda se tasteaza ./fis_exe –simbolul ./ semnifica
faptul ca fisierul executabil se afla in directorul curent.

Instructiunea if..fi
Marele avantaj al limbajului de programare shell consta in existenta structurilor de control al executiei
instructiunilor. Instructiunea if permite conditionarea executiei unei comenzi de indeplinirea unei conditii
logice.

Sintaxa instructiunii este urmatoarea:


if (expresie logica)

then

(comanda)...

[else

(comanda)... ]

fi

unde:

(expresie logica)- comanda sau suita de comenzi cu rezultat logic

(comanda) - orice comanda acceptata de shell, inclusiv if

Instructiunea if functioneaza la fel ca instructiunile similare din limbajele Pascal si C.

Cuvintele if, then, else si fi sunt cuvinte cheie. Este obligatoriu ca instructiunea if sa fie scrisa asa cum
apare mai sus.

Exemplu 1:

#!/bin/sh
echo “Introduceti primul nr:”
read a
echo “Introduceti cel de-al doilea nr:”
read b
if [ $a –gt $b ]
then echo “$a>$b”
else echo “$b>=$a”
fi
#alti operatori exemplificati cu comanda test in S2
Exemplu 2:

Cauta numele Georgescu


in fisierul lista si afiseaza un mesaj in care se precizeaza rezultatul cautarii. Comanda grep fara optiuni
afiseaza liniile care contin sablonul specificat. Prin redirectarea iesirii (>/dev/null), se trimit liniile de text
catre perifericul null (trimitere catre "nicaieri"), pentru ca nu ne intereseaza liniile gasite, ci doar daca
exista asemenea linii.

Observatie : Optiunea de directare de la standard output (adica din terminal)

Stim din seminariile trecut ca putem redirecta un rezultat fie ca e cu std input, sau prin executie de comenzi,
intr-un fisier, folosind simbolul > (redirect output symbol). Formatul unei astfel de comenzi este :

command [arguments] > filename, unde :

command este orice program executabil

arguments reprezinta parametrii optionali

filename nume fisierului in care vrem sa redirectam outputul

ATENTIE ! la astfel de redirecturi, intrucat putem distruge/ corupe un fisier.


Daca ne dorim sa prevenim supra-scrierea unui fisier, putem folosi functia noclobber, ce previne
suprascrierea folosind metoda de redirectare.

Exemplu de cum functioneaza :

Comanda de setare: set –o noclobber

Comanda complementara: set +o noclobber

______________________
Rescrieti scriptul conform scriputului de mai jos. Interpretati modificarile.

if grep “Georgescu” lista > f_rez_grep


then
echo “Numele a fost gasit in lista”
else
echo “Numele nu a fost gasit in lista”
fi
Vom rescrie scriptul precedent, sablonul si fisierul in care cautam fiind date ca argumente pe linia de
comanda:

Rescriem scriptul precedent, testand corectitudinea liniei de comanda (se verifica daca numarul
argumentelor din linia de comanda este corect).
Pentru testarea numarului de parametri s-a folosit variabila speciala $#, care memoreaza numarul de
argumente din linia de comanda a ultimei comenzi. S-a folosit comanda test in forma simplificata. Comanda
exit este folosita pentru terminarea fortata a executiei scriptului, un parametru nenul al acesteia indicand
ca scriptul s-a terminat cu eroare. Daca numarul argumentelor este corect, scriptul va returna la terminare
valoarea 0 (exit 0).

Putem opta pentru rescrierea liniei ce contine comanda grep astfel :


if grep "$1" "$2" >/dev/null 2>&1

In acest caz expresia 2>&1 se utilizeaza pentru a uni canalul de iesire si canalul de eroare standard. Acest
lucru este necesar pentru ca, in cazul aparitiei unei erori, mesajul de eroare sa nu fie trimis pe canalul de
eroare standard (ar aparea pe ecran si nu dorim acest lucru) ci pe canalul de iesire (iesirea a fost redirectata
spre perifericul nul).

Instructiunea case..esac

Pentru deciziile multiple a fost implementata instructiunea case, care are urmatoarea sintaxa:
case (valoare) in

(sablon_1) (comanda)...;;

(sablon_2) (comanda)...;;

...

esac

unde:

(valoare) reprezinta "variabila" de selectie

(sablon_i) reprezinta un criteriu de cautare (domeniu de valori)

(comanda) reprezinta orice comanda sau succesiune de comenzi acceptate de shell

Daca (valoare) se incadreaza intr-unul din domeniile specificate, se executa lista de comenzi
corespunzatoare domeniului respectiv. Sunt permise folosirea caracterelor speciale in compunerea
sabloanelor.

Exemplu 1:

#!/bin/sh
echo “Culoarea preferata:”
read culoare
case “$culoare” in
albastru) echo “Ce frumos, e culoarea cerului!”;;
ro*) echo “Rosie e si lava vulcanilor!”;;
ver??) echo “Oh, verde e padurea!”;
*) echo “Nu stiu nimic despre aceasta culoare”;;
Esac
# caracterul meta *, actioneaza for orice sir de caractere introdus
Exemplu 2:
#!/bin/bash

# prima expresie refuza lipsa argumentului sau a unui argument ce nu contine cifre

case $1 in

‘’|*[!0-9]*) echo "arg lipseste, nu ati introdus numar" ;;

*) echo "OK e numar natural" ;;

Esac

Exemplu 3:

#!/bin/bash
var=$LOGNAME
case $var in
root) echo “Hello admin”;;
stud6) echo “Hello user $var”;;
*) echo “Hello user”;;
esac

Tema: Rescrieti scriptul de la instructiunea if, verificand parametrii din linia de comanda cu
instructiunea case.
Instructiunea Select

Sintaxa instructiunii select este:


select (variabila) in (lista de valori)

do

(comanda)...

done

Lista de valori este afisata pe ecran prin canalul de eroare standard. Fiecare optiune, precizata in lista de
valori, este precedata de un numar de ordine. Instructiunea se termina prin apasarea combinatiei ctrl+D.

Exemplu 1 :
PS3="Introduceti un numar intre 1 si 3: "
select optiune in matematica fizica informatica
do
if [ -n "$optiune" ]
then
echo "Materia preferata este $optiune"
else
exit
fi
done
Daca se omite lista de valori, se lucreaza implicit cu parametrii de pozitie, la fel ca in cazul instructiunii for.

PS3- Variabila utilizata de comanda select, pentru a specifica un prompter care sa apara inaintea fiecarei
intrari in meniul creat de utilizator.

Instructiunea For

Instructiunea for se foloseste atunci cand un grup de comenzi trebuie executat de mai multe ori. Spre
deosebire de instructiunea for din alte limbaje, in limbajul shell nu se fixeaza o limita inferioara si una
superioara pentru variabila contor, aceasta luand valori dintr-o lista explicita de valori sau potivit unui
anumit criteriu de cautare (in FOXPRO se intalneste o astfel de forma a instructiunii for). Sintaxa este:
for (variabila) in (lista)

do

(comanda)...

done

1. Folosirea listelor explicite de valori

O lista explicita este specificata prin enumerarea valorilor sale. Variabila contor va lua ca valoare, pe rand,
fiecare valoare din lista:

Exemplu 1:
Exemplu 2:
Variabila $fis ia, pe rand, valorile lista1, lista2, lista3, reprezentand nume de fisiere, afiseaza continutul
fiecaruia, dupa care le sterge (cu confirmarea stergerii).

2. Liste construite dupa un anumit criteriu


Listele pot fi construite cu ajutorul simbolurilor folosite pentru scrierea numelor de fisier, referindu-ne la o
multime de fisiere ce respecta un anumit criteriu. In exemplul urmator se vor afisa toate fisierele ce contin
un text sursa C:

for fis in *.c


do
cat $fis
done
3. Liste de valori implicite
Lista de valori implicite este formata din lista parametrilor de pozitie, care este memorata variabila speciala
$@ (lpr- functia tipareste un fisier text la imprimanta).

for fis in $@
do
lpr $fis
done
care este echivalent cu:

for fis
do
lpr $fis
done
Exemplul urmator afiseaza continutul directorului curent, sortat dupa data ultimei modificari.

for i in `ls -t`


do
echo $i
done
Determinati rezultatul executiei scriptului ce urmeaza:

for fis in `find $1 -perm -u=rx -type f`


do
echo $fis
cat $fis
done
Alte exemple – varianta moderna de for:

 Suma si produsul primelor nr numere:

OBS: de la versiunea de bash v4.0+, se poate seta si un pas pt incrementare folosinf forma
{start..end..increment}, precum in exemplul de mai jos:
Versiunea de BASH se regaseste in variabila de system $BASH_VERSION

Instructiunea While

Bucla while este utilizată pentru executia unei liste de comenzi atat timp cat este adevarata o anumita
conditie. Sintaxa este urmatoarea:

while (expresie logica)


do
(comanda)...
done
De cele mai multe ori, se foloseste comanda test drept expresie logica in instructiunea while.

Determinati rezultatul executiei scriptului ce urmeaza:

a=0
while [ "$a" -lt 10 ]
do
b="$a"
while [ "$b" -ge 0 ]
do
echo -n "$b "
b=`expr $b - 1`
done
echo
a=`expr $a + 1`
done
Se poate folosi o buclă while cu executie infinita datorita comenzii true, care returneaza intotdeauna
valoarea zero:

while true
do
...
done
In acest caz, se vor folosi instructiuni de iesire fortata din buclă ca break și exit.

Exemplul urmator afiseaza in mod continuu pe ecran, din 5 in 5 secunde, data si ora curenta.
Instructiunea Until

Ciclul until se termina atunci cand conditia devine adevarata. Sintaxa este:

until (expresie logica)


do
(comanda)...
done
Se poate folosi comanda false pentru a obtine o bucla until infinita.

Determinati rezultatul executiei scriptului ce urmeaza:

a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done

Alte comenzi

 break - permite iesirea din ciclu inainte de indeplinirea conditiei;


Determinati rezultatul executiei scriptului ce urmeaza:

a=0
while [ $a -lt 10 ]
do
echo $a
if [ $a -eq 5 ]
then
break
fi
a=`expr $a + 1`
done

Determinati rezultatul executiei scriptului ce urmeaza:


for var1 in 1 2 3
do
for var2 in 0 5
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2 // 2 reprezinta pasul la care se iese din bucla
else
echo "$var1 $var2"
fi
done
done

 continue - permite reluarea ciclului cu urmatoarea iteratie, inainte de terminarea iteratiei curente;
Determinati rezultatul executiei scriptului ce urmeaza:

nr="1 2 3 4 5 6 7"
for n in $nr
do
r=`expr $n % 2`
if [ $r -eq 0 ]
then
echo "Numar par"
continue
fi
echo "Numar impar"
done
 exec cmd - comenzile specificate ca argumente sunt executate de interpretorul de comenzi in loc sa se
creeze procese separate de executie; daca se doreste rularea comenzilor in procese separate ele se
scriu direct, asa cum se scriu si in linia de comanda. Vezi laboratorul 3, comanda find.
 shift - realizeaza deplasarea argumentelor cu o pozitie la stanga ($2$1, $3$2 etc);
 wait [pid] - permite sincronizarea unui proces cu sfarsitul procesului cu pid-ul indicat sau cu sfarsitul
tuturor proceselor "fii";
 expr expresie - permite evaluarea unei expresii.

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