Comenzi unix shell

129
UNIX-notiuni de baza Caracteristicile sistemului Unix Sistemul UNIX este un sistem de operare cu destinatie generala, multiutilizator, multiproces, lucrind in regim time-sharring. Caracteristici: • Este un sistem de operare cu o interfata relativ simpla, avand numeroase programe utilitare, care acopera o gama larga de aplicatii (retele, grafica, baze da date , inteligenta artificiala). Sunt disponibile compilatoare si medii de programare pentru limbaje de programare. • Unix este un sistem multiutilizator, permitind lucrul simultan de la mai multe terminale. • Este un sistem portabil, putind fi implementat pe diferite tipuri de calculatoare. • Unix are un sistem de fisiere arborescent, cu fisiere organizate simplu (sir de octeti) si grupate in directoare. • Unix dispune de un sistem de intrare/iesire generalizat, care trateaza identic fisiere, periferice, memoria si comunicatiile interproces. • Unix are un mecanism simplu de gestiune a memoriei, folosind conceptul de memorie virtuala, asigurind un nivel inalt de multiprogramare. • Unix dispune de un sistem eficient de protectie a informatiei, folosind parole si drepturi de acces. • Unix are o interfata utilizator simpla, numita SHELL, care se poate extinde la nivelul unui limbaj de programare de nivel inalt, de tip C, cu un interpretor de comenzi diferit de nucleu (utilizatorul poate incarca interpretorul de comenzi pe care-l doreste). • Procesele Unix sunt reentrante (procesele care au partea de cod identica folosesc o singura copie a codului, rezidenta in memorie). Structura sistemului Unix Sistemul de operare Unix contine un nucleu (partea rezidenta) si un mare numar de programe utilitare accesibile prin intermediul interpretorului de comenzi. Interfata tuturor acestor utilitare si a programelor utilizator cu nucleul se realizeaza prin intermediul unui ansamblu de functii sistem. Utilizatorul are trei niveluri de acces la sistem: • prin intermediul utilitarelor (nivel extranucleu); prin functii de biblioteca standard a limbajului C (nivelul intermediar); • prin directive sistem (nivel scazut); Nucleul este intermediarul intre interfata furnizata de apelurile sistem si echipamentele fizice. Nucleul realizeaza: • gestiunea fisierelor; • gestionarea memoriei; • planificarea proceselor pentru executie;

description

unix-shell

Transcript of Comenzi unix shell

UNIX-notiuni de baza

Caracteristicile sistemului Unix

Sistemul UNIX este un sistem de operare cu destinatie generala, multiutilizator, multiproces, lucrind in regim time-sharring. Caracteristici:• Este un sistem de operare cu o interfata relativ simpla, avand numeroase programe utilitare, care acopera o gama larga de aplicatii (retele, grafica, baze da date , inteligenta artificiala). Sunt disponibile compilatoare si medii de programare pentru limbaje de programare.• Unix este un sistem multiutilizator, permitind lucrul simultan de la mai multe terminale.• Este un sistem portabil, putind fi implementat pe diferite tipuri de calculatoare.• Unix are un sistem de fisiere arborescent, cu fisiere organizate simplu (sir de octeti) si grupate in directoare.• Unix dispune de un sistem de intrare/iesire generalizat, care trateaza identic fisiere, periferice, memoria si comunicatiile interproces.• Unix are un mecanism simplu de gestiune a memoriei, folosind conceptul de memorie virtuala, asigurind un nivel inalt de multiprogramare.• Unix dispune de un sistem eficient de protectie a informatiei, folosind parole si drepturi de acces.• Unix are o interfata utilizator simpla, numita SHELL, care se poate extinde la nivelul unui limbaj de programare de nivel inalt, de tip C, cu un interpretor de comenzi diferit de nucleu (utilizatorul poate incarca interpretorul de comenzi pe care-l doreste).• Procesele Unix sunt reentrante (procesele care au partea de cod identica folosesc o singura copie a codului, rezidenta in memorie).

Structura sistemului Unix

Sistemul de operare Unix contine un nucleu (partea rezidenta) si un mare numar de programe utilitare accesibile prin intermediul interpretorului de comenzi. Interfata tuturor acestor utilitare si a programelor utilizator cu nucleul se realizeaza prin intermediul unui ansamblu de functii sistem. Utilizatorul are trei niveluri de acces la sistem:• prin intermediul utilitarelor (nivel extranucleu);• prin functii de biblioteca standard a limbajului C (nivelul intermediar);• prin directive sistem (nivel scazut);Nucleul este intermediarul intre interfata furnizata de apelurile sistem si echipamentele fizice. Nucleul realizeaza:• gestiunea fisierelor;• gestionarea memoriei;• planificarea proceselor pentru executie;Apelurile sistem definesc interfata programator. Apelurile sistem sunt de trei categorii:• pentru manipularea fisierelor (perifericelor);• pentru controlul executiei proceselor;• pentru manipularea informatiei;

Sistemul de fisiere

Datele si programele sunt pastrate, ca si in alte sisteme de operare, in fisiere memorate pe discuri magnetice. Fiecare disc poate fi impartit, din punct de vedere logic, in mai multe zone numite partitii. Marimea unei partitii este stabilita de catre administratorul de sistem la instalarea sistemului sau cand se introduce un nou disc in sistem. Fiecare partitie este gestionata in mod separat de sistemul de operare ca

si cum ar fi un dispozitiv independent. Pentru gestionarea fisierelor dintr-o partitie, sistemul de operare trebuie sa detina informatii despre: blocurile de date libere din cadrul partitiei, blocurile de date ocupate, informatii cu privire la fiecare fisier continut de acea partitie. Toate informatiile de organizare a sistemului de fisiere trebuie sa se gaseasca in partitia in care a fost creat sistemul de fisiere. Pe parcursul evolutiei sale, in Unix au fost definite mai multe sisteme de fisiere, acestea diferind prin dimensiunea blocurilor de date , prin informatiile continute si prin structurile de date utilizate pentru gestionarea fisierelor. Exemple de sisteme de fisiere: s5 (UNIX System V), ufs (BSD UNIX), rsf si nsf (pentru retelele decalculatoare). Pentru a realiza coexistenta mai multor sisteme de fisiere diferite, nucleul sistemului de operare contine un nivel special, numit sistem virtual de fisiere, avand rolul de a uniformiza accesul la fisiere. Apelurile operatiilor cu fisiere primite de la utilizatori sunt tratate la acest nivel, care particularizeaza apelul in functie de sistemul de fisiere in care se afla fisierul apelat.

Notiunea de fisier in acceptiune Unix

In Unix fisierul este considerat ca fiind o succesiune de octeti, avand un marcaj de sfarsit de fisier. Exista trei tipuri de fisiere:• fisiere ordinare• fisiere director• fisiere specialeUn fisier ordinar este folosit pentru memorare de informatii pe suport magnetic; el poate contine un program sursa (text) sau unul sub forma de cod executabil (binar), precum si date necesare executiei programelor. Fisierele ordinare sunt singurul tip de fisiere folosite pentru memorarea pe termen lung a informatiilor. Numele fisierelor nu pot depasi 14 caractere tiparibile in sistemele Unix mai vechi si 255 de caractere in versiunile mai recente. Caracterele permise sunt literele mari si mici ale alfabetului englez, cifrele si semnul _ . Literele mari si literele mici sunt considerate distincte. Uneori este necesar ca numele fisierului sa aiba o extensie: .sh pentru programe Shell, .bas pentru programme Basic, .c pentru programe C, e.t.cDirctoarele sunt fisiere care contin informatii despre subdirectoarele si fisierele continute. Fisierele speciale sunt fisiere asociate dispozitivelor periferice. Utilizatorii pot efectua schimburi de date la periferice fara a fi nevoiti sa cunoasca detalii despre mecanismul de functionare a acestora.

Structura sistemului de fisiere. I-noduri

Reprezentarea interna a unui fisier si informatiile referitoare la carcateristicile sale sunt continute de o structura de date numita i-nod (information node), care contine date despre: pozitia pe disc a datelor din fisier, proprietarul fisierului, drepturile de acces, momentul ultimului acces la fisier sau ultima modificare a fisierului sau I-nodului. Un fisier poate avea mai multe nume, dar exista un singur i-nod asociat. Relatia stabilita intre nume si i-nod se numeste legatura . Fiecare i-nod are asociat un numar de ordine (inumber) ce desemneaza in mod unic numele interne ale fisierelor, iar cataloagele contin numai tabela de traducere a numelui extern al fisierului in numarul de ordine asociat. Cand un proces creeaza un nou fisier, nucleul asociaza acestuia un i-nod liber al carui numar de ordine devine identificatorul intern al fisierului si creeaza o noua intrare in catalogul corespunzator. I-nodurile sunt memorate in sistemul de fisiere dar, pentru a micsora timpul de executie a operatiilor care necesita informatii despre fisiere, o copie a tabelei de i-noduri este pastrata in memoria interna. Nucleul sistemului de operare contine urmatoarele structuri de date: o tabela de fisiere, cate o tabela de descriptori de fisier pentru fiecare proces. Tabela descriptorilor de fisier identifica toate fisierele create sau deschise de un anumit

