You are on page 1of 18

Bazele programarii Shell (bash

)
Cum scriem scripturi shell
Urmatorii pasi sunt necesari pentru scrierea scripturilor shell:
folositi editorul dumneavoastra preferat (eu folosesc mcedit); primul rand din fisier trebuie sa fie

urmatorul:
#!/bin/bash

dupa scrierea scriptului, setati permisiunile fisierului dupa cum urmeaza:

chmod permisiuni script
Exemplu:
# chmod +x scriptul-meu
# chmod 755 scriptul-meu

executarea scriptului dupa cum urmeaza:

Sintaxa
bash scriptul-meu
sh scriptul-meu
./scriptul-meu
Exemple
# bash scriptul-meu
# sh scriptul-meu
# ./scriptul-meu
Acum suntem pregatiti sa scriem primul script shell care va afisa "Acesta este primul meu script". Vom crea
fisierul scriptul-meu.sh in care vom pune liniile de mai jos. Crearea fisierului si scrierea lui se va face folosind
comenzile:
# touch scriptul-meu.sh
# mcedit scriptul-meu.sh
#!/bin/bash
clear
echo "Acesta este primul meu script"
Dupa salvarea fisierului putem rula scriptul cu urmatoarea comanda:

sh Acest script va sterge ecranul si va afisa apoi pe acesta "Acesta este primul meu script" Pentru scripturi scrise in shell scripting este recomandat sa se foloseasca extensia .# . who | wc -l echo "Calendarul este" cal Variabilele in Shell In shell scripting exista doua tipuri de variabile:  Variabilele sistemului. se poate da comanda shell: # set Pentru a vizualiza doar valorile unor anumite variabile se pot da comenzile: # echo $USER # echo $HOME Cum sa utilizam variabilele definite de utilizator Sintaxa numele_variabilei=valoare Urmatoarea atribuire este corecta: # numar=10 . acestea sunt scrise cu minuscule.sh penntru a fi mai usor recunoscute. Scrieti si executati urmatorul script: #!/bin/bash clear echo "Buna $USER" echo "Astazi este". Exercitiu.sh Vom observa ca scriptul nu a fost rulat deoarece nu am setat atributul de executie scriptului. Pentru a face acest lucru vom rula comanda: # chmod +x scriptul-meu. Pentru a vizualiza o lista cu toate variabilele sistemului si valorile atribuite acestora. date echo "Numarul userilor logati este".  Variabilele definite de catre utilizator./scriptul-meu. acestea sunt create si mentinute de catre linux. si sunt scrise cu majuscule.

Urmatoarea nu este corecta. # 10=numar Salvati si executati urmatorul script #!/bin/bash clear numar=10 echo $numar Reguli in definirea variabilelor (atat cele ale sistemului cat si cele definite de utilizator) Variabilele pot fi formate din cel putin un caracter alfanumeric sau pot incepe cu un caracter  "underscore" (_) urmat de cel putin un caracter alfanumeric. Urmatoarele variabile nu sunt  identice. Exemple HOME SYSTEM_VERSION vehicul numar Nu folosite spatii in nici una din partile semnului egal.  Urmatoarea atribuire este corecta: numar=10 Urmatoarele atribuiri sunt insa incorecte: numar =10 numar= 10 numar = 10 Variabilele sunt case-sensitive. ci diferite: no=10 No=11 NO=20 nO=2 . la fel ca si numele fisierelor in linux. deoarece numele variabilei trebuie sa se afle in stanga semnului egal iar valoare atribuita acesteia in dreapta.

#!/bin/bash numele_meu=ADI sistemul_meu=DEBIAN numarul_meu=10 echo "Numele meu este $numele_meu" echo "Sistemul meu este $sistemul_meu" echo "Numarul meu este $numarul_meu. variabile.] Optiunile folosite sunt urmatoarele: -e activeaza interpretarea caracterului backslash in sirul de caractere care urmeaza . dupa cum se vede in exemplul urmator: vehicul= vehicul="" Cum afisam si accesam variabilele definite de utilizator Pentru a afisa si accesa variabilele definite de utilizator se va utiliza: Sintaxa: $numele_variabilei Definirea variabilei vehicul si numar se va face dupa cum urmeaza: # vehicul=autobuz # numar=10 Pentru afisarea variabilelor se va folosi: # echo $vehicul # echo $numar Pentru afisarea valorii variabilei vehicul nu folositi echo vehicul deoarece va afisa cuvantul vehicul si nu continutul acestei variabile. Pot de asemenea fi definite variabile nule.. Exercitiu: scrieti si rulati urmatorul script. Sintaxa generala a comenzii este: #echo [optiuni] [insiruire de caractere. Va atentionam ca am introdus intentionat anumite greseli pentru a va testa vigilenta.. poti vedea acest numar?" Comanda echo Aceasta comanda este folosita pentru a afisa pe ecran text sau valori ale unor variabile.

