Documente Academic
Documente Profesional
Documente Cultură
S3 - Exercitii de Laborator-2
S3 - Exercitii de Laborator-2
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.
then
(comanda)...
[else
(comanda)... ]
fi
unde:
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:
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 :
______________________
Rescrieti scriptul conform scriputului de mai jos. Interpretati modificarile.
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).
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:
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
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
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
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).
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.
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:
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:
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
Alte comenzi
a=0
while [ $a -lt 10 ]
do
echo $a
if [ $a -eq 5 ]
then
break
fi
a=`expr $a + 1`
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.