proces. Tabela de fisiere inregistreaza, pentru fiecare fisier, pozitia in octeti de la care se va face urmatoarea operatie de citire sau scriere asupra fisierului. In momentul in care procesul va lansa o comanda de deschidere sau creare de fisier, nucleul sistemului de operare ii va intoarce indexul fisierului din tabela descriptorilor de fisier alocata acelui proces. Daca procesul lanseaza o comanda de scriere/citire asupra fisierului, comanda va contine ca argument si acest index, pe baza caruia sistemul de operare va identifica descriptorul acelui fisier, apoi pozitia sa in sistemul de fisiere si in cele din urma i-nodul asociat (din informatiile cuprinse in i-nod se identifica zona de date a fisierului. Un i-nod contine toate informatiile cu privire la un fisier (mai putin numele sau), cum ar fi:• tipul fisierului• drepturile de acces• identificatorul proprietarului fisierului• identificatorul grupului caruia apartine fisierul• marimea fisierului• data si ora ultimei accesari a fisierului• data si ora ultimei modificari a fisierului• data si ora crearii fisierului• tabel de adrese de disc a blocurilor ce compun fisierul (in cazul unor blocuri de 512 octeti, marimea fisierului poate ajunge la 1 GoUn sistem de fisiere este compus dintr-o secventa de blocuri logice, marimea acestora fiind un multiplu de 512 octeti (marimea blocului depinde de implementarea sistemului).Structura generala a sistemului de fisiere este urmatoarea:

****************************** Bloc pentru incarcarea ** sistemului de operare *

****************************** Superbloc *

****************************** Lista de i-noduri *

****************************** ** *

* Blocuri de date ** ** *

*****************************Blocul de incarcare ocupa, de obicei, zona aflata pe primul sector al discului si contine procedurile de incarcare ale sistemului de operare. Desi este considerata zona a sistemului de fisiere, nu este folosita practic de acesta. Superblocul ocupa urmatoarele sectoare de pe disc si contine informatii referitoare la sistemul de fisiere, cum ar fi:• Marimea si starea sistemului de fisiere (eticheta, numele sistemului de fisiere, marimea blocurilor, data si ora ultimei modificari a superblocului)• Informatii cu privire la i-noduri (numar total de i-noduri alocate, numarul de inoduri libere...)• Blocurile de memorie (numarul total de blocuri libere, tabel cu numerele a 50 de blocuri libere si un index in acest tabel)Lista de i-noduri cuprinde informatii cu privire la fiecare i-nod din sistem, marimea sa fiind specificata in momentul configurarii sistemului de fisiere. Nucleul sistemului de operare se refera la i-noduri prin indexul acestora din tabela de i-noduri. Unul dintre inoduri este radacina sistemului de fisiere, prin acesta fiind disponibila structura de cataloage a sistemului de fisiere. Blocurile de date incep imediat dupa lista de i-

noduri si contin datele din fisiere sau date administrative. Un bloc de date nu poate apartine, la un moment dat, decat unui singur fisier.

Structura arborescenta a directoarelor

Directorul este un fisier care contine, pentru fiecare fisier, numele extern al fisierului si inumber- ul asociat acestuia, pe baza caruia se identifica i-nodul fisierului (directorul contine tabela de traducere nume-identificator intern). Directoarele formeaza o structura arborescenta, avand ca radacina un unic director numit root si notat cu simbolul /. Fiecare director contine fisierele cu numele . si .. care identifica i-nodul propriu al directorului, respectiv i-nodul directorului parinte. Structura generala a arborelui cataloagelor (simplificata) este urmatoarea:

Aceasta structura este tipica pentru toate sistemele Unix, principalele directoare sistem fiind urmatoarele:• /bin -care contine utilitarele uzuale (format executabil);• /dev -contine fisierele speciale asociate perifericelor;• /etc -contine utilitarele speciale de intretinere, folosite doar de administrator,

fisierul de parole, de grupuri,etc;• /tmp -contine fisiere temporare folosite de editor, compilatoare;• /lib -contine biblioteca de limbaje• /usr -este cel mai mare director al sistemului, cu subdirectoarele:

bin -utilitare mai rar folosite man&doc -manuale si documentatie spool -fisiere pentru imprimanta si posta electronica users -contine cate un director pentru fiecare utilizator conectat la

sistemSpecificarea unui fisier se face prin specificarea caii de acces prin:• specificare absoluta -calea pleaca din root, indicandu-se toate nivelele arborelui pana la fisierul desemnat• specificare relativa ,cand calea pleaca din directorul curentMecanismul de protectie al fisierelor este simplu insa foarte eficient. Fiecare fisier contine in i -nodul asociat drepturile de acces la acel fisier. Exista trei tipuri de acces la un fisier:• read (r) -dreptul de vizualizare a continutului (deschiderea cu comanda ls pentru fisierele director)• write (w) -dreptul de modificare a fisierului (dreptul de creare si stergere de fisiere pentru directoare)• execute (x) -permite incarcarea fisierului in memorie si executarea codului continut (permisiunea de a cauta in director in cursul prelucrarii unei cai de acces)Exista trei categorii de utilizatori:• proprietar (u) -cel care a creat fisierul

• grup (g) -mai multi utilizatori din acelasi compartiment de lucru• ceilalti utilizatori (o)Sistemul de protectie al fisierelor mentine informatii despre drepturile de acces pe care le are fiecare categorie de utilizatori.

Notiunea de proces Unix. Incarcarea sistemului de operare

Sistemul de operare Unix are drept concept fundamental conceptul de proces. Procesul poate fi definit, in prima instanta, ca fiind un program in executie. Procesul este o entitate dinamica, in timp ce programul este o entitate statica. Pentru un program executabil dat pot exista mai multe procese asociate, numite instante. Caracteristica cea mai importanta a unui proces este identificatorul procesului (PID). Acesta este un numar natural nenul prin care se identifica in mod unic procesele, mai precis locul unde sunt memorate caracteristicile procesului din tabela proceselor. Procesele sunt de doua tipuri: procese utilizator si procese nucleu.Incarcarea sistemului de operare Unix se face astfel:• Se initializeaza structurile de date proprii (ale nucleului);• Se monteaza sistemul de fisiere• Se creaza procesul 0, numit swapper, care este planificatorul de procese - face parte din nucleu si este considerat proces sistem.• Se creaza procesul 1, numit init , care este parintele tuturor proceselor aparute ulterior in sistem;• Se executa procesul init care initializeaza structurile proprii de date, apoi citeste fisierul /etc/inittab pentru a decide asupra proceselor ce vor fi create si fisierul /etc/rc pentru a lansa procesele sistem care ruleaza in memorie pe durata intregii functionari a sistemului, numite procese background sau demoni. Procesul init citeste fisierul /etc/ttys pentru a determina numarul terminalelor din sistem si creaza cate un proces fiu pentru fiecare terminal. Dupa aceea, procesul init trece in starea blocat pana la terminarea unuia dintre procesele fiu. Fiecare proces fiu asociat unui terminal executa programul login care solicita introducerea numelui si parolei utilizatorului. Datele introduse sunt verificate prin compararea cu datele din fisierul /etc/passwd. Daca utilizatorul are acces la sistem, atunci acest proces fiu lanseaza interpretorul de comenzi ales de utilizator. In caz contrar, programul login solicita reintroducerea numelui si parolei. Observatie: Procesul 0 se numeste scheduler pentru sistemele cu paginare si swapper pentru sistemele cu evacuare.

Caracteristicile unui proces

Dupa cum aminteam ceva mai inainte, un proces utilizator poate sa se execute in mod utilizator si in modul nucleu . In modul utilizator procesele nu au acces decit la propria zona de cod, date si stiva utilizator. In modul nucleu un proces contine instructiuni privilegiate si poate avea acces la structurile de date ale nucleului. Nucleul, in termeni de procese, nu este un proces separat ci devine parte integranta a procesului utilizator. Spatiul virtual de adrese al unui proces este cuprins intre 0 si adresa virtuala maxima accesibila procesului si are trei segmente: segmentul de cod, segmentul de date si segmentul de stiva.Procesele iau nastere, sunt executate si dispar prin folosirea unor apeluri sistem (functii sistem). Orice proces Unix, cu exceptia procesului 0, este creat prin apelul functiei sistem fork. Procesul nou creat se numeste proces fiu, iar procesul care a apelat functia fork se numeste proces parinte. Initial, imaginile celor doua procese in memorie sunt identice, apoi ele pot avea propria imagine in memorie. Procesul fiu poate executa acelasi cod sau altul. Fisierele deschise de procesul parinte inainte de apelul fork vor fi partajate intre parinte si fiu. Pentru executarea codului se foloseste functia exec. Mecanismul executarii unei comenzi shell este urmatorul:• Shell-ul citeste linia de comanda si desparte comanda de argumentele sale;

• Se apeleaza functia fork in urma careia vor aparea cele doua procese:parintele (procesul care executa codul shell-ului) si fiul (procesul ce va executa comanda respectiva);• Procesul parinte printr-un apel al functiei wait cedeaza procesorul fiului si intra in starea de asteptare;• Procesul fiu lanseaza un apel exec prin care executa un nou program (comanda data). Nucleul incarca in zona de memorie a shell-ului noul program, iar procesul este continuat cu acest program, caruia ii sunt transmise argumentele;• La incheierea executiei programului se apeleaza functia sistem exit, care determina terminarea procesului fiu si reda controlul procesului parinte (acesta iese din starea de asteptare); Dupa terminarea sa, procesul fiu intra in starea zombie: desi s-a terminat, numai procesul parinte poate elimina procesul fiu din tabela proceselor.Operatiile cele mai importante, realizate de nucleu prin apelul functiei fork sunt:• Aloca o noua intrare in tabela proceselor;• Asociaza un descriptor unic procesului fiu;• Realizeaza o copie logica a imaginii memoriei parintelui;• Comunica parintelui descriptorul de proces al fiului;• Trece procesul fiu in starea intrerupt (in memorie sau evacuat pe disc);

Start\Run\telnet. Enter

Cont pentru conectare stud1..6 parola stud1…6

Sau conectare prin putty: Cont pentru conectare stud1..6 parola stud

Sau conectare prin Secure Shell Client

Date de conectare suplimentare :

Masina Ubuntu: fenrir.ase.roPort 22User: student1, student2,…student20Passwd: student1, student2,…student20

Maşina AIX : sys.ase.roPort 22User: stud1…stud6Passwd: std1…std6

Interpretoare de comenzi. Comenzi Shell.

Multe sisteme de operare poseda o componenta specializata numita interpretor de comenzi. Aceasta componenta este responsabila cu asigurarea dialogului elementar intre utilizator si sistemul de operare.

In linii mari, interpretorul de comenzi functioneaza astfel : afiseaza un mesaj de invitatie (prompter); forma acestuia difera de la

un sistem la altul, putand fi un simplu caracter ($,%,#) sau o succesiune de caractere. Prompter-ul indica faptul ca sistemul este gata sa primeasca comenzi;

preia o linie de comanda de la utilizator;

descompune linia de comanda intr-un nume de comanda si o serie de argumente;

daca numele de comanda identifica o comanda interna, atunci interpretorul de comenzi executa el insusi comanda respectiva; in caz contrar, numele comenzii este utilizat pentru a repera un fisier executabil care este incarcat si executat;

dupa terminarea executiei comenzii curente, afiseaza din nou prompter-ul, asteptand o noua comanda.

Dialogul cu un sistem UNIX are loc, de obicei, prin intermediul unui terminal. Dupa initializarea sesiunii de lucru a unui utilizator (introducerea numelui de login si, eventual, a parolei) se lanseaza interpretorul de comenzi (shell). In cazul UNIX-ului, interpretorul de comenzi este un program obisnuit, cu nimic mai privilegiat ca altele. Utilizatorul are posibilitatea sa aleaga el ce program sa fie lansat la inceputul sesiunii.

Pe sistemul UNIX, interpretoarele de comenzi cele mai folosite sunt : sh (Bourne shell), csh (C shell), ksh (Korn shell).

In termenii utilizati de UNIX, fiecare program in executie este un proces. Comanda

$ datefolosita pentru a afla ora si data curente, declanseaza urmatoarea secventa de actiuni :

interpretorul de comenzi citeste comanda si o analizeaza; interpretorul de comenzi lanseaza procesul date, intrand totodata in

asteptarea terminarii acestuia (se spune ca el adoarme pe durata executiei comenzii); procesul date afiseaza informatia referitoare la data curenta; la terminarea procesului date, interpretorul de comenzi preia controlul si

afiseaza din nou prompter-ul, asteptand o noua comanda.La un moment dat, mai multe procese pot fi incepute si neterminate; spunem

ca ele sunt active. De ex., la executia comenzii date, sunt active interpretorul de comenzi si procesul date insusi.

Obs.: Daca cele doua procese sunt active, nu inseamna ca ele se executa simultan, ci doar ca executia ambelor a inceput si nu s-a terminat. In exemplul precedent, in timp ce se executa procesul date, interpretorul de comenzi asteapta terminarea lui.

Obs.: Oprirea unui program inainte de terminarea executiei sale se realizeaza cu CTRL+C. Utilizarea lui provoaca terminarea fortata a programului si reluarea controlului de catre interpretorul de comenzi.

Alte caractere de control sub UNIX: Ctrl-s – opreşte afişarea textului pe ecran Ctrl-q – reia afişarea textului pe ecran (oprită cu Ctrl-s) Ctrl-c – întrerupe activitatea curentă şi se foloseşte de regulă pentru a opri

procese sau afişări pe ecran. Ctrl-d – semnifică sfârşitul fişierului sau ieşire, fiind utilizat pentru a ieşi din

unele utilitare Unix, ieşirea unei ferestre terminal sau pentru logout. Ctrl-u – şterge întreaga linie de comandă, fiind o modalitate rapidă de a

şterge o linie de comandă pe care ne-am decis să nu o mai executăm. Ctrl-w – şterge ultimul cuvânt introdus la linia de comandă Ctrl-h – şterge ultimul caracter introdus la linia de comandă, fiind folosit

atunci când tasta <BACKSPACE> nu funcţionează

Gruparea comenzilor

Pot fi introduse mai multe comenzi pe aceeasi linie, separate prin ';'. De ex.:

$ pwd ; ls –lva afisa mai intai numele directorului curent (pwd) si apoi ii va afisa continutul (ls); procesele se executa secvential.

De asemenea, se pot grupa comenzi in forma : cmd1 | cmd2 | ... |cmdn

unde comenzile cmd1 , cmd2 ,..., cmdn sunt executate in paralel, iesirea standard a fiecarei comenzi (cu exceptia ultimei) fiind legata printr-o conducta cu intrarea standard a comenzii urmatoare. Ex.: vrem sa determinam cate fisiere contine directorul /bin. Pentru aceasta vom folosi comenzile ls - listare director si wc - numara linii:$ ls -l /bin | wc -l

Gruparea comenzilor sub forma :(lista comenzi)determina executia acestora ca un proces separat.Ex.:

$ pwd ; (cd ../test ; pwd) ; pwd /users/u1/demo /users/u1/test /users/u1/demo

Efectul comenzii cd din lista de comenzi inchisa intre paranteze este anulat la intalnirea parantezei inchise, deoarece cd a schimbat catalogul curent numai pentru subprocesul lansat pentru executarea acelei liste de comenzi.

Gruparea comenzilor sub forma :{lista comenzi ; }

executa lista de comenzi in cadrul procesului curent (atentie la punct si virgula inainte de acolada de inchidere).Ex.:

$ pwd ; {cd ../test ; pwd ; } ; pwd /users/u1/demo /users/u1/test /users/u1/test

Efectul comenzii cd se pastreaza si dupa terminarea listei de comenzi din acolade.

Lansarea comenzilor in fundal

Unele procese sunt neinteractive si au o durata mare de executie. Pentru astfel de procese, sistemul UNIX prevede un mod special de executie, in fundal (background). Pentru lansarea executiei in fundal a unui proces, comanda trebuie terminata cu caracterul &. De ex.:

$ calcul & Odata executia pornita, sistemul afiseaza identificatorul procesului lansat in fundal si apoi prompter-ul, utilizatorul putand introduce alte comenzi. Acestea pot fi executate in prim plan (foreground) sau in fundal (background), daca se specifica acest lucru.

Distrugerea proceselor ce ruleaza in fundal se realizeaza cu ajutorul comenzii kill, avand ca parametru identificatorul procesului vizat, comunicat de sistem la lansarea procesului in fundal. (nu se poate realiza cu CTRL+C deoarece procesele in fundal nu interactioneaza cu utilizatorul prin terminal).

Uzual, se executa in fundal procese care au o durata mare si care iau datele de intrare din fisiere deja pregatite, punand rezultatele in alte fisiere, pe care utilizatorul le poate inspecta si folosi ulterior. La terminarea executiei unui astfel de proces, interpretorul de comenzi afiseaza un mesaj informativ, de genul 'procesul cu identificatorul ... s-a terminat'.

Fisiere standard. Redirectare

Dupa initializarea sesiunii de lucru, se deschid 3 fisiere standard (0, 1 si 2) pentru intrare, iesire si afisarea erorilor. Ele sunt atribuite terminalului de la care se lucreaza (tastatura si ecranul). In momentul lansarii in executie a programului asociat unei comenzi, acesta mosteneste (ca proces "fiu") fisierele deschise, deci si pe cele standard.Interpretorul de comenzi permite insa redirectarea fisierelor standard spre alte periferice:

cu '<' se redirecteaza fisierul standard de intrare. Acest lucru inseamna ca programul lansat in executie nu va lua datele de intrare de la tastatura, ci din fisierul indicat dupa '<';

cu '>' se redirecteaza fisierul standard de iesire. Informatia ce trebuie afisata pe ecranul terminalului va fi scrisa in fisierul indicat dupa '>'. De exemplu, $ ls -l >fis va crea fisierul fis, unde va depune informatiile din directorul curent. Daca fisierul fis exista anterior si dorim sa se pastreze informatia din el se foloseste operatorul '>>' in loc de '>' (operatia append).

Comenzi pentru gestiunea directoarelorPentru descrierea comenzilor se vor folosi urmatoarele semne:

[identificator] - cimp optional; (identificator) - identificator de fisier sau director; identificator... - identificatorul se repeta de un numar nedefinit de ori;

1. pwd functia: tipareste numele (calea) directorului curent; sintaxa: pwd explicatii:comanda afiseaza calea completa, pornind din root, a directorului in

care lucreaza utilizatorul. Este folosita pentru a vedea unde este plasat directorul curent in structura directoarelor sistemului.

2. cd functia:schimba directorul curent sintaxa: cd (director) explicatii:se abandoneaza directorul curent iar directorul specificat devine

director curent.cd .. -directorul parinte devine director curent;

3. ls functia:listeaza continutul unui director; sintaxa:ls [optiuni] (fisier)... explicatii:Se afiseaza la terminal continutul oricarui director din lista si pentru

fisiere, anumite informatii conform cu optiunile. Daca nu se precizeaza nici un fisier, atunci se listeaza directorul curent.

Optiunile cele mai importante sunt: -d -listeaza doar numele directoarelor; -i -indica i-number-ul fiecarui fisier; -l -listeaza mai multe informatii despre fisiere; -g -se indica si identificatorul grupului proprietar al fisierului; -r -listare in ordine invers alfabetica; -s -dimensiunea fisierelor se da in numar de blocuri; -t -se sorteaza fisierele, inainte de afisare, dupa data ultimei modificari;

Optiunea -l permite afisarea informatiilor complete despre fisiere, si anume: cimpul mod:

d pentru fisier director; c pentru fisier special de tip caracter; b pentru fisier special de tip bloc; - pentru fisier ordinar;

drepturile proprietarului:read(r), write(w), execute(x); drepturile grupului:r,w,x; drepturile celorlalti:r,w,x; numarul de legaturi ale fisierului; numele proprietarului; numele grupului; dimensiunea fisierului (in bytes); data ultimei modificari; numele fisierului;

Exemplificare parametri comanda lsls –a afiseaza si fisierele ascunse ex: .profilels – l afiseaza informatii suplimentare legate de fisierels –al combina situatiile de mai susls –alr afiseaza informatii suplimentare despre fisiere si inclusiv subdirectoarels –d afiseaza informatii despre director si nu despre continutul luils –F afiseaza informatii in legatura cu tipul fisierului astfel:

* - fisier executabil @ - legatura simbolica Nici un simbol - fisier ascii

4. mkdir functia:creaza un director nou sintaxa:mkdir (director) explicatii:Creaza un nou director, cu numele specificat, pe care il leaga la

directorul curent. Sunt setate automat si drepturile de acces.5. rmdir

functia:sterge un director sintaxa:rmdir (director) explicatii:Directorul specificat este sters doar daca este vid; daca directorul nu

este vid, este necesara stergerea prealabila a fisierelor continute folosind comanda rm.

Utilizarea comenzii rm pentru stergerea unui fisier

Utilizarea comenzii rm pentru stergerea unui director cu continut

Comenzi informative si pentru terminale1. man

functia:afiseaza capitole din manualul de utilizare sintaxa:man [optiuni] [(capitol)] (sectiune) explicatii:Permite afisarea manualului sistemului Unix in timpul sesiunii de

lucru. (capitol) este numarul capitolului in care se cauta (sectiune). Se foloseste cel mai des sub forma man (comanda) pentru afisarea informatiilor despre comanda specificata.

2. cal functia:afiseaza calendarul sintaxa:cal [luna] an explicatii:Clar !

3. date functia: afiseaza data si ora sintaxa:date

4. finger functia:afiseaza numele utilizatorilor conectati la sistem sintaxa:finger [(nume)] explicatii:Daca se specifica numele unui utilizator, se dau informatii despre

acesta

5. passwd functia:schimba parola sintaxa:passwd

6. tty functia: afiseaza numele terminalului sintaxa: tty

7. write functia: trimite imediat un mesaj la un alt utilizator sintaxa:write (utilizator) explicatii:Dupa scrierea comenzii se scrie mesajul, incheiat cu CTRL+D

Precizati functia si sintaxa comenzii last.

Comenzi pentru gestiunea fisierelor1. cat

functia:concateneaza fisiere text si afiseaza sintaxa:cat (fisier) explicatii:Comanda permite ca mai multe fisiere sa fie concatenate intr-un

singur sir de iesire, care va fi listat la terminal.Exemple:cat fis1

afiseaza fisierul fis1;cat fis1 fis2 >fisiernou

concateneaza fisierele fis1 si fis2 si depune rezultatul in fisiernou; comanda este echivalenta cu cat fis[12] >fisiernou

cat >fis permite crearea unui fisier text de la tastatura, introducerea continutului

terminindu-se cu CTRL+D;

Comanda tac este inversa comenzii cat, producand afisarea unui fisier linie cu linie de la sfirsitul lui catre inceputul acestuia. Comenzile head si tail produc afisarea primelor, respectiv ultimelor n linii dintr-un fisier (n fiind specificat ca optiune).

Comanda pg realizeaza afisare cu paginare, iar od permite obtinerea imaginii memorie a unui fisier.

2. lpr functia:tipareste un fisier text la imprimanta sintaxa:lpr [optiuni] [(fisier)...]

3. wc functia:numara caracterele, cuvintele si liniile unui fisier text; sintaxa:wc [optiuni] [(fisier)...] explicatii:Optiunile sunt:

1. -w pentru numararea cuvintelor;2. -c pentru a numara bytes;3. -l pentru numararea liniilor;4. -m numara caracterele utilizate5. -l* toate optiunile de mai sus

4. diff functia:gaseste diferentele dintre doua fisiere text sintaxa:diff [optiuni] (fis1) (fis2) explicatii:Cele doua fisiere sunt comparate linie cu linie, indicindu-se la

terminal ce trebuie facut pentru ca fisierele sa fie identice. Liniile precedate de >= apar in fis2 si nu apar in fis1, iar cele precedate de < apar in fis1 si nu apar in fis2.

diff –i fisier1.txt fisier2.txt ignora diferentele de litere mari si micidiff –c fisier1.txt fisier2.txt afiseaza toate diferentele

5. grep functia:filtreaza liniile unui fisier text cautand sabloane sintaxa:grep [optiuni] [sir de caractere] (fisier) explicatii:Utilizatorul citeste unul sau mai multe fisiere text cautand in fiecare

un anumit sir de caractere (sablon). Daca nu se specifica optiuni, sunt afisate toate liniile care contin sablonul. Optiuni:

1. –c produce un contor al liniilor ce contin sablonul, in loc de a le afisa;

2. –v afiseaza liniile care nu contin sablonul 3. –i ignora diferentele dintre literele mici si mari4. –w cauta un cuvant

5. –n afiseaza numarul liniei pe care a identificat sablonul cautat6. –l listeaza numele fisierelor ce contin sablonul cautat

Exemple :

Daca sirul de cautare contine spatiu este necesar sa il precizam intre ghilimele.

Pentru a cauta un anumit sablon in fisierele din directorul curent utilizam tag-ul –l astfel :

Daca stim ca sirul de cautare se afla la inceputul unei linii atunci vom preciza la inceputul sirului de cautare accentul circumflex ^ si simbolul $ pentru sfarsitul liniei astfel :

Astfel identificam o linie goala de continut.

Astfel identificam o linie ce contine un singur caracter.

Pentru a realiza cautarea sablonul poate avea una din urmatoarele sintaxe:

Sablon Explicatieabc Exact acest string: “abc”[abc] Unul dintre aceste caractere: “a”, “b” sau “c”[^abc] Niciunul dintre aceste caractere nu trebuie sa apara[a-c] Un caracter între “a” si “c”. Orice caracter

Alte exemple:

Pentru a cauta in fisiere arhivate se utilizeaza comenzile zgrep si bzgrep.6. comm

functia:gaseste si afiseaza toate liniile comune a doua fisiere text; sintaxa:comm [optiuni] (fis1) (fis2) explicatii:Cele doua fisiere vor trebui prealabil sortate alfabetic (functia sort).

7. file functia:determina tipul unui fisier sintaxa:file (fisier)... explicatii:Comanda determina daca fisierele indicate sunt de tip obiect, sursa

sau oarecare. Pentru fisierele sursa incearca sa determine limbajul in care au fost scrise.

file f* afiseaza tipul fisierelor a caror denumire incepe cu simbolul f

8. find functia:gaseste un fisier intr-un subarbore al sistemului de fisiere sintaxa:find (director)...(conditie) explicatii:Se cauta in directoarele specificate si in subdirectoarele lor fisierele care satisfac acea conditie. Conditiile se precizeaza prin optiuni:

1. name (fisier) - specifica numele fisierului cautat;2. atime [+|-] (n) - specifica toate fisierele accesate in ultimele n zile;3. mtime [+|-] (n) - specifica toate fisierele modificate in ultimele (n) zile;4. print - pentru afisarea pe ecran este -print.5. type (i) - specifica tipul fisierului cautat:f-ordinar, d-director c -special

caracter, b-special bloc;6. -perm mod - cauta toate fisierele care satisfac criteriul de permisiuni

specificat (folosind notatia octala).7. -size - cauta toate fisierele care au dimensiunea exacta, mai mare (+)

sau mai mica (-) decat n (n reprezinta blocuri de 512 octeti, sau caractere daca este urmat de c).

8. -exec - 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.

Afisarea arborelui de directoare cu ajutorul comenzii find .

Exemplificare : Cautarea tuturor fisierelor care au o denumire ce incepe cu “f”

find ~/director -name “f*” –print Cautarea tuturor fisierelor care au anumite permisiuni:

find ~/ director -perm 644 -print

Pentru a afisa calea si continutul directorului curent inclusiv fisierele subdirectorului subdir putem utiliza optiunea –prune a comenzii find dupa urmeaza. Atentie la cele doua comenzi ilustrate si diferentele dintre ele!

Pentru a afisa calea si continutul directorului curent exclusiv fisierele subdirectorului subdir putem utiliza optiunea –prune a comenzii find dupa urmeaza.

In continuare veti observa un exemplu de utilizare a comenzii find cu optiunea –exec. In sectiunea exec se dau drepturi de acces complete fisierelor identificate cu ajutorul comenzii find.In sectiunea exec a comenzii find se poate utilize orice comanda cunoscuta de dvs.

Sintaxa acestor exemple este in conformitate cu distributia instalata pe serverul infocib.ase.ro. Daca veti testa aceste comenzi distributia instalata pe serverul venus.ase.ro utilizati urmatoarea sintaxa:find . -name "f*" -exec chmod 777 '{}' \; -printfind . -name "f*" -exec grep "bin/bash" '{}' \; -printfind . -name "f*" -exec grep "bin/bash" '{}' \; -print

In urmatorul exemplu se vor afisa doar fisierele a caror nume incepe cu litera s si contin sablonul bin/bash.Sintaxa acestor exemple este in conformitate cu distributia instalata pe serverul infocib.ase.ro. Daca veti testa aceste comenzi distributia instalata pe serverul venus.ase.ro utilizati urmatoarea sintaxa:find . -name "f*" -exec grep "bin/bash" '{}' \; -print

9. rm functia:sterge fisiere sintaxa:rm [optiuni] (fisier)... explicatii: Sterge fisierele indicate din directorul curent.

Principalele optiuni permise sunt:1. -i -intreaba utilizatorul inainte de stergerea fiecarui fisier;2. -r -cere confirmarea de stergere inainte de stergerea fiecarui

subdirector;3. -f -sterge fisierul fara a analiza daca exista dreptul de scriere in fisier;

Exemple:

rm -i * , sterge toate fisierele din directorul curent, cu confirmarerm -r director, sterge tot subarborele ce are radacina in (director)

10. mv functia:muta/redenumeste un fisier sintaxa:mv (fis1) (fis2) sau mv (fisier)...(director) explicatii:In prima forma va redenumi fis1, iar in a doua forma va muta

fisierele specificate in directorul (director)Utilizarea comenzii mv pentru redenumirea unui fisier din directorul curent si a unui subdirector din directorul curent

Utilizarea comenzii mv pentru mutarea unor fisiere din dintr-un subdirector in directorul parinte al acestuia.

11. crypt functia:cifreaza un fisier sintaxa:crypt [parola] < (fis1) >(fis2) explicatii:Cifreaza fisierul (fis1), folosind drept cheie de cifrare [parola] si

depune rezultatul in (fis2). Daca nu se furnizeaza parola atunci este ceruta explicit de program.

12. cp functia: copiaza un fisier sintaxa:cp (fis1) (fis2) sau cp (fisier)...(director)

Utilizarea comenzii cp pentru copierea tuturor fisierelor dintr-un director sursa intr-un director destinatie.

13. chown si chgrp functia:schimba proprietarul, respectiv grupul, la care este afiliat un fisier sintaxa:chown (nou proprietar) (fisier) chgrp (nou grup) (fisier)

14. chmod functia:schimba drepturile de acces pentru un fisier sintaxa:chmod (drepturi) (fisier)

explicatii:Comanda poate fi utilizata doar de proprietarul fisierului, precizarea drepturilor facandu-se sub forma: (cine) (op) (drept), unde:

1. (cine) reprezinta:u-proprietar, g-grupul, o-ceilalti,a (toti)2. (drept)-r,w,x3. (op) operatorul aplicat: - (retrage drept), + (adauga drept),=

(asigneaza drept)Exemple:chmod a+r fis -acorda drepturi de citire tuturor utilizatorilor fisierului fis;chmod go-rw fis -retrage drepturile de citire pentru grup si ceilalti;chmod a=rwx fis -asigneaza tuturor drepturi complete asupra fisierului;chmod a-w -retrage dreptul de a crea fisiere in directorul curent;

Comenzi pentru gestiunea fisierelor 15. Pentru a salva spatiu pe disc si a nu face o copie a unui fisier, de multe ori

putem crea o legatura (link) catre acesta. In acest mod putem accesa fisierul specificat si din alte locatii de pe hard disk. Crearea de astfel de fisiere tip legatura este utila atunci cand mai multi utilizatori trebuie sa lucreze asupra aceluiasi fisier (un proiect la care lucreaza o echipa de programatori, de exemplu) sau atunci cand se doreste o referinta la un fisier utilizandu-se un nume mai scurt. Comanda folosita este comanda ln (link) iar formatul general al este:ln fisier fisier_nouComanda anterioara creaza un link pentru fisierul fisier in directorul curent, cu numele fisier_nou; pentru crearea unei legaturi in alt director decat cel curent, vom folosi formatul: ln fisier director/fisier_nouAtunci cand este creat un fisier, este creata o legatura dintre director si acel fisier. Numarul de legaturi pentru fiecare fisier este de cel putin 1 (referinta proprie). Numarul de legaturi este afisat in cea de-a doua coloana a listingului comenzii ls -l. De fiecare data cand este creata o legatura catre un fisier, numarul de legaturi ale acelui fisier este incrementat.

16.In sistemele de operare Unix arhivarea si comprimarea sunt 2 termene separate.Prin arhivare se intelege crearea unui fisier care contine mai multe fisiere si directoare, pentru ca operatia de copiere pe o discheta sau banda sa fie mult mai simpla. Prin comprimare se intelege compresia datelor pentru a ocupa mai putin spatiu. Cele mai intalnite optiuni ale comenzii tar sunt c, t si x. Spre deosebire de majoritatea comenzilor UNIX, aceste optiuni nu trebuie neaparat precedate de semnul minus (-).Sintaxa generala a comenzii este urmatoarea:

tar functie [modificator] [fis_iesire] nume_fis |nume_dirFunctiile comenzii tar sunt urmatoarele: c (create) - este utilizata pentru a crea o arhiva dintr-un singur fisier sau director sau din mai multe fisiere sau directoare; t (table of contents) - este utilizata pentru a vedea un tabel cu continutul arhivei. Acest tabel reprezinta un listing cu fisierele ce compun fisierul arhiva de tip tar;x (extract) - este utilizata pentru a extrage fisiere dintr-o arhiva si a le separa din nou. Fisierul arhiva tar exista si dupa aceasta extragere.Cei mai utilizati modificatori ai functiilor sunt: f (file) - permite specificarea unui fisier tar pentru creare (c), extragere (x) sau vizualizarea tabelei de continut (t); v (verbose) - executa comanda in modul „vorbaret” care permite sa vedem rezultatele detaliate ale comenzii tar pe masura ce aceasta ruleaza.Arhivarea fisierelor text din directorul curent si dezarhivarea lor utilizand tar

Toate fisierele, inclusiv cele arhivate cu comanda tar, pot fi comprimate. Operatia de compresie a fisierelor este o operatie deosebit de utila deoarece reduce spatiul ocupat pe hard disc si in acelasi timp face ca fisierele comprimate sa fie disponibile pentru o utilizare ulterioara. Fisierele comprimate cu comanda compress sunt inlocuite cu un fisier cu acelasi nume cu cel original, dar care are extensia .Z (atentie, litera mare Z).

17.Comanda compress ofera posibilitatea compresiei mai multor fisiere o data, precum si folosirea metacaracterelor pentru specificarea mai multor fisiere.Ex: compress numefisier|numearhivaPentru decomprimare nu este neaparat necesar sa specificam extensia .Z, avand in vedere ca aceasta comanda cauta automat fisierul cu extensia implicita .Z. De asemenea, se pot decompresa mai multe fisiere o data, folosind metacaracterele * si ?. Pentru a vizualiza continutul unui fisier comprimat fara a face efectiv decomprimarea, se poate folosi optiunea –c astfel:

18. Comanda jar (Java archive) este asemanatoare cu comanda tar, dar inglobeaza si compresia fisierului intr-un singur pas. Fisierele arhivate sunt compresate prin

intermediul aplicatiei Java jar intr-o arhiva de acest tip. Utilitarul jar reprezinta un instrument de arhivare bazat pe formatele de compresie zip si zlib. Comanda jar este o comanda standard pentru sistemul de operare Solaris dar este disponibil pe orice sistem ce are instalat masina Administrarea fisierelor si directoarelor virtuala Java (JVM - Java Virtual Machine). Sintaxa generala a comenzii este foarte asemanatoare cu aceea a comenzii tar. Optiunile disponibile pentru comanda jar sunt urmatoarele:c Creeaza o noua arhiva jart Listeaza continutul fisierului jarx Extrage fisierele specificate din arhiva jarv Specifica executia in modul verboseExemplu de utilizare comanda jar

19. Comanda sort daca este apelata fara nici un parametru, ea va astepta introducerea liniilor de text de la tastatura (intrarea standard), pana la introducerea caracterului CTRL+D, dupa care va sorta liniile si le va afisa in ordine pe ecran (iesirea standard). Exemplu: comanda urmatoare preia liniile care trebuie sortate din fisierul date.txt, iar rezultatele vor fi afisate pe ecran. Se redirecteaza, deci, numai intrarea standard: sort < date.txt Pentru a redirecta numai iesirea, adica liniile de text sa fie citite de la tastatura, dar rezultatul sa fie scris intr-un fisier, se foloseste urmatoarea forma: sort > ordonat.txtRedirectarile se pot combina, astfel incat liniile sa fie citite dintr-un fisier, iar rezultatul sa fie scris in altul: sort < date.txt > ordonat.txt

Comenzi pentru gestiunea volumelor

1. df – afiseaza spatiul liber existent pe disc2. du - tipareste sumarul privind utilizarea discului intr-un subarbore

Comanda du –k afiseaza dimensiunea in blocuri de cate 1KB;

3. mount - montarea unui sistem de fisiere4. unmount –demontarea unui sistem de fisiere

Comenzi pentru gestiunea proceselor

1. kill – opreşte un proces în curs de execuţiekill -9 PID_proces

2. nice funcţia: lansează un proces cu prioritate redusă. Prioritatea este un număr. O prioritate mare înseamnă un număr mic. Administratorul poate lansa procese cu prioritate negativă. Priorităţile utilizate cu această comandă trebuie să fie până la 20, altfel dacă prioritatea nu se precizează se incrementeză cu 10 prioritatea implicită a sistemului. Procesele lansate cu nice sunt procese care necesită un timp îndelungat de execuţie şi ca atare se lansează în background.

3. at funcţia: lansează în execuţie un fişier de comenzi Shell la un moment de timp

specificat sintaxa: at timp [data] [fişier]at 17 jan2 prog.sh - pe 2 ian. ora 17

4. atq funcţia: afişează procesele lansate în execuţie utilizând comanda at (cele care încă nu s-au lansat sau care se află în coada de aşteptare)

5. atrmfuncţia: şterge procesele lansate în execuţie utilizând comanda at (cele care încă nu s-au lansat sau care se află în coada de aşteptare). Opţiunea –a se utilizează dacă doriţi să ştergeţi toate task-urile iar opţiunea -i dacă doriţi confirmare la ştergerea task-urilor planificate.

6. ps funcţia: oferă informaţii despre procesele active. Indică PID sau identificatorul procesului, PPID sau identificatorul procesului părinte, TT terminalul de control al procesului, STAT starea procesului(starea execuţiei, dacă imaginea procesului se află în memorie, prioritatea procesului), TIME durata procesului. Procesul poate fi în execuţie(r), în aşteptare(w), suspendat(s), oprit(t), terminat(y) sau inexistent(o).

ps -ef | grep nume_script – identifica PID-ul procesului ce ruleaza in bucla infinita

ps –ef afiseaza toate procesele in curs de executieps -a afişează toate procesele asociate cu terminalul

ps -l afişează toate informaţiile despre procese

7. sh - lansează în execuţie interpretorul Shell

8. sleep - suspendă temporar execuţia unui proces

9. time - furnizează timpul de execuţie a unei comenzi

Pentru a gestiona mai uşor fişierele şi directoarele puteţi utiliza utilitarul mc(midnight commander).

ExpresiiExpresiile regulate au rolul de a specifica multimi de siruri de caractere. Ele stabilesc un sablon pentru potriviri de text. Sunt utilizate in general pentru a identifica dintr-un text anumite siruri de caractere. Expresiile regulate descrise aici sunt recunoscute de majoritatea programelor utilitare. Editorul vi respectiv ed permit facilitati suplimentare. In general orice caracter ce apare intr-o expresie regulata identifica un caracter din text. Exista insa anumite caractere speciale care permit definirea de sabloane variabile. In expresiile regulate se utilizeaza doua tipuri de caractere:

caractere alfanumerice, care desemneaza exact caracterele reprezentate; caractere speciale sau operator care desemneaza repetitii, alegeri, optiuni,

etc. Caractere speciale: \ Caracter de protejare - anuleaza semnificatia speciala a caracterului care il urmeaza. . Caracter arbitrar (orice caracter). * + Operatori de repetitie:

a* orice numar de caractere a, chiar 0; a+ orice numar de caractere a, cel putin unul.

$ La sfârsitul unei expresii regulate marcheaza un sfârsit de linie. ^ La inceputul unei expresii regulate marcheaza inceput de linie. [s] Desemneaza o multime de caractere. In multimea s singurele caractere speciale sunt: -, ] si ^. De exemplu:

[abc] Unul dintre caracterele a, b sau c. [A-Za-z] O litera. [][] Unul dintre caracterele ']' sau '['. Caracterul '^' complementeaza o multime daca este la inceput. De

exemplu: [^0-9] Caracter nenumeric. O secventa de caractere dintr-o expresie regulata se poate delimita

prin '\(' si '\)'. Constructia este numita expresie regulata marcata. Aceasta expresie poate fi referita apoi prin '\i' cu i intre 1 si 9. De exemplu, expresia: \([a-z]*\)\&\1 Selecteaza sirul 'adi\&adi'.

Doua expresii regulate separate prin '|' semnifica una dintre ele (alternativa). De exemplu: (ab|cd+)?(ef)* Pe prima pozitie apare sau nu, ab sau c urmat de cel putin un d, si urmat de oricâte grupuri de ef. Expresiile regulate intre paranteze simple realizeaza o grupare. De exemplu: (a|b)(c|d) Identifica ac, ad, bc sau bd. " Toate caracterele situate intre " isi pierd semnificatia speciala. / Indica contextul urmator. De exemplu: ab/cd ab doar daca este urmat de cd. {} Semnifica repetitii ale unei expresii. De exemplu: a\{1,5\} Una pâna la cinci aparitii ale lui a. exp\{6,\} Cel putin 6 aparitii ale expresiei exp. exp\{2\} Exact doua aparitii ale expresiei exp. [0-9]\{2,\} Secventa din doua sau mai multe cifre. Daca mai multe caractere speciale apar intr-o expresie regulata se aplica regula de precedenta. Conform acesteea, precedenta cea mai mare o are [] dupa care grupul *, + si ? si ultimul este |. La inlocuirea sirurilor de caractere specificate prin expresii regulate caracterul '&' identifica expresia regulata. Pentru a genera caracterul '&' acesta trebuie prefixat de \. Caracterul '\' urmat de <Enter> genereaza o linie noua.

Editorul vi. Modurile de lucru in vi

Pentru editorul vi exista trei moduri de lucru: modul comanda, modul introducere si modul ultima-linie (last line). Toate comenzile disponibile in vi pot fi clasificate in unul dintre aceste trei moduri de lucru.sintaxa: vi [-r | -R] [+poziţionare] [fişier] unde: -r Încarcă ultima versiune salvată înainte de căderea sistemului. -R Se interzice modificarea conţinutului fişierului. Dacă se specifică poziţionare cursorul se poziţionează pe linia specificată (+nr_linie) sau pe şirul căutat (+/sir_căutat). Caracteristicile de baza ale celor trei moduri de lucru sunt urmatoarele:

1. Modul comanda - este modul initial de lucru folosit pentru crearea si editarea fisierelor, pozitionarea cursorului si modificarea textului deja existent. Toate comenzile se introduc plecand de la acest mod de lucru. Apasarea tastei <ESC> din unul din celelalte doua moduri de lucru determina trecerea in modul comanda;

2. Modul introducere (sau editare) - este utilizat pentru introducerea de text. Introducerea unei comenzi de genul i (pentru inserare), a (pentru adaugare) sau o (pentru deschiderea unei linii noi) determina trecerea din modul comanda in modul introducere. Apasarea tastei <ESC> determina intoarcerea in modul comanda. Comenzile de introducere sunt date fara a se apasa dupa ele tasta <ENTER>;

3. Modul ultima-linie - este folosit pentru salvarea documentului editat si pentru iesirea din vi. Apasarea tastei „:” determina trecerea in acest mod de lucru. Apasarea tastei <ENTER> sau a tastei <ESC> determina trecerea in modul comanda.

Modul comanda este modul initial de lucru al editorului vi. In momentul pornirii editorului vi, automat se intra in modul comanda. In acest mod de lucru se pot introduce fie comenzi pentru pozitionarea cursorului in cadrul fisierului, fie comenzi de editare pentru inserarea de noi caractere sau modificarea continutului deja existent. Pentru a ajunge din modul introducere in modul ultima-linie sau invers, trebuie sa trecem mai intai prin modul comanda. Toate comenzile sunt initiate din modul comanda. Apasarea tastei <ESC> ne plaseaza mereu in modul comanda, de aceea putem utiliza tasta <ESC> in cazul in care nu stim in ce mod de lucru ne aflam.Modul introducere (editare) reprezinta modul in care trebuie sa ne aflam pentru a introduce text. Pentru introducerea de text, trebuie sa dam o comanda (prin simpla apasare a unei taste) cum ar fi i (insert - inserare), o (open new line - linie noua) sau a (append - adaugare). Introducerea unei dintre comenzile anterioare determina trecerea din modul comanda in modul introducere. In acest mod putem introduce noi caractere in textul initial, apoi putem apasa tasta <ESC> pentru a ne intoarce in modul comanda. Modul ultima-linie este modul in care putem ajunge prin apasarea tastei “:”, ceea ce determina pozitionarea cursorului pe ultima linie a ecranului (de aici provine si denumirea acestui mod de lucru). Modificarile facute asupra fisierului sunt mentinute intr-o memorie tampon pana in momentul in care acestea sunt salvate pe disc. Utilizand modul ultima-linie, putem salva periodic modificarile facute asupra fisierului fie ramanand in vi, fie salvand si parasind editorul. De asemenea, se poate iesi din editor fara a salva modificarile facute. Modul ultima-linie este folosit si pentru a cauta siruri de caractere sau pentru a seta anumite preferinte de editare.Pentru a salva un fisier si a iesi din editorul vi, trebuie mai intai sa ne pozitionam in modul de lucru ultima-linie prin apasarea tastei „:”. Pentru a salva fisierul este de ajuns sa tastam :w. Daca dorim sa salvam fisierul cu alt nume, vom introduce comanda :w nume_nou_fisier. Pentru a salva fisierul si a iesi din vi, se poate tasta fie :wq, fie ZZ (direct din modul comanda). Daca dorim sa iesim din fisier fara sa salvam modificarile facute, putem introduce comanda :q!. In cazul in care se deschide un fisier read-only (poate fi doar citit, nu si modificat) care se

doreste a fi modificat, se pot salva modificarile facute prin introducerea comenzii :wq! (write-quit). Daca se doreste renuntarea la toate modificarile facute de la ultima salvare, se poate folosi comanda :e! (erase) care sterge modificarile din buffer si incepe editarea din nou

Comenzi de baza pentru pozitionarea cursorului in vi

Comanda j (sageata in jos) Deplasare o linie in josk (sageata in sus) Deplasare o linie in sush (sageata stanga) Deplasare cu un caracter la stangal (sageata dreapta) Deplasare cu un caracter la dreaptaTasta <SPACE> Deplasare la dreapta cu un caracterw Deplasare la dreapta cu un cuvantb Deplasare la stanga cu un cuvant$ Deplasare la sfarsitul liniei0 sau ^ Deplasare la inceputul linieiTasta <RETURN> Deplasare la inceputul liniei urmatoare

Comenzi de baza pentru stergerea textului in vi

Comanda x Se sterge caracterul din dreptul cursoruluidw Se sterge cuvantul situat la dreapta cursorului5dw Se sterg 5 cuvinte la dreaptadd Se sterge intraga linie pe care este pozitionat cursorul2dd Se sterg 2 linii incepand cu linia curenta3x Se sterg 3 caractere incepand cu cel din dreptul cursorului

Comenzi de baza pentru copiere, alipire, modificare si anulare in vi

Comandacw Are ca efect modificarea cuvantului (sau a partii din cuvant) de

la cursor pana la sfarsitul cuvantului. Se pozitioneaza cursorul in locul de unde dorim sa incepem modificarea, apoi se apasa cw, se introduce noul cuvant si se apasa in final tasta <ESC>

5cw Se modifica 5 cuvinter Se inlocuieste caracterul pe care este pozitionat cursorul cu alt

caracteru Are ca efect anularea ultimei comenzidd, apoi p Sterge, apoi alipeste (paste)yy, apoi p Copiaza, apoi alipesteyy Copiaza o liniep Alipeste linia copiata sau stearsa sub linia curentaP Alipeste linia copiata sau stearsa deasupra liniei curente

Vom construi un program (shell-script) care cuprinde comenzi UNIX si constructori de control shell; utilizand editorul vi , vom scrie comenzile si constructiile shell si vom salva fisierul cu un nume oarecare (script.sh, spre exemplu). Liniile din cadrul shell-script-ului vor fi interpretate una cate una de catre shell (avem de-a face cu programe interpretate, nu compilate). De regula, prima linie dintr-un fisier shell-script indica tipul de shell utilizat. Spre exemplu, daca folosim shell-ul Bourne, prima linie va arata astfel:#!/bin/shiar daca utilizam shell-ul bash, prima linie va arata:#!/bin/bashDupa ce salvam fisierul, trebuie sa ii dam drepturi de executie (vom folosi comanda chmod) si in acest moment suntem gata sa il rulam. Putem lansa in executie programul intitulat script.sh astfel (./ semnifica faptul ca acesta se afla in directorul de lucru curent):

$ ./script.sh

Vom edita urmatorul shell script in vi:#! /bin/csh -f

foreach name ($argv) if ( -f $name ) then echo -n "delete the file '${name}' (y/n/q)?" else echo -n "delete the entire directory '${name}' (y/n/q)? " endif set ans = $< switch ($ans) case n: continue case q: exit case y: rm -r $name continue endsw end

Editaţi fişierul de mai sus utilizând editorul mcedit şi editorul joe.

În cadrul editorului joe amintim combinaţiile de taste (comenzi) permise, ca:

Ctrl – Z salt la cuvântul precedent Ctrl – X salt la următorul cuvânt Ctrl – K F căutare în text Ctrl – L continuarea căutării Ctrl – K L salt la o anumită linie Ctrl – K B marchează începutul blocului Ctrl – K K marchează sfârşitul blocului Ctrl – K M mută conţinutul blocului Ctrl – K C face o copie a conţinutului blocului Ctrl – K Y şterge conţinutul blocului Ctrl – Y şterge linia curentă Ctrl – K X paraseşte editorul salvând fişierul.

Comanda test verifica indeplinirea unei conditii si intoarce o valoare care sa marcheze acest lucru. Pentru a se cunoaste rezultatul testului, se foloseste variabila $?. Aceasta are valoarea 0 daca testul este pozitiv (conditie adevarata) si o valoare diferita de 0 in caz contrar. Comanda test realizeaza urmatoarele teste:

teste asupra fisierelor teste asupra sirurilor de caractere teste numericeOperatori:

Pentru fisiere: -d <fis> este director? -f <fis> este fisier obisnuit? -r <fis> poate fi citit? -s <fis> are lungime diferita de 0? -w <fis> poate fi modificat? -x <fis> este fisier executabil?

Exemple:

$ ls -las

$test –f stud.dat; echo $?$test –d stud.dat; echo $?$test –w stud.dat; echo $?$[ -r stud.dat ] ; echo $?$[ -w stud.dat ] ; echo $?

Pentru siruri de caractere:

<sir> este sirul nenul? -n <sir> are sirul lungimea diferita de 0? -z <sir> are sirul lungimea 0? <sir1>=<sir2> sirurile sunt identice? <sir1>!=<sir2> sirurile sunt diferite?

Exemple:

$sir1 =dan

$sir2 =maria$sir3 =dan$sir4 =Care din urmatoarele comenzi au ca exit status 0?[ “$sir1” = “$sir2” ];echo $?[ - z $sir3 ];echo $?[ - n $sir4 ];echo $?[ “$sir1” = “$sir3” ];echo $?[ $sir4 ];echo $?

Pentru tipul integer: -eq int1=int2 -ge int1>= int2 -gt int1> int2 -le int1<= int2 -lt int1< int2 -ne int1 diferit de int2

Exemple:

$int1 =5

$int2 =10$int3 =55$int4 =5Ce afiseaza comenzile?[ “$int1” -gt “$int2” ];echo $?[ ”$int2” -lt “$int3” ];echo $?[ ”$int4” -le “$int1” ];echo $?[ ”$int3” -ne “$int4” ];echo $?[ “$int4” -ge “$int1” ];echo $?

$int1 =007

$int2 =7[ “$int1” = “$int2” ];echo $?

[ “$int1” -eq “$int2” ];echo $?

Pentru tipul boolean: !<exp> expresie falsa? <exp1> -a <exp2> ambele adevarate? <exp1> -o <exp2> una din ele adevarata?

Exemple:

$v1 =5

$v2 =10Ce afiseaza comenzile?[ !”$v1” -eq “$v2” ];echo $?[ -f “stud.dat” –a –x “stud.dat” ];echo $?[ “$v1” -gt 1 –a “$v1” –lt 90 ];echo $?

Alte exemple:

test ! -s “$f” - returneaza valoarea 0 daca fisierul cu numele continut de variabila $f este vid.test -d “$f” -a -x “$f” - returneaza 0 daca fisierul $f este un director si avem drept de executie.test -c “$1” -o -b “$1” && echo “Fisier asociat unui periferic” - returneaza 0 daca primul argument al liniei de comanda este un fisier special de tip caracter sau bloc; in acest caz se afiseaza si mesajul corespunzator.

Pentru tipul logic: && ||

comanda1 && comanda2: comanda2 se executa doar daca exit status-ul comenzii 1 este 0

comanda1 || comanda2: comanda2 se executa doar daca exit status-ul comenzii 1 este diferit de 0

Exemplu:

[ -x “script.sh” ] && ./script.sh

Operatori aritmetici:+,-,*,/,%OBS operanzii si operatorii se separa intotdeauna prin spatii caracterul * este special si atunci se va utiliza intotdeauna insotit de

caracterul \Exemplu:

$x =5

$y =10$z=10expr $x \* $y \* $zoperatia de incrementare:var = ` expr $var + 1 `

Variabile Shell Referirea variabilelor: $var Atribuire valori: var= valoare

x=Miercuri este o operatie de atribuire, in urma careia variabila x este declarata ca variabila sir de caractere si primeste valoarea “Miercuri”. Nu lasati spatii inainte sau dupa semnul “=“ !

In bash exista patru interpretari ale valorii unei variabile, astfel :1. nu este incadrata intre ghilimele ( $var ) - sirul de caractere atribuit

variabilei ramane la fel, cu exceptia spatiilor albe consecutive, care sunt reduse la unul singur

2. intre ghilimele simple ( ’$var’ ) - sirul de caractere isi pastreaza valoarea literala, adica NU se inlocuiesc variabilele ce apar in interiorul sirului cu valorile lor

3. intre ghilimele duble ( “$var” ) - variabilele sunt expandate si sunt permise caractere speciale ( de ex. \n, \t, \nnn pt. caracter ASCII in octal etc.) ; in plus, spatierea in cadrul sirului se pastreaza (variabila se comporta ca un singur cuvant)

4. intre backquotes ( `$var` ) - valoarea expresiei ‘$var‘ este output-ul obtinut in urma executiei efective a sirului de caractere “$var”

Diferentele sunt ilustrate in exemplul urmator:

Un nume de variabila poate contine litere mari si mici, cifre si caracterul “_”; Un identificator nu poate incepe cu o cifra (evitati folosirea ca prim caracter a

caracterului “_”); Lungimea identificatorului nu este, teoretic, limitata; Prin conventie, variabilele definite de utilizator se scriu cu litere mici; Declararea unei variabile se face implicit prin atribuirea unei valori ; Variabilele utilizate in testare sunt incadrate de ghilimele acestea avand rolul

de separator pentru caracterul null; Sunt de 3 tipuri:

1. Ale sistemului Foarte multe utilitare lucreaza cu variabile a caror valoare este

predefinita si care sunt la dispozitia tuturor utilizatorilor (le vom numi variabile sistem). De obicei, variabilele sistem sunt scrise cu litere mari, pentru a le deosebi de variabilele definite de utilizator. Modificarea valorii unei variabile sistem poate crea neplaceri, deoarece utilitarele care folosesc valoarea variabilei vor lucra defectuos !!!

initializate de shell la deschiderea unei sesiuni cu valori precizate in fisierele /etc/environment, /etc/profile, .profile din HomeDirectory; acestea sunt: $HOME - contine calea de acces absolut spre directorul personal, $PATH -contine caile in care shell cauta programele, de regula /usr/bin si /bin, $PS!, $PS@, $LOGNAME, $MAIL, $SHELL, $TERM

lista acestor variabile de mediu poate fi vizualizata cu ajutorul comenzilor env sau set

exemplu: prin intermediul variabilei PS1 avem posibilitatea de a defini prompterul intr-o maniera rafinata. Observati care este setarea implicita a variabilei PS1 executand comanda set|more. Veti constata ca pe serverul venus.ase.ro PS1=’ \s-\v\$ ’\s semnifica numele shell-ului, \v versiunea curenta bash, \$ simbolul $. In ecranul urmator veti vizualiza cum se poate schimba prompter-ul.

Identificam care este tipul de shell implicit.

Schimbam calea curenta catre directorul personal.

Un shell script care verifica tipul utilizatorului legat utilizand doua variabile de sistem : $USER si $ROOTUSER_NAME.

Scriptul rescris utilizand alte variabile de sistem $UID si $ROOT_UID.

Alte variabile de sistem.

In terminologia Unix, se folosesc termenii de variabila de shell si variabila de mediu, cu semnificatii diferite:   variabila de shell este o variabila accesibila doar procesului shell curent, pe cind variabila de mediu este o variabila accesibila tuturor proceselor fii ale acelui proces shell ( este o variabila exportata).

2. Ale shell-ului – modificate dinamic de interpretor, pe care utilizatorul nu le poate modifica; acestea sunt: $#, $?, $$, $n (n=1-9), $@;

Numarul de argumente pozitionale pentru shell: $# Numele shell script-ului este: $0 Argumentele sunt: $@ Identificatorul de proces al shell-ului activ: $$ Argumentul al 2-lea este: $2 Contine codul de revenire(exit status)a ultimei comenzi

executate:$?

Identificatorul (pid) ultimului proces lansat in paralel:$!Pentru a putea furniza si argumente in linia de comanda a unui script, se folosesc parametri de pozitie, prin care sunt disponibile valorile acestora. Parametri de pozitie sunt notati cu $1, $2,..., $9. $0 contine numele scriptului, $1 contine primul parametru, $2 contine al doilea parametru e.t.c.Variabila speciala $# va contine numarul parametrilor de pe linia de comanda, fiind utila pentru testarea existentei tuturor argumentelor necesare scriptului respectiv. Exista posibilitatea folosirii a mai mult de noua parametri in linia de comanda.

Urmeaza utilizarea parametrului pozitional $!.

3. Ale utilizatorului Definite de utilizator;

$TEST1=“HELLO WORLD”$echo $TEST1HELLO WORD

Trimiterea variabilelor comenzilor$DEMO=/usr/bin$echo $DEMO/usr/bin$cd $DEMO$pwd/usr/bin

Trimiterea var. comenzilor ca parte a unei comenzi (cu{})$name=gr1000$echo $namegr1000$echo ${name}agr1000a$echo $name agr1000 a Trimiterea iesirilor comenzilor catre variabile (comanda trebuie

sa fie intre ` `, altfel o interpreteaza ca text (nu ’ ’sau “ “)$TODAY=`date`$echo $TODAY $DIR=`ls –la`$echo $DIR

Definirea variabilelor de la tastatura - Pentru a avea un contact direct cu utilizatorul, in afara folosirii parametrilor de pozitie, exista pozibilitatea de a se introduce date prin intermediul comenzii read. Datele citite sunt transmise pe canalul de intrare standard si memorate in variabilele pasate ca parametrii din comanda read. Sintaxa este urmatoarea: read (variabila).La intalnirea unei comenzi read, shell-ul asteapta introducerea datelor si validarea lor prin apasarea tastei ENTER. Shell-ul imparte linia de intrare in cuvinte, afectand primul cuvant primei variabile, al doilea celei de-a doua variabile...Ultimele cuvinte sunt memorate in ultima variabila. Este de dorit ca orice comanda read sa fie precedata de un echo, pentru a explica utilizatorului ce dorim sa introduca.

$cat fisierecho Introduceti numele:read numeecho Hello $nume Operatii aritmetice (nu se permit paranteze; se utilizeaza

comanda expr; trebuie sa fie spatiu intre operator si expresie; pentru inmultire se foloseste \* )

$num = 2$expr $num +24$expr $num \* 24$rezultat = `expr $num \* 3`$echo $rezultat6 Manipulari de date (concatenarea variabila)$nume=steve$prenume=norton$fullname=`echo Numele este $nume $prenume`$echo $fullname >temp$cat tempNumele este steve norton Caracterele \, ’, “ (\ -schimba semnificatia caracterului

urmator); $echo “\” ““$a=fred$echo ’$a’$a (afiseaza textul $a)$echo “$a”fred

Interpretorul de comenzi al sistemului de operare Unix furnizeaza, pe langa posibilitatea de executare a comenzilor, un set de instructiuni care permite scrierea de programe asemanatoare celor scrise in limbaje de programare de nivel inalt. Fireste, posibilitatile acestui limbaj sunt mult mai slabe decat cele ale unui limbaj ca C ori Pascal, dar exista aplicatii in care efortul de programare este mult redus. Pe linga comenzile "obisnuite", care apar in orice sistem de operare, Unix furnizeaza si o multime de utilitare, mai ales pentru fisiere text. Limbajul Shell este puternic si eficient pentru:

Aplicatii a caror rezolvare implica mai multe operatii realizabile prin comenzi Shell;

Aplicatii care manipuleaza date sub forma fisierelor text sau a liniilor de text;

Aplicatii care cer consultarea directoarelor si parcurgerea sistemului de fisiere;

Nu in ultimul rand, atunci cand facem operatii periodice care implica folosirea comenzilor Shell, putem sa ne automatizam munca prin crearea unui fisier de comenzi. Vom numi fisier de comenzi orice secventa de comenzi memorata intr-un fisier disc. Prin program Shell sau script vom intelege un fisier ce contine, pe linga comenzi, structuri de control al executiei (instructiuni repetitive si de decizie) si variabile. In continuare se prezinta cele mai importante concepte in programarea scripturilor sub Bourne Again Shell (BASH) , cel mai raspindit in sistemul Linux. Pentru a programa sub alt shell, trebuie consultate documentatiile corespunzatoare, pentru a vedea care sunt diferentele.Obiectele ce compun un script sunt:

Comenzi Linux; Variabile:

1. Variabile definite de utilizator;2. Variabile predefinite (sistem);3. Variabile speciale;

Instructiuni de citire/scriere:1. read pentru citirea datelor;2. echo pentru afisarea datelor si mesajelor;

Instructiuni de decizie:1. if -instructiune de decizie simpla;2. case-instructiunea de decizie multipla;3. select-instructiune pentru crearea de meniuri simple;

Instructiuni iterative:1. for2. while3. until

Instructiuni de salt:1. break-iesire fortata dintr-un ciclu2. continue-forteaza continuarea unui ciclu pentru urmatoarea valoare acontorului

Nu exista o instructiune de salt neconditionat (goto), programele capatand astfel lizibilitate. Introducerea instructiunilor repetitive permite scrierea de programe structurate, spre deosebire de "limbajul" batch din sistemul de operare MSDOS.Un script poate primi in linia de comanda argumente. De asemenea, se pot apela, din interiorul unui script, alte scripturi. Scripturile pot fi scrise cu ajutorul unui editor de texte ca vi, ed, emacs. Apoi se stabileste dreptul de executie a fisierului, numele sau putand fi folosit ca o comanda obisnuita. Shell-ul va executa fisierul comanda cu comanda.

Un exemplu de fisier de comenzi simplu este urmatorul:

EXERCITIU: Ce efect are executarea acestui fisier de comenzi ?

Introducerea de comentarii

De cele mai multe ori, la inceputul programului, trebuie sa precizam care este efectul acestuia, pentru ca nu este intotdeauna evident acest lucru (s-ar putea ca pe unii utilizatori sa nu-i intereseze cum lucreaza scriptul ci doar ce face acesta). La inceputul programului trebuie precizat sub ce interpretor a fost scris. De exemplu, comanda speciala #!/bin/sh indica faptul ca instructiunile care urmeaza trebuie interpretate de Bourne Shell. O linie de comentariu incepe intotdeauna cu semnul # si nu este interpretata de shell.

Proceduri de citire/scriere

Afisarea informatiilor se face cu ajutorul comenzii echo a carei sintaxa este:echo [optiuni] [parametri]Comanda echo trimite parametrii pe canalul de iesire standard. Principalele caractere speciale ale comenzii sunt:Caracter special

Efect

\a Alarma sonora\n Salt la linie noua\b Intoarcere\t Marcheaza un paragraf

Tab\\ Afisare \Pentru a se tine cont de caracterele speciale ce apar in sirurile de caractere date ca argumente, trebuie folosita optiunea -e, de exemplu:

Afisarea valorii unei variabile se realizeaza prin folosirea caracterului $ inaintea numelui variabilei.echo $s, afiseaza valoarea variabilei s.Citirea informaţiilor se face cu ajutorul comenzii readPentru a avea un contact direct cu utilizatorul, in afara folosirii parametrilor de pozitie, exista pozibilitatea de a se introduce date prin intermediul comenzii read.Datele citite sunt transmise pe canalul de intrare standard si memorate in variabilele transmise ca parametrii din comanda read. Sintaxa este urmatoarea:read (variabila)...La intalnirea unei comenzi read, shell-ul asteapta introducerea datelor si validarea lor prin apasarea tastei ENTER. Shell-ul imparte linia de intrare in cuvinte, afectand primul cuvant primei variabile, al doilea celei de-a doua variabile...Ultimele cuvinte sunt memorate in ultima variabila. Este de dorit ca orice comanda read sa fie precedata de un echo, pentru a explica utilizatorului ce dorim sa introduca.

Instructiuni de decizieIFMarele 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)... ]fiunde:(expresie logica)- comanda sau suita de comenzi cu rezultat logic(comanda) - orice comanda acceptata de shell, inclusiv ifInstructiunea 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.

Scriptul urmator:

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.Rescrieti scriptul conform ecranului de mai jos. Interpretati modificarile.

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).