cu exceptia caracterelor \ si $ 'ghilimele simple' .-E dezactiveaza interpretarea acestuia \\ afiseaza caracterul backslash in sine \a efectueaza o avertizare sonora (eu sunt la distanta de server in acest moment) \b are efectul apasarii tastei backspace de pe tastatura. urmatoarele exemple sper sa va lamureasca in legatura cu folosirea ghilimelelor pentru executia comenzilor: #echo "expr 4 + 5" #echo 'expr 4 + 5' #echo `expr 4 + 5` Trebuie mentionat ca intotdeauna folosirea ghilimelelor inclinate are ca efect executia comenzii shell care se afla intre acestea si folosirea in script a rezultatului obtinut prin executarea comenzii respective. va fi afisat doar ceea ce este in fata lui "\c" \n face trecerea la o linie noua \r are efectul apasarii tastei enter \t afiseaza caracterul tab (invizibil) Operatii aritmetice Pentru efectuarea operatiilor aritmetice este folosira comanda expr: Sintaxa: expr argument1 operator_matematic argument2 Operatorul matematic poate fi: + adunarea . Acest lucru este universal valabil in programarea shell. Mai multe despre ghilimele In programarea de tip shell bash exista trei tipuri de ghilimele: "ghilimele duble" . si nu ghilimele simple si nici duble.tot ceea ce se afla intre ghilimele simple va ramane neschimbat . Observatie:  in exemplul de mai jos executia comenzii expr se face folosind ghilimele inclinate. nu numai in cazul comenzii expr.tot ceea ce se afla intre glilimele duble este considerat doar o insiruire de caractere.scaderea / impartirea % restul impartirii * inmultirea Exista si alti operatori matematici insa acestia vor fi discutati mai tarziu pe parcursul acestui tutorial. sterge ultimul caracter afisat \c sterge sirul de caractere care urmeaza acestei comenzi.

variabila2. care sunt folosite pentru a vedea daca comanda sau scriptul au fost executate corect sau nu. Exit Status . Daca valoarea returnata este 0 atunci comanda a fost executata cu succes iar daca valoarea returnata este diferita de 0 atunci a aparut o eroare in executarea comenzii sau a scriptului. Pentru a avea valoarea starii de exit... Urmatoarele exercitii sper sa va lamureasca in legatura cu folosirea acestei variabile speciale.Starea de exit De obicei. ele returneaza doua tipuri de valori. Utilizatorul introduce numele la tastatura (dupa scrierea numelui trebuie apasata tasta ENTER) si numele introdus prin intermediul tastaturii este memorat in variabila fname . Exemple: # expr 1 + 2 # echo $? # echo Buna ziua # echo $? # wildwest sunt_obosit? # echo $? # date # echo $? # echon $? # echo $? Declaratia de citire (read) Aceasta declaratie este folosita pentru preluarea datelor de la utilizator prin intermediul tastaturii si memorarea datelor in variabile.sunt folosite pentru a executa comanda aflata intre acestea Exemple: #echo "Astazi este data" #echo "Astazi este `date`" Se observa ca in primul caz a fost afisat sirul de caractere "Astazi este data" iar in cel de-al doilea caz este afisata data de astazi. se foloseste variabila speciala $?.. Sintaxa read variabila1. in Linux. variabilaN Urmatorul script ii cere utilizatorului numele si apoi asteapta introducerea acestuia de la tastatura. daca o anumita comanda sau script au fost executatate.`glilimele inclinate` .

