L4_sisteme de operare

6
7/23/2019 L4_sisteme de operare http://slidepdf.com/reader/full/l4sisteme-de-operare 1/6  1 LABORATOR NR. 4 - SISTEME DE OPERARE TEMA LABORATORULUI 1. Limbajul de programare Shell -instrucţiuni de control 2. Aplicaţii 1. INSTRUCŢIUNI DE CONTROL 1.1. DECIZIA Limbajul de programare Shell implementează decizia ş i selecţ ia şi ca urmare ramificarea programului în funcţie de anumite condiţ ii. Pentru decizie sintaxa este următoarea: if <l i sta- 1> then <l i sta- 2> else (1) <l i sta- 3> fi  if <l i sta- 1> then <l i sta- 2> elif <l i sta- 3> then (2) <l i sta- 4> else <l i sta- 5> fi Cuvintele if, then, else, elif, fi sunt cuvinte cheie care marchează elementele structurii.  În primul caz se execută lista de comenzi <l i sta-1>iar dacă codul de retur este 0 (comandă reu şită = adevărat), se va executa lista de comenzi <l i sta- 2>.  Dacă codul de retur este diferit de 0 (comandă nereuşit ă=fals), se va executa lista de comenzi <l i sta- 3>.  În a doua formă: dacă <l i sta-1> întoarce codul de retur 0, se va executa <l i sta-2> , altfel se executa <l i sta-3> şi dacă codul de r etur este 0 se execută  <l i sta-4> , altfel se execut ă <l i sta- 5>. Exemplul 1: if test -e fifi then echo “Fisierul fifi exista in directorul curent” else echo “Fisier negasit” fi În acest eexemplu s-a folosit în condiţ ie comanda test cu optiunea -e, care întoarce 0 dacă fi şierul specificat exist ă şi este accesibil la citire şi 1 dacă fisierul nu exist ă. Comanda test este internă Shell -ului şi are următoarea sintaxă: test expr evaluează expresia condiţionată <expr>. Se permite şi forma [ expr ]. Într-o expresie acceptată de comanda test pot apare următoarele : -e nume_fis fi şierul nume_fis există î n directorul curent -r nume_fis fişierul nume_fis exist ă şi are drept de citire -x nume_fis fişierul nume_fis există şi are drept de execuţie -w nume_fis fişierul nume_fis exist ă şi are drept de scriere -f nume_fis fi şier obi şnuit (Atenţie: dacă nume_fis  este un şir vid comanda test întoarce adevă rat !) -z şir  lungimea şirului este 0 -n şir  lungimea şirului nu este 0 şir  şirul nu este vid şir1 = şir2 şirurile sunt egale

Transcript of L4_sisteme de operare

Page 1: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 1/6

  1

LABORATOR NR. 4 - SISTEME DE OPERARE

TEMA LABORATORULUI

1. Limbajul de programare Shell -instrucţiuni de control

2. Aplicaţii

1. INSTRUCŢIUNI DE CONTROL

1.1. DECIZIA

Limbajul de programare Shell implementează decizia şi selecţia şi ca urmare ramificarea programului înfuncţie de anumite condiţii. Pentru decizie sintaxa este următoarea:

if <l i st a- 1>

then

<l i st a- 2>

else

(1)

<l i st a- 3>fi 

if  <l i st a- 1>

then

<l i st a- 2>elif  <l i st a- 3>

then (2)

<l i st a- 4>else

<l i st a- 5>fi

Cuvintele if, then, else, elif, fi sunt cuvinte cheie care marchează elementele structurii. În primul caz se execută lista de comenzi <l i sta- 1>iar dacă codul de retur este 0 (comandă reuşită

= adevărat), se va executa lista de comenzi <l i st a- 2>.  Dacă  codul de retur este diferit de 0 (comandă nereuşită=fals), se va executa lista de comenzi <l i st a- 3>.  

În a doua formă: dacă  <l i sta- 1> întoarce codul de retur 0, se va executa <l i sta- 2>, altfel seexecuta <l i sta- 3> şi dacă codul de r etur este 0 se execută <l i sta- 4>, altfel se execută <l i st a- 5>.

Exemplul 1:if test -e fifithen echo “Fisierul fifi exista in directorul curent”

else echo “Fisier negasit”fiÎn acest eexemplu s-a folosit în condiţie comanda test  cu optiunea -e, care întoarce 0 dacă  fişierul

specificat există şi este accesibil la citire şi 1 dacă fisierul nu există. Comanda test este internă Shell-ului şi areurmătoarea sintaxă:

test expr evaluează expresia condiţionată <expr>. Se permite şi forma [ expr ].Într-o expresie acceptată de comanda test pot apare următoarele :

-e nume_fis fişierul nume_fis există în directorul curent-r nume_fis fişierul nume_fis există şi are drept de citire-x nume_fis fişierul nume_fis există şi are drept de execuţie-w nume_fis fişierul nume_fis există şi are drept de scriere-f nume_fis fişier obişnuit(Atenţie: dacă nume_fis este un şir vid comanda test întoarce adevărat !)-z şir   lungimea şirului este 0-n şir   lungimea şirului nu este 0şir   şirul nu este vidşir1 = şir2  şirurile sunt egale

Page 2: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 2/6

  2

sir1 != sir2 şirurile nu sunt egale, etc.n1 -eq n2 numerele sunt egalen1 -ne n2 numerele nu sunt egale , etc.

Comanda test expr  (sau mai simplu [ expr ]), unde expr este o expresie, este foarte des utilizată  îninstrucţiunile de decizie precum şi în structurile de ciclare while şi until.Exemplul 2:

if [ “$1” = “ls” ]

then$1else

echo “Aţi tastat un şir diferit de ls”fi

1.2. SELECŢIA

Instrucţiunea de selecţie are următoarea sintaxă: case  <si r > in

<sabl on- 1> <l i st a- 1> ; ;<sabl on- 2> <l i st a- 2> ; ;. . . . . . . . . . . . . . . . . . . . . . . .

esac 

la execuţia instrucţiunii se verifică dacă <şi r >este identic cu unul din şabloanele <şabl on- i > şi în cazafirmativ se execută lista de comenzi <l i st a- i >.Exemplul 3:

echo -e “Introduceţi D sau N: \c”read raspuns rest

case $raspuns in[Dd]*) echo “Aţi răspuns Da” ;;[Nn]*) echo “Aţi răspuns Nu” ;;*) echo “Nici Da nici Nu” ;;

esac

În acest exemplu s-a folosit comanda internă read care are următoarea sintaxă:

read a1 [a2..]  citeşte un rind de la intrar ea standard; variabila a1 primeşte ca valoare primulcuvânt din linia citită, a2 pe la doilea, etc. Ultimul argument primeşte ca valoare restulliniei citite.

Exemplul 4:case “$1” in

*7) echo “Aţi tastat valoarea 7” ;;*15) echo “Aţi tastat valoarea 15” ;;*) echo “Nici 7, nici 15” ;;

esac

În acest exemplu se alege un caz în funcţie de valoarea parametrului $1 din linia de comandă  ascriptului.

Page 3: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 3/6

  3

  1.3. CICLAREA

Limbajul de programare Shell implementează ciclarea, adică executarea repetată a unei comenzi (sausecvenţe de comenzi), până la îndeplinirea unei condiţii. Condiţia este testată fie la începutul ciclului(instr ucţiunea while) sau la sfirşitul ciclului (instrucţiunea until). Instrucţ iunea while -ciclul cu test iniţial- aresintaxa:

while <l i st a- 1>

do

<l i st a- 2> ( 1)done

Secvenţa de instrucţiuni <l i sta- 2> se va executa până când lista de instrucţiuni <l i st a- 1>

întoarce 0, adică succes (adevărat). Se iese din ciclu cu valoarea 1, adică eşec (false), întoarsă de <l i sta-

1>.  While, do şi done sunt cuvinte cheie care marchează elementele structurii.

Instrucţiunea until - ciclul cu test final - are sintaxa:

until <l i st a- 1>

do

<l i st a- 2> ( 2)done

Secvenţa de instrucţiuni <l i sta- 2> se va executa până când lista de instrucţiuni <l i st a- 1>

întoarce 1, adică eşec (fals). Se iese din ciclu cu valoarea 0, adică eşec (false), întoarsă de <l i st a- 1>.

Until, do şi done, sunt cuvinte cheie care marchează elementele structurii.

Limbajul de programare Shell pune la dispoziţie şi o instrucţiune de ciclare cu contor:

for <var i abi l a> [ in  <val - 1>, <val - 2> . . ]

do

<l i st a> ( 3)done

Se execută în mod repetat l i sta>  până când <var i abi l a> ia succesiv toate valorile <val - i >.În cazul în care lipseşte lista de valori <var i abi l a>va lua succesiv valorile parametrilor procedurii.

1.4. SUBSTITUŢIA COMENZILOR 