CasePentru deciziile multiple a fost implementata instructiunea case, care are urmatoarea sintaxa:case (valoare) in(sablon_1) (comanda)...;;(sablon_2) (comanda)...;;...esacunde:(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 shellDaca (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 de utilizare a instructiunii in scriptul urmator:

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

ForInstructiunea 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)...done1. 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:

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 criteriuListele 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 *.cdocat $fisdone3. Liste de valori impliciteLista 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 $@dolpr $fisdonecare este echivalent cu:for fisdolpr $fisdoneExemplul urmator afiseaza continutul directorului curent, sortat dupa data ultimei modificari.for i in `ls -t` do echo $i doneDeterminati rezultatul executiei scriptului ce urmeaza:for fis in `find $1 -perm -u=rx -type f`do echo $fis cat $fisdone

WhileCiclul while este folosit pentru executia unei liste de comenzi atat timp cat este adevarata o anumita conditie. Sintaxa este urmatoarea:while (expresie logica)do(comanda)...doneDe cele mai multe ori, se foloseste comanda test drept expresie logica in instructiunea while.Determinati rezultatul executiei scriptului ce urmeaza:a=0while [ "$a" -lt 10 ] do b="$a" while [ "$b" -ge 0 ] do echo -n "$b " b=`expr $b - 1` done echo a=`expr $a + 1`doneSe poate folosi un bucla while cu executie infinita datorita comenzii true, care returneaza intotdeauna valoarea zero:while truedo...doneIn acest caz, se vor folosi instructiuni de iesire fortata din ciclu ca break si exit.Exemplul urmator afiseaza in mod continuu pe ecran, din 5 in 5 secunde, data si ora curenta.

UntilCiclul until se termina atunci cand conditia devine adevarata. Sintaxa este:until (expresie logica)do(comanda)...doneSe poate folosi comanda false pentru a obtine o bucla until infinita.Determinati rezultatul executiei scriptului ce urmeaza:a=0until [ ! $a -lt 10 ]do echo $a a=`expr $a + 1`done

SelectSintaxa instructiunii select este:select (variabila) in (lista de valori)do(comanda)...doneLista 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.Scriptul (sa presupunem, ca are numele script):PS3="Introduceti un numar intre 1 si 3: "select optiune in matematica fizica informatica

doif [ -n "$optiune" ]thenecho "Materia preferata este $optiune"elseexitfi

done

are urmatorul efect:$ script1) matematica2) fizica3) informaticaIntroduceti un numar intre 1 si 3: 3Materia preferata este informatica1) matematica2) fizica3) informaticaIntroduceti un numar intre 1 si 3: ctrl+D$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.