/script. b sau c #ls /bin/[!a-f]* sau #ls /bin/[^a-f]* va afisa toate fisierele si directoarele din directorul /bin cu exceptia celor care incep cu un caracter aflat in seria mentionata Mai multe comenzi intr-o singura linie de comanda Sintaxa #comanda1.sh # #script pentru citirea numelui de la tastatura # echo "Numele dumneavoastra va rog:" read fname echo "Buna $fname. ma bucur de cunostinta! Meta caracterele (folosite pentru specificarea globala a numelui unui fisier) Meta caracterul: * .inlocuieste doar cu caracterele aflate intre paranteze Exemple #ls /bin/[a-c]* va afisa toate fisierele si directoarele din directorul /bin care incep cu litera a.] . comanda2 Exemple #date.sh Numele dumneavoastra va rog:adrian Buna adrian.sh #. In exact acelasi scop poate fi folosita si urmatoarea linie de comanda: #date who Procesarea liniei de comanda ..potriveste orice caracter sau grup de caractere ? .. who Comanda de mai sus va afisa data de astazi urmata de userul cu care suntem logati.#mcedit script.potriveste orice caracter dar numai unul [. ma bucur de cunostinta!" Rularea acestuia se va face in felul urmator: #chmod 755 script.

sh? Primul cuvant al liniei de comanda este ls .sh unu doi script. Pentru a informa comanda sau utilitarul ce fisier sau grup de fisiere sa foloseasca. Nota: $# detine numarul de argumente specificate in linia de comanda.. Sa luam de exemplu comanda rm care este folosita pentru stergerea unui fisier. Acum ia nastere o alta intrebare Ce sunt comenzile?. In acest mod ii precizam explicit comenzii rm ce fisier sa stearga. Ceea ce vom face este sa rulam comanda urmatoare: #rm {numele fisierului} In acest exemplu rm este comanda iar numele-fisierului este fisierul pe care dorim sa il stergem.Incercati urmatoarea comanda (se presupune ca fisierul script.sh Va fi afisat un mesaj asemanator cu urmatorul: . Urmatorul script va fi folosit pentru afisarea si prelucrarea argumentelor liniei de comanda: . Trebuie notat faptul ca la un moment dat pot fi folosite un numar de maxim 9 argumente notate de la $1 la $9. De ce sunt necesare argumentele in linia de comanda 1.sh este numele scriptului rulat unu reprezinta primul argument trecut scriptului prin intermediul liniei de comanda doi reprezinta cel de-al doilea argument.sh Numele comenzii este tail iar +10 si script.script. dar cum ii vom spune noi acestei comenzi ce fisier sa stearga (ea nu ne va intreba ce fisier dorim sa stergem). 2. Pentru a spune comenzii sau utilitarului ce optiuni sa foloseasca..numele comenzii ce urmeaza sa fie executata.sh: No such file or directory ls este numele unei comenzi efective si shell-ul o executa in momentul in care aceasta este tastata la prompter. Notatiile $1. In cadrul scriptului nostru. Orice altceva pe acea linie este citit ca fiind un argument pentru comanda respectiva.sh nu exista pe sistemul dumneavoastra): #ls script.$9 reprezinta parametrii de pozitie. Iar $*sau $@ se refera la toate argumentele date scriptului. daca dorim sa ne referim la aceste argumente o vom face in felul urmator: $0 reprezinta numele scriptului $1 are valoarea unu $2 are valoarea doi In acest exemplu variabila predefinita $# are valoarea 2 deoarece au fost introduse doar doua argumente scriptului nostru. In cazul scripturilor shell: #script. Ce se intampla cand tastam #ls script. De asemenea pot fi transmise prin intermediul liniei de comanda anumite argumente scriptului pe care il rulam.sh sunt considerate argumente ale acestei comenzi. #tail +10 script. Astfel noi comunicam cu comanda rm specificand numele fisierului.

