Scripturi shell UNIX Acest laborator are drept scop familiarizarea cu procedurile de scrire i rulare a scripturilor shell- urilior Unix. Un script UNIX este un program care poate fi interpretat de ctre shell-ul UNIX al calculatorului dumneavoastr. El este compus din comenzi UNIX! instruc iuni de control! comentarii. "rea i un director #A$% &n care ve i depune fi ierele corespunztoare urmtoarelor fi iere de scripturi UNIX Noiuni generale Variabile de mediu 'ariabilele de mediu pot sa con in ca valoare un sir de caractere. Atribuirea de valori se face astfel variabila=valoare (n UNIX exista c)teva variabile predefinite. variabile read-only* actualizate de interpretor $? - codul returnat de ultima comanda executata +$ - identificatorul de proces al interpretorului de comenzi $! - identificatorul ultimului proces lansat &n paralel $# - numrul de argumente cu care a fost apelat fi ierul de comenzi curent $0 - con ine numele comenzii executate de interpretor $1, $2 ... - argumentele cu care a fost apelat fi ierul de comenzi care se afla &n execu ie variabile ini ializate la intrarea &n sesiune $HOME - numele directorului ,home, afectat utilizatorului! $PATH - cile de cutare a programelor! $PS1 - prompter-ul pe care &l afi eaz interpretorul atunci c)nd a teapt o comanda! $PS2 - al doilea prompter! $TERM - tipul terminalului pe care se lucreaz. - Directive de control (informaii succinte) .irectivele de control ale interpretorului bash /sau sh) sunt structurile de limba0 care pot fi utilizate &n scrierea de programe. (n continuare vor fi prezentate c)teva din cele mai folosite structuri de control. 1entru detalii consulta i pagina de manual a interpretorului de comenzi bash / i2sau sh3* analiza i cu aten ie directivele i facilit ile pe care acesta le pune la dispozi ie. Instruc iuni de decizie Instruc iunea if if lista1 then lista2 else lista3 fi if lista1 then lista2 elif lista3 then lista4 else lista5 fi 4 comanda returneaz o valoare la terminarea ei. (n general* dac o comanda s-a terminat cu succes ea va returna 5* altfel va returna un cod de eroare nenul. (n prima forma a comenzii if* se executa lista1* iar dac si ultima instruc iune din lista returneaz codul 5 /succes3 se executa lista2* altfel se executa lista3. (n a doua forma se pot testa mai multe condi ii c)nd lista1 se termina cu succes* se va executa lista2* altfel se executa lista3. .ac aceasta se termina cu succes se executa lista4* altfel se executa lista5.
Instruc iunea case case cuvant in tipar13 lista1!! tipar23 lista2!! ... esac Aceasta instruc iune implementeaz decizia multipla. ablonul tipar este o construc ie care poate con ine simbolurile 6 si 7* similara celor folosite la specificarea generica a numelor de fi iere. "omanda expandeaz /evalueaz3 irul cuvant i &ncearc sa &l potriveasc pe unul din tipare. 'a fi executata lista de comenzi pentru care aceasta potrivire poate fi fcut. Instruc iuni de ciclare
Instruc iunea while while lista1 ! lista2 !ne 8e executa comenzile din lista2 &n mod repetat* cat timp lista de comenzi lista1 se &ncheie cu cod de 9 succes.
Instruc iunea until "ntil lista1 ! lista2 !ne 8e executa comenzile din lista2 in mod repetat* pana c)nd lista de comenzi lista1 se &ncheie cu cod de succes.
Instruc iunea for f!# variabila :in val1 val2 ...; ! lista !ne 8e executa lista de comenzi &n mod repetat* variabila lu)nd pe rand valorile val1, val2, ... .ac lipse te cuv)ntul cheie in* valorile pe care le va lua pe rand variabila vor fi parametrii din linia de comanda pe care i-a primit fi ierul de comenzi atunci c)nd a fost lansat &n execu ie. Alte comenzi $#ea% - permite ie irea din ciclu &nainte de &ndeplinirea condi iei! c!ntin"e - permite reluarea ciclului cu urmtoarea iteratie* inainte de terminarea iteratiei curente! e&ec cmd - comenzile specificate ca argumente sunt executate de interpretorul de comenzi &n loc sa se creeze procese separate de execu ie! dac se dore te rularea comenzilor &n procese separate ele se scriu direct* asa cum se scriu si in linia de comanda shift - realizeaz deplasarea argumentelor cu o pozi ie la st)nga /+9+-* +<+9 etc3! wait :pid; - permite sincronizarea unui proces cu sf)r itul procesului cu pid-ul indicat sau cu sfarsitul tuturor proceselor ,fii,! e&'# expresie - permite evaluarea unei expresii. Mersul lucrrii P#i("l sc#i't )Hell! *!#l+ 4rice script trebuie sa &nceap cu linia #!/bin/bash 1entru a afla adresa bash exact de pe calculatorul .umneavoastr utiliza i instruc iunea =hich which bash Aceast linie este utilizat pentru a specifica faptul ca scriptul dumneavoastr trebuie interpretat de ctre shell-ul bash care se gse te la adresa indicat. 8criptul care permite afi area unui mesa0 de &nt)mpinare >$una ziua ?@ este expus mai 0os #!/bin/bash echo Buna ziua ! < Aai departe este expus procesul prin care se editeaz scriptul shell i se ruleaz $ cat > BunaZiua.sh #!/bin/bash echo Buna ziua ! Ctrl+C chmod +x BunaZiua.sh ./BunaZiua.sh Buna ziua ! $ 4rice script shell trebuie salvat &ntr-un fi ier cu un nume Nume8cript.sh * extensia este op ional. Bi ierul trebuie s fie cu drept de executare. Execu ia scriptului se realizeaz cu a0utorul comenzii $bash calea-catre-scriptul-dumneavoastra sau $./nume-script Sc#i't"#i si('le -. "rea i un script care afi eaz numrul de argumente ce i-au fost transmise i le afi eaz &n continuare unul c)te unul. (n cazul c)nd nu i-au fost transmise argumente* ea emite mesa0ul ,Nici un argument transmis,. Aodifica i scriptul pentru a afi a argumentele &n ordine inversa 9. Analiza i scriptul urmtor #!/bin/bash ((test $1 -lt $2) && (echo '$1 < $2')) || (echo '$2 < $1') "e face el 6 .up testarea scriptului &nlocui i ghilimelele simple cu ghilimele duble. #ansa i din nou scriptul. "e a i constatat6 Explica i. 8tudiati codul returnat dup executarea acestui script. Explicati. Cescrie i scriptul utiliz)nd structura if then else fi <. ")nd executa i un script* un shell nou demar pentru a executa instruc iunile con inute &n script. 8a testam aceasta afirma ie cu un exemplu. "rea i un script cu urmtorul con inut echo PID-ul meu este $$ 'ariabila special ++ ne da 1I.-ul procesului. Executa i scriptul de mai multe ori i compara i rezultatele. "e constata i6 'i se pare normal6 Explica i. E&e#ci ii -. Aodifica i scriptul BunaZiua.sh redenumindu-l &n BunaZiuaNume.sh dup cum urmeaz a3 dac &i transmite i doua argumente* primul con in)nd numele iar al doilea prenumele* el trebuie s le afi eze dup salutare /de ex. $una ziua* Nume 1renume3 b3 dac nu-i transmite i nici un argument* el trebuie sa va afi eze dup salutare numele de conectare al utilizatorului /#4DNAAE3 9. Cealiza i un script shell UNIX care permite >cur area@ ecranului iar apoi afi eaz structura de fi iere i directoare a directorului pe care l-a i furnizat ca argument. Indica ie comanda care >cur @ ecranul este clear. 8tudia i pagina de manual a acestei comenzi ? <. Aodifica i scriptul precedent pentru a afi a structura de fi iere i directoare a dosarului % personal al utilizatorului &n cazul c)nd scriptul este lansat fr de argument. %. Cealiza i un script shell UNIX care calculeaz suma primelor n numere naturale* n fiind argumentul scriptului. E. Cealiza i un script shell UNIX care cere utilizatorului sa introduc doua iruri de caractere i apoi afi eaz un mesa0 de informare dac cele doua iruri sunt sau nu egale. Aai exact* dac cele doua iruri de caractere sunt egale se afi eaz la terminal un mesa0 de tipul >"ele doua iruri de caracter sunt egale@* iar dac sunt diferite - un mesa0 de tipul >"ele doua iruri de caractere sunt diferite@. F. Cealiza i un script care prime te drept argument calea ctre un director* verifica dac acesta este un director i &n caz afirmativ afi eaz con inutul acestuia i al subdirectoarelor. G. Cealiza i un script care permite copierea unui director specificat de ctre utilizator* cu &ntreg con inutul sau de fi iere i directoare &ntr-un director numit copie. H. Cealiza i un script shell UNIX care calculeaz suma primelor cinci numere pare* utiliz)nd un ciclu while. I. Cealiza i un script care permite afi area denumirii unei luni* &n situa ia &n care utilizatorul specifica numrul lunii. .e exemplu pentru < afi eaz >martie@. -5. Cealiza i un script shell UNIX care nu afi eaz dec)t fi ierele dintr-un anumit director furnizat ca argument. --. Analog* crea i un script shell UNIX care nu afi eaz dec)t subdirectoarele dintr-un anumit director furnizat ca argument. -9. Cealiza i un script shell UNIX care permite afi area numrului de fi iere i de subdirectoare dintr-un director furnizat drept argument /verifica i pentru &nceput dac directorul exista3. 8e vor lua &n considerare doua cazuri a3 cutare superficiala /va limita i doar la directorul curent fr a va preocupa de subdirectoare3! b3 cutare &n profunzime /cutare &n toate sub-directoarele din dosarul de baza3 -<. 8crie i un script care afi eaz numrul de utilizatori conecta i i numrul de procese lansate &n momentul lansrii scriptului. -%. 8crie i un script care afi eaz numerele de la - p)n la valoarea transmisa scriptului &n calitate de parametru a3 Bolosi i &n acest scop o bucl while do done b3 Cescrie i script-ul folosind structura until do done. c3 !chimba i script-ul pentru a calcula media tuturor valorilor afi ate anterior. -E. Cealiza i un script shell UNIX care realizeaz un meniu afi at &n bucla care permite urmtoarele op iuni a3 pentru op iunea - afi eaz un mesa0 de &nt)mpinare ! b3 pentru op iunea 9 afi eaz data curenta! c3 pentru op iunea < afi eaz procesele care ruleaz la acel moment /comanda ps3! d3 pentru op iunea % va &ntreab numrul procesului care trebuie a fie oprit /,ucide, procesul trimi ndu-i semnalul 8IDJI##3! e3 pentru op iunea E >cur a@ ecranul! f3 pentru op iunea F prse te scriptul! -F. /op ional3 8crie i un script care consulta pagina =eb ===.Kernel.org i afi eaz versiunea curenta /mainline3 a nucleului #inux i ultima dat de actualizare / Indica ie utilizatu w"et pentru a descrca &n prealabil pagina de garda a site-ului3. Coninutul raportului Bace i un raport prezent)nd mersul exerci iilor i prezenta i-l pentru validare la sf)r itul lucrrii de laborator sau &n decurs de o sptm)na dup efectuarea lucrrii /prin e-mail la adresa victor.moraruLutm.md3. Include i &n fiecare rspuns textul scriptului respectiv. 1une i toate fi ierele cu scripturi &ntr-o arhiva tar.gz cu numele ume#renume-$ab4.tar."%. Numi i scripturile &n func ie de numrul exerci iului /de exemplu G.sh pentru exerci iul G* -Eb.sh pentru punctul b al exerci iului -E* etc.3. Mrimite i arhiva &mpreun cu raportul prin po ta electronic. E Referine 1agina de manual bash Aachtelt Darrels ,$ash Duide for $eginners, http22tldp.org2#.12$ash-$eginners- Duide2html2index.html #inux .ocumentation 1ro0ect Duides http22===.tldp.org2guides.html .iverse surse pe Internet F