Alte comenzi

break - permite iesirea din ciclu inainte de indeplinirea conditiei; Determinati rezultatul executiei scriptului ce urmeaza:a=0while [ $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 3do 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 donedone

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 $nrdo 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.

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.

Exemple shell script-uri

Pb1 Sa se verifice daca un numar, dat in linia de comanda este pozitiv sau negativ

$ vi a.sh#!/bin/bash# #if [ $# -eq 0 ] then echo "$0 : Trebuie sa dati un numar argument" exit 1fi if test $1 -gt 0 then echo "$1 numarul este pozitiv" else echo "$1 numarul este negativ"fi

Pb 2 Sa se scrie tabla inmultirii pentru un numar dat ca argument$ vi b.sh#!/bin/bashif [ $# -eq 0 ]then   echo "Eroare – Dati un argument"   echo "Sintaxa este: $0 number"exit 1fin=$1i=1while [ $i -le 10 ]do  echo "$n * $i = `expr $i \* $n`"  i=`expr $i + 1`done

Pb 3 Sa listeze continutul directorului current. Sa se stearga din directorul current fisierele care incep cu literele j si x.$ vi c.sh#!/bin/bashfor file in *do ls -l "$file" # Listeaza toate fisierele din calea curentadone

for file in [jx]*do rm -f $file

# Sterge numai fisierele a caror denumire incepe cu "j" or "x" din $PWD. echo "Fisierul sters: \"$file\""doneechoexit 0

Pb 4 Sa se afiseze un mesaj pentru cazul in care se scrie una din literele A,B,C$ vi d1.sh#!/bin/bash echo 'Introdu A, B, sau C: \c' read letter case $letter in A) echo 'Ati introdus A' ;; B) echo 'Ati introdus B' ;; C) echo 'Ati introdus C' ;; *) echo 'Nu ati introdus A, B, sau C' ;; esac

Pb 5 Sa se afiseze tabelul:1 1 1 1 12 2 2 2 23 3 3 3 34 4 4 4 45 5 5 5 5

$ vi e.sh #!/bin/bash

for (( i = 1; i <= 5; i++ ))      ### Loop 1###do

    for (( j = 1 ; j <= 5; j++ )) ### Loop 2###    do          echo -n "$i "    done

  echo "" #### trec la linie noua ###

done

Pb 6 Verificarea prin preluarea ca argument a unui nume de fisier daca acesta este sau nu director$ vi f.sh #!/bin/bashvar1 = student.datif [ -f $var1 ] then echo "$var1 este un fisier obisnuit!"elif [ -d $var1 ] then echo "$var1 este director"fi

Testati urmatoarele scripturi si precizati efectul executiei lor:

# copierea fisierelor intr-un director nou$ vi f.sh#!/bin/bashmkdir copie for numefisier in `ls` do cp $numefisier copie/$numefisier if [ $? -ne 0 ]then echo "operatie esuata" fi done

aduna primele 5 numere pare)$ vi g.sh#!/bin/bashcontor=0 rez=0 while [ $contor -lt 5 ] do contor=`expr $contor + 1` increment=`expr $contor \* 2` rez=`expr $rez + $increment` done echo "rez=$rez"