ca si in alte sisteme de operare. dar in Linux.sh Nota Nu se pot atribui alte valori parametrilor de pozitie in cadrul scriptului. continutul acestuia va fi inlocuit./script.#!/bin/sh # #folosirea argumentelor # echo "Numarul de argumente din linia de comanda este de $#" echo "$0 este numele scriptului" echo "$1 reprezinta primul argument" echo "$2 reprezinta cel de al doilea argument" echo "toate argumentele sunt: $* sau $@" Pentru rulare se vor folosi comenzile: #chmod 755 script. se pot trimite iesirile catre fisiere sau de asemenea citirea intrarilor din fisiere. Pentru directionarea rezultatului intr-un fisier va fi folosita comanda: #ls > numele_fisierului Exista trei mari simboluri de redirectare: >. Exemplu: #ls comanda de mai sus afiseaza rezultatul pe monitor. Urmatoarele declaratii sunt invalide: $1 = doi $2 = unu Redirectarea intrarilor si iesirilor standard In cea mai mare parte comenzile au iesirile spre monitor iar intrarile sunt luate de la tastatura. . >> si < Simbolul ">" Sintaxa: #comanda_linux > numele_fisierului Rezultatul rularii comenzii respective va fi trimis catre fisier. Trebuie mentionat faptul ca daca fisierul in care este trimis rezultatul nu exista. atunci acesta este creat iar daca exista.sh #.

Exemplu: #cat < nume_fisier De asemenea pot fi folosite mai multe simboluri de redirectare in aceeasi linie de comanda. Simbolul "<" Sintaxa: #comanda_linux < nume_fisier Acest simbol este folosit pentru preluarea informatiilor necesare rularii comenzii nu din tastatura ci din fisierul respectiv. .Simbolul ">>" Sintaxa: #comanda_linux >> nume_fisier Daca fisierul nu exista atunci el este creat iar daca exista. continutul rezultat in urma rularii comenzii va fi pus la sfarsitul fisierului fara a se pierde nimic din informatia continuta initial in fisier. Un alt exemplu ar putea fi comanda urmatoare: #tr "[a-z]" "[A-Z]" < sorce_name > majuscule_name #cat majuscule_name ALINA DANIEL LINUX MELE Comanda tr a fost folosita aici pentru transformarea minusculelor in majuscule dupa care rezultatul a fost scris in fisierul majuscule_name. la fel ca in exemplul urmator: #cat > source_name alina linux daniel mele #sort < source_name > sorted_name #cat sorted_name alina daniel linux mele In exemplul anterior comanda sort a preluat datele de intrare din fisierul source_name iar rezultatul a fost redirectat catre fisierul sorted_name.

Un exemplu ar putea fi: #ps fax Aici apare o lista a tuturor proceselor de pe sistemul nostru in momentul de fata.txt |head -n 30 > flist In acest comanda head este un filtru deoarece intrarea acesteia este preluata din rezultatul comenzii tail si rezultatul acesteia este directionat in fisierul flist. . Pentru aceasta vom folosi comanda urmatoare: #tail +20 < nume. Sintaxa #comanda1 | comanda2 Exemplu: #who | sort Aceasta comanda va returna o lista a utilizatorilor logati pe masina respectiva intr-o ordine sortata. De ce sunt necesare procesele Dupa cum se stie linuxul este un sistem de operare pe care poate rula mai mult de o singura sarcina la un moment dat daca se doreste acest lucru. Ca exemplu presupunem ca avem fisierul nume. #who | grep root Va returna doar logarile cu userul root.Semnul PIPE Acesta reprezinta modalitatea de conectare a iesirii unei comenzi de intrarea unei alte comenzi fara folosirea unui fisier temporar. Filtrele Daca in linux o comanda isi accepta intrarea din intrarea standard si rezultatul acesteia este o iesire standard atunci comanda respectiva este cunoscuta sub numele de filtru. Un alt exemplu il reprezinta comanda urmatoare: #sort < snume | uniq > u_snume Ce sunt procesele Procesul este un fel de program sau sarcina pentru calculatorul nostru. #who | wc -l Va returna numarul de useri total logati in sistem. Acestea sunt folosite pentru rularea a doua sau mai multe comenzi in aceeasi linie de comanda.txt care contine 100 de linii si din acesta am dori sa scoatem liniile de la 20 la 30 iar rezultatul sa il punem in fisierul flist. Fiecarui proces in linux ii este asociat un PID sau process-id format dintr-un numar care ia valori intre 0 si 65535.