Atunci când într-un program Shell o comandă este încadrată  de caracterul `  (accent grav), ea esteexecutată de Shell, iar rezultatul ei va substitui locul comenzii în program.Exemplul 5:

var1=`date`echo $var1

Variabila var1 va lua ca valoar e rezultatul comezii date, adică şirul de caractere care conţine data şi oracurentă.

Substituţia poate fi folosită şi pentru a construi expresii aritmetice cu variabile Shell.Exemplul 6:

contor=1contor = `expr $contor + 1`

Page 4: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 4/6

  4

Se execută comanda <expr>, care va calcula valoarea expresiei $contor + 1; valoarea acestei expresiiva fi atribuită variabilei contor.

Interpretarea comenzilor dintr-un program Shell se face în câteva faze (vezi laboratorul nr. 1, secţiunea1.4), iar printre fazele premergătoare se află:

- substituţia comenzilor încadrate în accente grave `;- substituţia variabilelor cu valoarea lor;- generarea numelor de fişiere pe baza metacaracterelor *, ? , [...].

Observaţie: În cadrul scripturilor Shell se folosesc în mod curent comenzile:test expr  evaluează expresia expr; se poate folosi şi [ expr ] (vezi lab 4, 1.1)expr <exp>  evaluează (calculează) o expresie <exp>shift  realizează  deplasarea argumentului. cu o poziţie la stânga ( $2->$1, $3->$2);break  permite ieşirea din ciclu înainte de îndeplinirea condiţiei;continue  permite reluarea ciclului cu următoarea iteraţie, înainte de terminarea iteraţiei curente.eval arg  argumentele comenzii sunt interpretate ca intrare pentru Shell

(exemplu: cmd=pwd; eval $cmd afişează directorul curent).exit n  termină execuţia scriptului Shell, întorcând codul de stare n; daca n lipseşte, exit reîntoarce

codul de strare întors de ultima comandă executată.

Utilizarea limbajului Shell poate aduce o importantă simplificare a efortului de programare, în cazulunor categorii de probleme cum ar fi:- aplicaţii a căror rezolvare implică mai multe operaţii care sunt oricum furnizate de diverse comenzi Shell;- aplicaţii care manipulează date sub forma de linii de text sau chiar fişiere text;- aplicaţii care implică consultarea directoarelor şi parcurgerea arborelui de directoare.

Exemplul 7:until test -r fifi

doecho “Fişierul fifi nu are drept de citire”

echo “Aşteptare de 5 secunde”sleep 5

doneProgramul testeaza dacă un fişierul fifi permite citirea, şi în caz că nu, aşteaptă 5 sec şi apoi reia ciclul.

Exemplul 8:contor=$#cmd=echowhile test $contor -gt 0

docmd=“$cmd \$$contor”contor=`expr $contor - 1`eval $cmd

done

Scriptul afişeaza argumentele cu care el a fost apelat. Şirul \$ este pentru caracterul $, folosit laexpandarea variabilei $cmd în comanda eval. Variabila $cmd are conţinutul: echo $contor, unde $contor are pe rând valorile $1, $2,, etc., la fiecare pas din ciclu.

Page 5: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 5/6

  5

Exemplul 9:for var1

dogrep $var1 fifi > cici

doneScri ptul va copia toate liniile conţinând un şir dat ca parametru, din fişierul <fifi> în fişierul <cici>.

În fişierul cici se va copia o singură linie din fifi, cea care conţ ine şirul dat ca argument în linia de comandă.

Exemplul 10:for fisier in *.cecho $fisier

done // În acest script variabila fişier va lua pe rând valorile rezultate din expandarea numelui ambiguu*.c, respectiv toate fişierele cu extensia .c.

Exemplul 11:list=“ “for var1

dolist=“$var1 $list”

doneecho $list //Variabila list va stoca parametrii de apel. Scriptul va afişa la execuţie parametrii de apel înordine inversă.

2. APLICAŢII

I .

a). Să  se studieze paginile de manual ale comenzilor test, read, expr, shift, eval, break continue,

exit.

b). Să se implementeze şi să se testeze exemplele din acest referat de laborator. Să  se arate (acolounde este cazul) ce este afişat pe ecran în urma execuţiei fiecărui script, în funcţie de parametrii

transmişi prin linia de comandă.c). Să  se scrie un script Shell numit fifi care să conţină  exemplul 8 din referatul de laborator. Să setesteze folosind 4 parametri de tip şir de caractere. Să  se modifice acest program astfel încât el săafişeze la fiecare iteraţie numai un singur parametru.

II. Sa se rezolve exercitiile urmatoare:

1.  Sa se creeze un script Shell care primeşte ca argumente numele unui fişier şi valoarea unui şir decaractere. Şirul de caractere să se adauge la sfâr şitul fişierului. Să se trateze în script situaţiile de eroare(parametri inexistenţi, fişier inexistent).

2.  Să  se creeze un script Shell care primeşte ca argument un şir de caractere. Să  se afişeze toate

apariţiile acestui şir în fişierele text din directorul curent. Să se trateze situaţ iile de eroare (argumentinexistent).

3.  Să  se creeze un script Shell numit del care şterge toate fişierele date ca argument în linia decomandă. Să se trateze în cadrul script-ului situaţiile de eroare. (Indicaţie: man bash pentru expandarenume ambigui).

4. Să se creeze un script Shell numit type care afişează conţinutul unui fişier al cărui nume a fost primitca argument în linia de comandă. Să se analizeze şi trateze situaţiile de eroare.

5. Să se creeze un script Shell care şterge un fişier al cărui nume este dat ca parametru, după ce a fostsolicitat răspunsul explicit al utilizatorului (Y sau N). Să se analizeze şi trateze şi situaţiile de eroare.

Page 6: L4_sisteme de operare

7/23/2019 L4_sisteme de operare

http://slidepdf.com/reader/full/l4sisteme-de-operare 6/6

  6

6.  Să  se scrie un script shell cu o buclă  while infinită  (while true), care primeşte 5 argumente.Programul să afişeze argumentele primite, câte unul la o iteraţ ie, apoi să se oprească. Să se trateze şisituaţiile de eroare. (Indicaţie: while true, continue, exit).

7.  Să  se scrie un script Shell care primeşte 5 parametri şi îi afişează în ordinea inversă  tastării lor:ultimul, penultimul, etc. Să se trateze şi situaţiile de eroare. (Indicaţie: while true, if, break)

8. Să se arate care este rezultatul scriptului din exemplul 10 al referatului de laborator nr.4. Să se scrieun script Shell care afişează acelaşi lucru, dar cu informaţii suplimentare: drepturi de acces, lungime,data creerii. Să se trateze şi situaţiile de eroare. (Indicaţie: vezi şi exemplul 8.)

9. Să se creeze mai multe fişiere cu extensia .c (daca nu există deja în directorul curent). Să se scrie unscript Shell printr-o singur ă comandă care să afişeze numele tuturor fişierelor cu extensisa .c dindirector (scriptul va avea acelaşi efect cu comanda ls -l *.c). Să se trateze şi situaţiile de eroare.(Indicaţie: man bash, capitolul despre parametri.)

10.  Să  se creeze un script Shell care afişeaza numele directoarelor conţinute de directorul indicat caargument. Dacă nu se indică nici un argument, se vor afişa numele directoarelor conţinute de directorulcurent. Să se tr ateze şi situaţiile de eroare. (Indicaţie: if, for, ls -l )

11. Să se creeze un script Shell care afişează directoarele conţinute de directorul indicat ca argument.Dacă  nu se indică  nici un argument, se vor afişa informaţiile despre directoarele conţinute de celcurent. (Indicaţie:if, test -d, for, ls -l .)

12. Să  se creeze un script Shell care primeşte ca parametri numele unui fişier text sursă, două valorinumerice n1 si n2, precum şi numele unui fişier text destinaţie. Să se înscrie în fişierul destinaţie numaicaracterele din fiecare linie a fişierului sursă, care sunt între poziţiile n1 şi n2. Să se trateze şi situaţiilede eroare. (Indicaţie:for, cut)

13.  Să  se creeze un script Shell care afişează  numărul de linii din toate fişierele cu extensia .c dindirectorul curent. Să se trateze şi situaţiile de eroare. (Indicaţie: for, wc)

14. Să se creeze un script Shell care realizează redenumirea unui fişier. Numele vechi şi cel nou vor fidate ca argumente în linia de coamandă. Să se trateze şi situatiile de eroare. (Indicaţie: for, cut)

15. Să se creeze un script Shell care primeşte ca parametri numele unui fişier text sursă, şi un anumitcaracter. Să se creeze un fişier text destinaţie care conţine numai liniile cu caracterul dat ca parametru,

 până la prima apariţie a sa. Să se trateze şi situatiile de eroare. (Indicaţie: for, cut)16. Să se creeze un script Shell care primeşte ca argumente două şiruri de caractere. Să se înlocuiască cele două promptere sistem cu aceste şiruri de caractere. Să se analizeze şi situaţiile de eroare.