# Genereaza copia unui fisier inainte de editare $ vi h.sh#!/bin/bashif cp "$1" "#$1" then vi "$1" else echo "Nu am putut creea copia de siguranta" fi

Pb 7 $ vi h.sh#!/bin/bashcontor=$# cmd=echo while true do cmd="$cmd \$$contor" contor=`expr $contor - 1` if test $contor -eq 0 then break fi done eval $cmd

Comanda eval este folosită în programe shell care construiesc linii de comandă din mai multe variabile. Comanda e utilă dacă variabilele conţin caractere care trebuie sa fie recunoscute de shell nu ca rezultat al unei substituţii. Astfel de caractere sunt: ;, |, &, < , >, ".

IE, 02.04.13,
In cases where more than one evaluation of a string is required the built-in command eval may be used. For example, if the variable X has the value $y, and if y has the value pqr then eval echo $X will echo the string pqr. In general the eval command evaluates its arguments (as do all commands) and treats the result as input to the shell. The input is read and the resulting command(s) executed. For example, wg=\'eval who|grep\' $wg fred is equivalent to who|grep fred

Pb 8$ vi k.sh#!/bin/bashcontor=$# cmd=echo while true do cmd="$cmd \$$contor" contor=`expr $contor - 1` if test $contor -gt 0 then continue fi eval $cmd exit done