#ls / R | wc -l & Se observa folosirea caracterului ampersand (&) la finalul comenzii. se poate rula comanda curenta in background.Calculator pentru linux. Acest capitol face o scurta introducere in constructiile programarii bash. Nota: atentie sa nu dati kill procesului sshd. cum ar fi:  Luarea deciziilor  Cicluri Exista diferente intre luarea deciziilor in viata de zi cu zi fata de deciziile pe care le iau calculatoarele? Deciziile sunt complicate pentru noi.pentru aflarea de informatii despre toate procesele care ruleaza kill 0 .pentru oprirea tuturor proceselor cu exceptia propriei conexiuni pe sistem ps aux .pentru afisarea proceselor care ruleaza in momentul respectiv kill {PID} .pentru oprirea procesului cu numele respectiv. ps -ag .pentru obtinerea unei liste a proceselor cu utilizarea memoriei si a procesorului de catre acestea. Pentru a nu fi nevoiti sa asteptam finalizarea comenzii curente si abia apoi sa putem executa o noua comanda. Pentru a putea intelege toate acestea vom folosi in continuare bc . doar ca ii va lua o anumita perioada de timp sa faca acest lucru.pentru oprirea procesului identificat prin pid-ul din cadrul comenzii killall {numele-procesului} . #bc . oamenii. cu update in timp real pstree . pe cand tot ceea ce intelege un calculator este sub forma de 0 (zero) si 1 care reprezinta Da sau Nu. Comenzi linux referitoare la procese ps .pentru afisarea proceselor si o lista a userilor carora apartin aceste procese top . Acest lucru se poate face in felul urmator.pentru obtinerea unei structuri arborescente a proceselor Constructii in programarea structurata BASH shell Introducere Luarea deciziilor este foarte importanta atat in viata de zi cu zi cat si in programarea calculatoarelor. avand ca efect executarea comenzii in background si oferindu-ne imediat posibilitatea de executie a unei noi comenzi.Exemplu: #ls / -R | wc -l Aceasta comanda va afisa numarul total de fisiere existe pe sistemul dumneavoastra.

adica rezultatul adunarii dintre 5 si 2..Dupa pornirea acestui program bc este pornit si asteapta introducerea comenzilor de la tastatura. Syntax: if condition then command1 if condition is true or if exit status of condition is 0 (zero) .2 #5 / 2 #5 > 2 Vom observa ca rezultatul ultimei operatii va fi 1. fi O definitie a conditiei ar putea fi urmatoare: "Conditia nu este decat o simpla comparatie intre doua valori" Expresia poate fi definita astfel: . bc compara cele doua valori si daca raspunsul este afirmativ (YES) ne va afisa valoarea 1. Puteti incerca acum: #5 < 2 #0 0 indica faptul ca valoarea expresiei de mai sus este falsa.. daca valoarea conditiei este 1 sau YES atunci comanda este executata. Puteti incerca in continuare: #5 ... . pute incerca comparatiile de mai jos: #5 > 12 #5 == 10 #5 != 2 #5 == 5 #12 < 2 Conditia if Conditia if este folosita pentru luarea deciziilor in scripturile shell. Daca vom tasta 5 + 2 vom observa: #5 + 2 #7 7 este raspunsul pe care l-am primit de la acest program. Pentru a ne clarifica mai bine raspunsurile date de acest program.

a fost gasit si afisat cu succes. <> etc. Explicatii detaliate: Daca comanda cat gaseste fisierul file si il afiseaza pe ecran. este returnat nonzero pentru fals. daca a fost executata cu succes. Comanda test sau [ expresie ] Comanda teste sau [ expresie ] este folosita pentru a vedea daca o expresie este adevarata... presupunand ca exista fisierul numit file #cat file #echo $? Comanda cat returneaza starea de exit 0. Altfel. / etc. Daca comanda cat nu este executata cu succes atunci valoarea starii de exit returnata de aceasta este diferita de zero si declaratia echo -e "\n\nFisierul $1.. -." este executata cu succes." nu este executata de catre shell.) si operatori matematici (cum ar fi +. a fost gasit si afisat cu succes./fisier file Numele scriptului este fisier ($0) si file este argumentul (care este $1). a fost gasit si afisat cu succes." fi Rulati scriptul de mai sus dupa cum urmeaza: # chmod 755 fisier # .. operatori relationali (cum ar fi >."O expresie este o combinatie de valori..)" In continuare sunt prezentate cateva exemple de expresii: 5 > 2 3 + 6 3 * 65 a < b c > 5 c > 5 + 30 -1 Tastati urmatoare comenzi.. iar aceasta poate fi folosita in cazul conditiei if dupa cum se poate vedea in scriptul urmator: # cat > fisier #!/bin/sh # #Script pentru printarea fisierul # if cat $1 then echo -e "\n\nFisierul $1. inseamna ca aceasta comanda a fost executata cu succes si starea ei de exit este 0. . Astfel conditia noastra if este de asemenea adevarata si declaratia echo -e "\n\nFisierul $1. <. si daca aceasta este adevarata este returnata valoarea zero(0).