Diferenta dintre executarea problemei 7 si 8

Pb 9$ vi pb9.sh#!/bin/bashif test $# -eq 0 then ls -l | grep '^d' else for i do for j in $i/* do

if test -d $j then echo $j fi done done fi

Modificati programul din exemplul 9 pentru a-i extinde efectul asupra tuturor directoarelor din subarborele directorului argument (sau al celui curent, in lipsa argumentelor).

Pb 10 Compararea a doua siruri introduce de la tastatura

$ vi pb10.sh#!/bin/bashecho -n "Introduceti string1: " # -n nu trece la linie nouaread string1echo -n "Introduceti string2: "read string2if [ $string1 = $string2 ]thenecho "string1 egal cu string2"elseecho "string1 diferit de string2"fi

Pb 11 Compararea a doua numere introduse de la tastatura

$ vi pb11.sh#!/bin/bashecho -n "Introduceti nr1: "read nr1

echo -n "Introduceti nr2: "read nr2if [ $nr1 -eq $nr2 ]thenecho "nr1 egal cu nr2"elseecho "nr1 diferit de nr2"fi

Pb 12 Convertirea unui numar din baza 10 in baza 16

$ vi pb12.sh#!/bin/bashn=0hex=0echo -n "Introdu numarul in baza 10 n: "read nhex=`echo "obase=16;ibase=10; $n" | bc`echo "$n in baza 10 este echivalent cu \"$hex\" in baza 16"

IE, 04/02/13,
variable=$(echo "OPTIONS; OPERATIONS" | bc)

Pb 13 Sortarea ascendenta a cinci numere

$ vi pb13.sh – la executie utilizati ./pb13.sh si functioneaza. Nu utilizati comanda sh#!/bin/bash# declararea unui vector cu cele cinci numeredeclare vector[5]=(4 -1 2 66 10)# afisare numereecho "Numerele care se vor sorta sunt:"for (( i = 0; i <= 4; i++ ))do echo ${vector[$i]}done# sortare numerefor (( i = 0; i <= 4 ; i++ ))do for (( j = $i; j <= 4; j++ )) do if [ ${vector[$i]} -gt ${vector[$j]} ]; then t=${vector[$i]} vector[$i]=${vector[$j]} vector[$j]=$t fi donedone# afisarea numerelor sortateecho -e "\n Numerele in ordine ascendenta sunt:"for (( i=0; i <= 4; i++ )) do echo ${vector[$i]}done

Pb 14 Calculul mediei unor numere date ca argument in linia de comanda$ vi pb14.sh#!/bin/bashmedie=0suma=0nr_argumente=$#

# Testam existenta a cel putin doua argumenteif [ $# -lt 2 ] ; then echo -e "Introduceti cel putin doua argumente\n" exit 1fi# calculul mediei for i in $*do suma=`expr $suma + $i`donemedie=`expr $suma / $nr_argumente`echo "Media este $medie"

Pb 15 Script exemplu de utilizare a functiilor in unix$ vi pb15.sh#!/bin/bash# functie pentru eliberarea ecranuluiee(){ clear echo "Eliberare ecran” read return}

# functie pentru afisare helphelp(){

echo "Utilizam argumentele: $0 -c "; echo "Semnificatie -c eliberare ecran"; return

}

if [ $# -eq 0 ] ; then help exit 1fi

while getopts cd: optiunedo case "$optiune" in

c) ee;;\?) help; exit 1;;

esacdone

Pb 16 Calcularea factorialului unui numar$ vi pb16.sh#!/bin/bashn=0nr=0fact=1 echo -n "Introdu numarul : "read nnr=$nwhile [ $n -ge 1 ]do fact=`expr $fact \* $n` n=`expr $n - 1`doneecho "Factorialul numarului $nr este $fact"

Pb 17 Utilizarea comenzii tput pentru boldarea unui text introdus de la tastatura$ vi pb17.sh#!/bin/bashecho -n "introdu textul : "read texttput boldecho "$text"

Pb 18 Script pentru afisarea numarului de fisiere din directorul curent$ vi pb18.sh#!/bin/bashFILE="/tmp/fisiercolector.txt"echo -n "introduceti numele directorului : "read dnamels $dname > $FILEecho "Numarul de fisiere din directorul: $(grep [^*$] $FILE -c)"#rm -f $FILE

Pb 19 Script pentru determinarea paritatii unui numar$ vi pb19.sh#!/bin/bashecho -n "Introdu numarul : "read nr=$(( $n % 2 ))if [ $r -eq 0 ]then echo "$n este par"else echo "$n este impar"fiPb 20 Crearea unui meniu$ vi pb20.sh#!/bin/bashwhile :do clear echo " meniu" echo "1. Continutul directorului /etc/passwd" echo "2. Lista utilizatorilor logati" echo "3. Directorul curent" echo "4. Exit" echo -n "introduceti una din optiunile [1 - 4]" read opt case $opt in 1) echo " Continutul directorului /etc/passwd "; more /etc/passwd;; 2) echo " Lista utilizatorilor logati ";

who | more;; 3) echo " Directorul curent este $(pwd)"; echo "Tasteaza enter pentru a continua ."; read enterKey;; 4) echo "La revedere $USER"; exit 1;; *) echo "$opt este o optiune invalida."; echo "Tasteaza enter pentru a continua ."; read enterKey;;esacdone

Pb 21 Exemplu de utilizare a variabilei shell $USER$ vi pb21.sh#!/bin/bashora=$(date +"%H")if [ $ora -ge 0 -a $ora -lt 12 ]then salut="Buna dimineata, $USER"elif [ $ora -ge 12 -a $ora -lt 18 ] then salut="Buna ziua, $USER"else salut="Buna seara, $USER"fiecho $salut

Pb 22 script pentru preluarea unui numar si returnarea numarului scris in litere$ vi pb22.sh#!/bin/bashecho -n "Introdu numarul : "read nl=$(echo $n | wc -c)l=$(( $l - 1 ))echo "Numarul $n in cuvinte : "for (( i=1; i<=$l; i++ ))do cifra=$(echo $n | cut -c $i) case $cifra in 0) echo -n "zero " ;; 1) echo -n "unu " ;; 2) echo -n "doi " ;; 3) echo -n "trei " ;; 4) echo -n "patru " ;; 5) echo -n "cinci " ;; 6) echo -n "sase" ;; 7) echo -n "sapte " ;; 8) echo -n "opt " ;;

9) echo -n "noua " ;; esacdone

Pb 23 Calculul numarului de cifre ale numar introdus de la tastatura$ vi pb23.sh#!/bin/bashecho -n "Introdu numarul : "read nsd=0nd=0on=$n while [ $n -gt 0 ]do sd=$(( $n % 10 )) n=$(( $n / 10 )) nd=$(( $nd + 1)) doneecho "Numarul de cifre ale numarului $on este $nd"

Shell script debbuging

#!/bin/sh -vxecho "Nume script [$0]"echo "Primul argument [$1]"echo "Al doilea argument [$2]"echo "PID [$$]"echo "Numar argumente [$#]"echo "Toate argumentele [$@]"echo "Flag-urile [$-]"

Dupa executie pe ecran obtinem:

In mod normal simbolul # anunta un comentariu dar daca il regasim pe prima linie semnificatia este de citire a caii catre shell-ul specificat si a flag-urilor optional precizate.Flag-ul –v seteaza modul verbose si ne ajuta sa observam erorile de sintaxa deoarece se opreste afisarea acolo unde intalneste o astfel de eroare. Deasemenea realizeaza substitutia variabilelor cu valorile inregistrate de acestea pe parcursul executiei ceea ce ajuta foarte mult in cazul utilizarii instructiunii if sau a altor constructii complexe.Flag-ul -x este similar dar plaseaza suplimentar semnul + in fata fiecarei comenzi sau instructiuni executate. Daca scriptul contine o instructiune if care este evaluata ca adevarata semnul + va fi plasat in fata instructii if iar daca este evaluata ca falsa semnul + va fI plasat in fata instructiunii else. Daca verificam o structura ciclica -v va afisa intreaga constructie in timp ce –x va identifica rezultatul executiei la pas cu pas.

O alta metoda de utilizare a acestor 2 flag-uri este din linia de comanda astfel:bin/sh -xv nume_script arg_1 arg_2]

Daca dorim sa testam numai o sectiune de cod putem utiliza comanda set astfel:

#!/bin/sh echo "Nume script [$0]"echo "Primul argument [$1]"echo "Al doilea argument [$2]"echo "start sectiune cu problema"set -v onset -x onecho "PID [$$]"set -v offset -x offecho "stop sectiune cu problema"

Dupa executie pe ecran obtinem:

Intrarea in debug mode sau iesirea din acesta se poate preciza si astfel:

#!/bin/bashclearset -xfor f in *do file $fdoneset +xls

Un alt flag utilizat frecvent este –n care forteaza shell-ul sa evite executia unor sectiuni de cod.Totusi va afisa erori de sintaxa prin mesaje “unexpected end of file”. Alte falg-uri mai putin utilizate sunt: -u, -t, -e, --.

Exemple de posibile mesaje de eroare si semnificatia lor:

Mesaje de eroare Semnificatieunexpected end of file at nnn

Incadrare eronata in ghilimele sau grupare eronata pentru o constructie complexa

test expected Lipsa de spatiu pentru [ sau ] sau lipseste thenbadly formed if Lipseste then sau fi missing test Lipseste do pentru while sau for

syntax error Incercare de comparare caracter alfanumeric cu un numar in comanda test

invalid number Un sir utilizat in expr sau bc contine caractere alfanumericebad number Un numar real este utilizat expr (se utilizeaza doar intregi)

In cazul in care avem nevoie de o iesire fortata din executia script-ului datorita unei bucle infinite sau etc. utilizam: ps -ef | grep nume_script pentru identificarea PID si apoi kill -9 PID pentru stoparea executiei procesului.

Utilizarea functiei debug

Se declara la inceputul scriptului dupa care se utilizeaza.

#!/bin/bash_DEBUG="on"function DEBUG(){ [ "$_DEBUG" == "on" ] && $@ || :}