/ispositive 5 numarul 5 este pozitiv # .Sintaxa test expresie SAU [ expresie ] Exemplu Urmatorul script ispositive verifica daca argumentul care ii este dat este pozitiv sau nu. #!/bin/sh # # Script to see whether argument is positive # if test $1 -gt 0 then echo "numarul $1 este pozitiv" fi Se ruleaza in modul urmator: # chmod 755 ispositive # ./ispositive -45 Nu este afisat nimic Test sau [ expresie ] opereaza cu: * Intregi (Numere fara punct zecimal) * Tipuri de fisiere * Caractere ale stringurilor Operatori matematici sunt urmatorii: -eq (este egal cu) -ne (nu este egal cu) -lt (mai mic decat) -le (mai mic sau egal decat) -gt (mai mare decat) -ge (mai mare sau egal decat) Operatori pentru stringuri: stringul1 = stringul2 (stringul1 este egal cu stringul2) stringul1 != stringul2 (stringul1 nu este egal cu stringul 2) stringul1 (stringul1 este ne null sau nedefinit) .

.else.-n stringul1 (stringul1 este ne null si exista) -z stringul1 (stringul1 este nul si exista) Pentru fisiere si directoare tipurile de operatori sunt: -s fisier (fisierul care nu este gol) -f fisier (fisierul exista si nu este un director) -d fisier (este director. scrieti si rulati scriptul urmator: #mcedit este_poz.0) se vor executa toate comenzile pana la else else daca conditia nu este adevarata se executa toate comenzile pana la fi fi Spre exemplu.. exista si nu este fisier) -w fisier (fisierul are drepturi de scriere) -r fisier (fisierul are atributul doar de citire.. altfel comanda2 este executata. read-only) -x fisier (fisierul are atribut de executie) Operatorii logici sunt: ! expresie (logic NOT) expresie1 -a expresie2 (logic AND) expresie1 -o expresie2 (logic OR) if.sh #!/bin/sh # # Script pentru a observa daca argumentul este pozitiv sau negativ # if [ $# -eq 0 ] then echo "$0 : Trebuie sa introduceti un intreg" exit 1 fi if test $1 -gt 0 then echo " $1 este un numar pozitiv . Sintaxa: if condition then conditia este zero (adevarata ..fi Daca conditia data este adevarata atunci comanda1 este executata.

si daca acesta nu este dat afiseaza un mesaj de eroare. Mai jos se verifica daca argumentul./este_poz : Trebuie sa introduceti un intreg #. Windows (XP)" echo "2. aceasta cpata valoarea de adevar true.else echo " $1 este un numar negativ" fi Il puteti rula dupa cum urmeaza: #chmod +x este_poz. then echo "Ai ales Linux (Debian)" else echo "Astazi esti foarte nehotarat" fi fi #chmod +x if_grupat./este_poz . Sintaxa acestui tip de declaratie este urmatoarea: ./este_poz. Daca au fost date scriptului argumente in linia de comanda atunci declaratia din if devine falsa./este_poz. If-ul testeaza daca numarul de argumente este sau nu egal cu 0.sh 5 5 este un numar pozitiv #. care acum exista este pozitiv sau negativ si se afiseaza un mesaj corespunzator.sh #.sh #!/bin/sh os=0 echo "1. Se pot folosi de asemenea si if-uri grupate: #mcedit if_grupat.sh Se poate observa foarte bine in scriptul de mai sus folosirea grupata a if-ului. Linux (Debian)" echo -n "Alegeti sistemul preferat de operare [1 or 2]? " read os if [ $os -eq 1 ] . then echoo "Ai ales Windows (XP)" else if [ $os -eq 2 ] .sh -5 -5 este un numar negativ Explicatii detaliate: Prima parte a scriptului verifica daca argumentul este dat in linia de comanda. iar daca a fost dat un argument scriptului.

comenzi fi else .. .. . comenzi fi ........if conditie then if conditie then .. .. comenzi else ..