DEBUG echo "Citire fisiere"for i in *do grep 'echo' $i > /dev/null [ $? -eq 0 ] && echo "Identificat in $i " || :doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"

Rezultat executie

#!/bin/bash_DEBUG="off"function DEBUG(){ [ "$_DEBUG" == "on" ] && $@ || :}

DEBUG echo "Citire fisiere"for i in *do grep 'echo' $i > /dev/null [ $? -eq 0 ] && echo "Identificat in $i " || :doneDEBUG set -x

a=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"

Rezultat executie

Comenzi pentru lucru cu fisiere si directoare

bzip2, bunzip2 Very high quality file compression and decompression.

chgrp Change the group of files and directories.

chmod Change the permissions (mode) of files and directories.

chown Change the owner of files and directories.

cksum Print a file checksum, POSIX standard algorithm.

comm Print or omit lines that are unique or common between two sorted files.

cp Copy files and directories.

df Show free disk space.

diff Compare files, showing differences.

du Show disk block usage of files and directories.

file Guess the type of data in a file by examining the first part of it.

findDescend one or more directory hierarchies finding filesystem objects (files, directories, special files) that match specified criteria.

gzip, gunzip High-quality file compression and decompression.

head Print the first n lines of one or more files.

locateFind a file somewhere on the system based on its name. The program uses a database of files that is usually rebuilt automatically, nightly.

ls List files. Options control the information shown.

md5sum Print a file checksum using the Message Digest 5 (MD5) algorithm.

mkdir Make directories.

mktempCreate a unique temporary file and print its name. Not universally available.

odOctal dump; print file contents in octal, hexadecimal, or as character data.

patchUpdate the contents of a given file to a newer version by reading the output of diff.

pwd Print the current working directory. Usually built into modern shells.

rm Remove files and directories.

rmdir Remove just empty directories.

strings Search binary files for printable strings and print them.

tailShow the last n lines of a file. With -f, keep printing the (growing) contents of the file.

tar Tape archiver. Now used mostly as a software distribution format.

touch Update the modification or access time of a file.

umask Set the default file-creation permissions mask.

zip, unzipFile archiver and compressor/decompressor. The ZIP format is portable across a broad range of operating systems.

Comenzi pentru gestiunea proceselor

atExecutes jobs at a specified time. at schedules jobs to be executed just once, whereas cron schedules them to be executed regularly.

batch Executes jobs when the system is not too overloaded.

cron Executes jobs at specified times.

crontab Edit per-user "cron table" files that specify what commands to run, and when.

fuser Find processes using particular files or sockets.

kill Send a signal to one or more processes.

nice Change the priority of a process before starting it.

ps Process status. Print information about running processes.

renice Change the priority of a process that has already been started.

sleep Stop execution for the given number of seconds.

top Interactively display the most CPU-intensive jobs on the system.

wait Shell built-in command to wait for one or more processes to complete.

xargsRead strings on standard input, passing as many as possible as arguments to a given command. Most often used together with find.

Comenzi pentru procesarea textelor

awkAn elegant and useful programming language in its own right, it is also an important component of many large shell scripts.

cat Concatenate files.

cmp Simple file comparison program.

cut Cut out selected columns or fields.

dd

A more specialized program for blocking and unblocking data, and converting between ASCII and EBCDIC. dd is especially good for making raw copies of device files. Note that iconv is a better program for doing character set conversions.

echo Print arguments to standard output.

egrep Extended grep. Matching uses Extended Regular Expressions (EREs).

expand Expand tabs to spaces.

fgrepFast grep. This program uses a different algorithm than grep for matching fixed strings. Most, but not all, Unix systems can search simultaneously for multiple fixed strings.

fmt Simple tool for formatting text into paragraphs.

grepFrom the original ed line editor's command g/re/p, "Globally match RE and Print." Matching uses Basic Regular Expressions (BREs).

iconv General-purpose character-encoding conversion tool.

join Join matching records from multiple files.

lessA sophisticated interactive pager program for looking at information on a terminal, one screenful (or "page") at a time. It is now available from the GNU Project. The name is a pun on the moreprogram.

more The original BSD Unix interactive pager program.

pr Format files for printing on line printers.

printfA more sophisticated version of echo that provides control over the way each argument is printed.

sed A stream editor, based on the original ed line editor's command set.

sortSort text files. Command-line arguments provide control over sort key specification and priority.

spellA batch spellchecker. You may have aspell or ispell, with a shell script wrapper named spell, instead.

teeCopy standard input to standard output and to one or more named output files.

tr Transliterate, delete, or reduce runs of duplicate characters.

unexpand Convert runs of spaces into the appropriate number of tabs.

uniq Remove or count duplicate lines in sorted input.

wc Count lines, words, characters, and/or bytes.

Exemple de scripturi1. #!/bin/sh

# Verificarea conectarii unui utilizator - varianta aproximativaif test $# -eq 1then   if who | grep -q "$1"   then      echo "$1 este conectat"   else      echo "$1 nu este conectat"   fielse   echo "$0 user"fi

2. #!/bin/sh# Verificarea conectarii unui utilizator - varianta corectataif test $# -eq 1then   f=1   for u in `who | cut -d ' ' -f 1`   do      if test "$u" = "$1"      then         f=0      fi   done   if test "$f" -eq 0   then      echo "$1 este conectat"   else      echo "$1 nu este conectat"   fielse   echo "$0 user"fi

3. #!/bin/sh# Eliminarea liniilor vide dintr-un fisier - varianta iterativaif test $# -eq 1then   cat "$1" | while read l

   do      if test ! -z "$l"      then         echo "$l" >> "$1.tmp"      fi   done   if test -f "$1.tmp"   then      mv "$1.tmp" "$1"   fielse   echo "$0 file"fi

4. #!/bin/sh# Eliminarea liniilor vide dintr-un fisier - varianta declarativaif test $# -eq 1then   sed '/^$/d' < "$1" > "$1" else   echo "$0 file"fi

5. #!/bin/sh# Verificarea validitatii unei adrese de e-mailif test $# -eq 1then   if echo "$1" | egrep '^([a-zA-Z0-9]+[.|_]?)+@([a-zA-Z0-9]+[.|_]?)+.[ro|hu]$'   then      echo "Valida"   else      echo "Invalida"   fielse   echo "$0 email"fi

6. #!/bin/sh# Preprocesarea directivelor #includeif test $# -eq 1then   cat "$1" | while read l   do      if echo "$l" | egrep -q '#include "[a-zA-Z0-9]+.h"'      then         f=`echo "$1" | sed 's/#include "\([a-zA-Z0-9]\+.h\)"/\1/'`         if test -f "$f"         then            cat "$f" >> "__$1"         fi

      else         echo "$l" >> "__$1"      fi   doneelse   echo "$0 file"fi

7. #!/bin/sh# Afiseaza modificarile continutului unui directorwhile [ $# -gt 0 ]do    case "$1" in    "-d")shift        dir="$1"        shift    ;;    "-s")shift        s="$1"        shift    ;;    "-c")shift        c="$1"        shift        ;;    "*")shift        ;;    esacdoneif [ ! -z "$dir" ]then    dir="$dir/"fiif [ ! -z "$s" ]then    ls -A > "$dir$s"elif [ ! -z "$c" ]then    ls -A > "/tmp/$c.tmp"    for file in `diff "$dir$c" "/tmp/$c.tmp" | cut -f 2 -d ' '`    do    if [ -e "$file" ]    then        echo "$file"    fi    done    rm "/tmp/$c.tmp"

else    echo "Usage: $0 {-s files.lst | -c files.lst } [ -d directory ]"fi

8. #!/bin/sh# Termina executia tuturor proceselor ruland acelasi fisierif test $# -eq 1then    p=`which "$1"`    if test -z "$p"    then        p="$1"    fips ax | while read ldo    s=`echo "$l" | cut -d ' ' -f 7`    if test \( "$s" = "$1" \) -o \( "$s" = "$p" \)    then        i=`echo "$l" | cut -d ' ' -f 1`        kill -9 "$i" > /dev/null    fidoneelse    echo "Usage: $0 file"fi

9. #!/bin/sh# Afiseaza calea absoluta catre un fisierif test $# -eq 1then   f=0   i=1   d=`echo $PATH | cut -d ':' -f $i`   while test \( $f -eq 0 \) -a \( ! -z "$d" \)   do      if test -f "$d/$1"      then         echo "$d/$1"         f=1      else         i=`expr $i + 1`         d=`echo $PATH | cut -d ':' -f $i`      fi   done   if test $f -eq 0   then      echo "File $1 not found in $PATH"   fi

else   echo "Usage: $0 file"fi

10. #!/bin/sh# Afiseaza dimensiunea totala a fisierelor dintr-un# director dat avand un anumit utilizator proprietarwhile test $# -gt 0do   case "$1" in   "-d")shift      d="$1"      shift      ;;   "-u")shift      u="$1"      shift      ;;   "*")shift      ;;   esacdoneif test \( ! -z "$d" \) -a \( ! -z "$u" \)then   if test -d "$d"   then      t=0      ls -Al "$d" | while read l      do         f=`echo $l | cut -d ' ' -f 9`         o=`echo $l | cut -d ' ' -f 3`         if test \( -f "$f" \) -a \( "$o" = "$u" \)         then            s=`wc -c "$d/$f" | cut -d ' ' -f 1`            t=`expr $t + $s`         fi      done      echo "Total file size in $d owned by $u is $t"   else      echo "Directory $d not found"   fielse   echo "Usage: $0 -d -u "fi

11. #!/bin/sh# Revoca dreptul de executie tuturor asupra fisierelor# dintr-un director dat avand ca proprietar un anumit utilizator

while test $# -gt 0do   case "$1" in   "-d")shift      d="$1"      shift      ;;   "-u")shift      u="$1"      ;;   "*")shift      ;;   esacdoneif test \( ! -z "$d" \) -a \( ! -z "$u" \)then   if test -d "$d"   then      t=0      ls -Al "$d" | while read l      do         f=`echo $l | cut -d ' ' -f 9`         o=`echo $l | cut -d ' ' -f 3`         if test \( -f "$f" \) -a \( "$o" = "$u" \)         then            chmod a-x "$d/$f"         fi      done      echo "Total file size in $d owned by $u is $t"   else      echo "Directory $d not found"   fielse   echo "Usage: $0 -d -u "fi

12. #!/bin/sh# Revoca dreptul de executie tuturor asupra fisierelor# dintr-un director dat si subdirectoarele acestuia# avand ca proprietar un anumit utilizatorwhile test $# -gt 0do   case "$1" in   "-d")shift      d="$1"      shift      ;;

   "-u")shift      u="$1"      shift      ;;   "*")shift      ;;   esacdoneif test \( ! -z "$d" \) -a \( ! -z "$u" \)then   if test -d "$d"   then      ls -RA "$d" "*.sh" | while read l      do         case "$l" in         "./*:")            d=`echo "$l" | sed s/^\.\/\(\[^:]+\):$/\1/g`            ;;         "*")o=`echo "$l" | cut -d ' ' -f 3`            f=`echo "$l" | cut -d ' ' -f 9`            if test -f "$d/$f"            then               chmod a-x "$d/$f"            fi            ;;         esac      done   else      echo "Diretory $d not found"   fielse   echo "Usage: $0 -d <dir> -u <usr>"fi

13. #!/bin/sh# Redenumeste in secventa fisierele cu o anumita extensiewhile test $# -gt 0do   case "$1" in   "-d")shift      d="$1"      shift      ;;   "-n")shift      n="$1"      shift      ;;

   "-e")shift      e="$1"      shift      ;;   "-s")shift      s="$1"      shift      ;;   "-l")shift      l="$1"      shift      ;;   "*")shift      ;;   esacdoneif test \( ! -z "$d" \) -a \( ! -z "$n" \) -a \( ! -z "$e" \)then   if test -d "$d"   then      if test -z "$s"      then         s=1      fi      if test -z "$l"      then         l=4      fi      i="$s"      ls -A "$d" "*.$e" | while read f      do         if test -f "$f"         then            t=""            j=${#i}            while test ${#t} -lt "$l"            do               t="0$t"            done            mv "$d/$f" "$d/$t$n.$e"            i=`expr "$i" + 1`         fi      done      i=`expr "$i" - "$s"`      echo "There were $i files renamed as $n<counter of $l digits started from $s>.$e"

   else      echo "Directory $d not found"   fielse   echo "Usage: $0 -n <name> -e <extension> [-s <start>] [-l <length>]"fi

14. #!/bin/sh# Utilitar de mail-mergewhile test $# -gt 0do   case "$1" in   "-t")shift      $t="$1"      shift      ;;   "-s")shift      $s="$1"      shift      ;;   "-u")shift      $u="$1"      shift      ;;   "*")shift      ;;   esacdoneif test \( ! -z "$t" \) -a \( ! -z "$s" \) -a \( ! -z "$u" \)then   if test \( -f "$t" \) -a \( -f "$u" \)   then      $t=`cat "$t"`      cat "$u" | while read l      do         m="$t"         $d=`echo "$l" | cut -d ' ' -f 1`         i=2         f=`echo "$l" | cut -d ' ' -f "$i"`         while test ! -z "$f"         do            m=`echo "$m" | sed 's/\{"$i"\}/"$f"/g'`            i=`expr "$i" + 1`            f=`echo "$l" | cut -d ' ' -f "$i"`         done         echo "$m" | mail -s "$s" "$d"      done

   else      "Input file not found"   fielse   echo "Usage: $0 -t