modulul 3. scripturi sub linux - horatiuvlad.com · sub linux, fişierele de comenzi se numesc...

17
72 Modulul 3. Scripturi sub Linux Cuprins Introducere ............................................................................................................... 72 CompetenŃele modului .............................................................................................. 72 U1. Concepte fundamentale necesare scrierii scripturilor sub Linux .......................... 73 U2. Utilizarea structurilor de programare în shell ..................................................... 89 U3. Realizarea de scripturi cu utilitarul AWK ..........................................................109 Introducere. Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni specifice unui interpretor de comenzi. Scripturile reprezintă modalitatea prin care mai multe comenzi pot fi lansate în execuŃie, prin tastarea la prompterul afişat de o consolă, a unei singure comenzi, numele fişierului care conŃine comenzile respective. Linux oferă o serie de facilităŃi de realizare a scripturilor, care vor fi decrise în cadrul modulului. Mediul de execuŃie stabilit de shell influenŃează efectul rulării comenzilor; stabilirea mediului de execuŃie al comenzilor reprezintă una dintre sarcinile fundamentale ale unui shell. Astfel, unele caractere speciale definesc moduri diferite de interpretare a unor secvenŃe. De asemenea, shellul Linux recunoaşte variabilele de sistem şi cele definite de utilizator. Prin anumite setări ale variabilelor de sistem, se asigură suportul necesar utilizatorului în scrierea de scripturi şi lansarea lor în execuŃie. Parametrizarea reprezintă o metodă prin care creşte caracterul de generalitate al scripturilor. Shellul oferă o serie de structuri asemănătoare celor oferite de limbajele de programare. Astfel, se poate direcŃiona ordinea de execuŃie a secvenŃelor de comenzi, în funcŃie de semantica scriptului respectiv. Utilitatea principală a unui script este posibilitatea de automatizare. Anumite sarcini repetitive pot fi descrise în cadrul unui script. De fiecare dată când este necesară execuŃia acelei sarcini, se lansează în execuŃe scriptul respectiv. Aceste scripturi reprezintă un instrument de lucru al administratorilor de sisteme Linux, prin care se pot lansa anumite servicii sau se pot obŃine anumite informaŃii despre sistem. Astfel, scripturile pot fi utilizate pentru automatizarea sarcinilor zilnice: realizarea de copii de siguranŃă, verificarea stării sistemului etc. Utilitarul AWK oferă o serie de instrucŃiuni, care au o sintaxă şi semantică apropiată de limbajul C, ceea ce are ca efect scrierea unor scripturi care să realizeze calcule mult mai complexe, decât cele oferite de comenzile shell. AWK poate prelucra şiruri de caractere, provenite dintr-unul sau mai multe fişiere, din expresii regulate sau din ieşirea unor comenzi; selectarea acestor şiruri se face pe baza unor condiŃii. CompetenŃe La sfârşitul acestui modul studenŃii vor fi capabili să: explice metodele de stabilire a mediului de lucru shell; explice cum se crează un script sub shell; utilizeze structurarea comenzilor sub shell; explice facilităŃile oferite de utilitarul AWK.

Upload: others

Post on 18-Jan-2020

29 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

72

Modulul 3. Scripturi sub Linux Cuprins Introducere ............................................................................................................... 72 CompetenŃele modului .............................................................................................. 72 U1. Concepte fundamentale necesare scrierii scripturilor sub Linux.......................... 73 U2. Utilizarea structurilor de programare în shell ..................................................... 89 U3. Realizarea de scripturi cu utilitarul AWK..........................................................109

Introducere. Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni specifice unui interpretor de comenzi. Scripturile reprezintă modalitatea prin care mai multe comenzi pot fi lansate în execuŃie, prin tastarea la prompterul afişat de o consolă, a unei singure comenzi, numele fişierului care conŃine comenzile respective. Linux oferă o serie de facilităŃi de realizare a scripturilor, care vor fi decrise în cadrul modulului.

Mediul de execuŃie stabilit de shell influenŃează efectul rulării comenzilor; stabilirea mediului de execuŃie al comenzilor reprezintă una dintre sarcinile fundamentale ale unui shell. Astfel, unele caractere speciale definesc moduri diferite de interpretare a unor secvenŃe. De asemenea, shellul Linux recunoaşte variabilele de sistem şi cele definite de utilizator. Prin anumite setări ale variabilelor de sistem, se asigură suportul necesar utilizatorului în scrierea de scripturi şi lansarea lor în execuŃie. Parametrizarea reprezintă o metodă prin care creşte caracterul de generalitate al scripturilor. Shellul oferă o serie de structuri asemănătoare celor oferite de limbajele de programare. Astfel, se poate direcŃiona ordinea de execuŃie a secvenŃelor de comenzi, în funcŃie de semantica scriptului respectiv.

Utilitatea principală a unui script este posibilitatea de automatizare. Anumite sarcini repetitive pot fi descrise în cadrul unui script. De fiecare dată când este necesară execuŃia acelei sarcini, se lansează în execuŃe scriptul respectiv. Aceste scripturi reprezintă un instrument de lucru al administratorilor de sisteme Linux, prin care se pot lansa anumite servicii sau se pot obŃine anumite informaŃii despre sistem. Astfel, scripturile pot fi utilizate pentru automatizarea sarcinilor zilnice: realizarea de copii de siguranŃă, verificarea stării sistemului etc.

Utilitarul AWK oferă o serie de instrucŃiuni, care au o sintaxă şi semantică apropiată de limbajul C, ceea ce are ca efect scrierea unor scripturi care să realizeze calcule mult mai complexe, decât cele oferite de comenzile shell. AWK poate prelucra şiruri de caractere, provenite dintr-unul sau mai multe fişiere, din expresii regulate sau din ieşirea unor comenzi; selectarea acestor şiruri se face pe baza unor condiŃii.

CompetenŃe La sfârşitul acestui modul studenŃii vor fi capabili să: � explice metodele de stabilire a mediului de lucru shell; � explice cum se crează un script sub shell; � utilizeze structurarea comenzilor sub shell; � explice facilităŃile oferite de utilitarul AWK.

Page 2: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

73

Unitatea de învăŃare M3.U1. Concepte fundamentale necesare scrierii scripturilor sub Linux Cuprins

M3.U1.1. Introducere................................................................................................ 73 M3.U1.2. Obiectivele unităŃii de învăŃare.................................................................. 73 M3.U1.3. Caracter speciale în shell........................................................................... 74 M3.U1.4. Definirea şi referenŃierea variabilelor ........................................................ 74 M3.U1.5. Variabile de sistem.................................................................................... 77 M3.U1.6. Variabile vector......................................................................................... 79 M3.U1.7. SubstituŃia comenzilor............................................................................... 80 M3.U1.8. Scrierea scripturilor sub Linux .................................................................. 81 M3.U1.9. Controlul secvenŃial .................................................................................. 82 M3.U1.10. Expresii shell .......................................................................................... 84 M3.U1.11. Teste de evaluare a cunoştinŃelor............................................................. 87 M3.U1.12.Rezumat................................................................................................... 88

Introducere Pentru realizarea scripturilor, este necesareă stăpânirea câtorva concepte fundamentale. Caracterele speciale sunt utilizate în specificarea modului de interpretare a unor construcŃii, cum ar fi expresiile regulate, care au fost prezentate în modulul anterior. Altă entitate fundamentală utilizată în scriere scripturilor o reprezintă utilizarea variabilelor. Variabilele predefinite sunt utilizate pentru setarea unor caracteristici ale mediului de execuŃie al scripturilor; setarea căilor de căutare a scripturilor şi fişierelor executabile, a prompterului afişat în linia de comandă sunt două exemple de utilizare a variabilelor de sistem. Fiecare variabilă este setată prin atribuirea unui şir de caractere; interpretarea şirului respectiv se face prin intermediul caracterelor speciale. De asemenea, Linux oferă posibilitatea evaluării şi utilizării expresiilor aritmetice şi a celor care utilizează şiruri de caractere. În cadrul acestei unităŃi de învăŃare vom studia controlul secvenŃial al instrucŃiunilor, prin care o anumită instrucŃiune se execută în funcŃie de codul de retur al uneia anterioare; de asemenea, există posibilitatea grupării instrucŃiunilor, prin care se poate gestiona efectul grupului respectiv.

Obiectivele unităŃii de învăŃare. La sfârşitul acestei unităŃi de învăŃare studenŃii vor fi capabili să: � explice rolul caracterelor speciale; � explice semnificaŃia variabilelor predefinite; � declare şi utilizeze variabilele definite de utilizator; � explice semnificaŃia structurilor de control utilizate; � costruiască un script; � explice parametrizarea scripturilor; � înŃeleagă şi să explice controlul secvenŃial în shell; � înŃeleagă şi să explice evaluarea expresiilor.

Durata medie de parcurgere a unităŃi de învăŃare este de 3 ore.

Page 3: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

74

M3.U1.3. Caractere speciale în shell

Unele caractere au semnificaŃie specială pentru interpretorul shell, în diverse specificaŃii, cum este cazul celor utilizate în contextul expresiilor regulate, în modul de evaluare al conŃinutului variabilelor etc. În cazul Bash caracterele speciale sunt: # & * ? [ ] ( ) = | ^ ; < > ` $ ” ’ \

Caracterele spaŃiu, tab şi newline au rolul de separatori de cuvinte. Dezautorizarea unui caracter, înseamnă că el va fi interpretat într-un anumit text ca un simbol obişnuit, fără a mai avea o altă semnificaŃie.

Dezautorizarea semnificaŃiei caracterelor speciale se face prin trei astfel de metode, indicate de caracterele speciale ', '' şi \, care operează astfel: ’text’ Dezautorizează toate caracterele speciale din text. ”text” Dezautorizează caracterele speciale din text cu excepŃia $, ` şi \. \c Dezautorizează caracterul special c. La sfârşit de linie elimină un newline.

În cele ce urmează, folosim comanda echo, care afişează în fişierul standard de ieşire argumentele date în linia de comandă.

Exemplu. $echo 99 \> 89 99 > 89

Se anulează sensul special al caracterului >, deci el va fi interpretat ca un simplu caracter. $echo 99 > 89 echo: syntax error. Argumentul comenzii este o expresie eronată.

Exemplu. $echo unu plus doi ' egal trei? ' sau patru # sau $$. unu plus doi egal trei? sau patru Cele două apostrofuri sunt considerate caracter de citare, deci nu sunt tipărite. Caracterul ? dintre apostrofuri nu mai este de caracter special. Caracterul # marchează pentru shell începutul unui comentariu, deci restul liniei este ignorată.

Exemplu. $echo ”unu plus doi 'egal trei?'sau patru # sau $$.” unu plus doi 'egal trei?'sau patru # sau 1191. SpaŃiile din textul dintre ghilimele sunt tratate ca şi caractere obişnuite, ca şi apostroful. $$ desemnează valoarea variabilei de mediu $, care conŃine identificatorul de proces (PID) al shell-ului, care se înlocuieşte în text.

M3.U1.4. Definirea şi referenŃierea variabilelor

Sub Linux, variabilele păstrează informaŃii necesare stabilirii mediului de execuŃie al comenzilor. Valorile lor sunt şiruri de caractere şi sunt iniŃializate prin comenzi de atribuire de forma: var=sir Referirile la valoarea unei variabile de mediu este de forma $var. Pentru ca iniŃializarea unei variabile să rămână valabilă pe întreaga durată a unei sesiuni de lucru a unui utilizator ea trebuie exportată. În acest caz, atribuirea are forma: var=sir; export var

Exemplu. IniŃializarea unei variabile recunoscute numai pe durata unei sesiuni shell. $VAR=text $echo $VAR text

Page 4: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

75

Exemplu. IniŃializarea unei variabile recunoscute pe durata unei întregi sesiuni de lucru a unui utilizator. $VAR=text $echo $VAR text $export VAR $bash $echo $VAR Text

Prin execuŃia comenzii bash se lansează un nou proces shell; observăm că şi acest nou proces recunoaşte setarea variabilei exportate.

Variabilele de mediu se mai pot clasifica în variabile globale şi variabile locale. Variabilele locale sunt vizibile numai în cadrul comenzii sau scriptului în care au fost create. Variabilele globale sunt vizible în cadrul altor entităŃi legate de un proces sau un script, cum ar fi o funcŃie din cadrul unui script sau un fiu al unui proces, noŃiuni pe care le vom discuta mai târziu. Comanda printenv listează toate variabilele de mediu existente în momentul tastării; se pot observa diferenŃele dintre variabilele exportate şi neexportate.

Exemplu. Un fragment din ieşirea comenzii printenv. $printenv HOSTNAME=statia1.info.unitbv.ro TERM=xterm SHELL=/bin/bash HISTSIZE=1000 OLDPWD=/home/ilflorea/test/test1 SSH_TTY=/dev/pts/0 USER=ilflorea PATH=.:./bin: /HOME/ilflorea/bin:/bin:/usr/bin INPUTRC=/etc/inputrc PWD=/home/ilflorea HOME=/home/ilflorea LOGNAME= ilflorea

Există variabile definite de utilizator în scripturile scrise de acesta şi variabile predefinite, care pot fi utilizate în toate scripturile sau în toate comenzile. Valorile acestor variabile sunt stabilite de sistem la intrarea în sesiune, dar pot fi modificate de utilizator pe parcurs.

Substituirea valorii unei variabile shell se poate specifica printr-una dintre specificaŃiile: $var ${var} ${var - sir} ${var = sir} ${var + sir} ${var? sir}

Exemplu. Dacă se tastează: $nr1=unu $nr2=doi $echo Dupa $nr1 urmeaza $nr2 Dupa unu urmeaza doi

Page 5: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

76

Exemplu. Dacă se tastează: $nr1=unu $nr2=doi $echo Dupa $nr1 urmeaza $nr2 Dupa unu urmeaza doi $echo Dupa $nr2 urmeaza $nr3 Dupa unu urmeaza

Variabila nr3 nu afost iniŃializată, deci are ca valoare şirul vid. SpecificaŃia ${var - sir} furnizează ca rezultat:

- valoarea variabilei var, dacă aceasta a fost iniŃializată; - şirul sir în caz contrar.

Daca variabila var nu a fost definită, ea rămâne nedefinită.

Exemplu. $echo ${nr-unu} unu $echo $nr $nr=doi $echo ${nr-unu} doi $echo $nr doi

Spre deosebire de specificaŃia precedentă, în cazul${var = sir}, dacă variabila var nu există, ea va fi definită şi cunoscută în continuare cu valoarea sir.

Exemplu. $echo ${nr=unu} unu $echo $nr unu $nr=doi $echo ${nr=unu} doi $echo $nr doi

SpecificaŃia ${var+sir} schimbă valoarea variabilei var în sir. Dacă variabila nu există, atunci ea va rămâne nedefinită.

Exemplu. $nr=doi $echo ${nr+unu} unu $echo $nr doi

SpecificaŃia ${var?sir}: Dacă var este definită, atunci rezultatul este valoarea curentă a variabilei. În caz contrar, se afişează sir şi procesul curent se termină.

Exemplu. $nr1=unu

$echo ${nr1?doi} unu

$echo ${nr2?doi} doi

Page 6: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

77

Să ne reamintim... Unele caractere au semnificaŃie specială pentru interpretorul shell, în diverse specificaŃii, cum este cazul celor utilizate în contextul expresiilor regulate, în modul de evaluare al conŃinutului variabilelor etc. Dezautorizarea unui caracter, înseamnă că el va fi interpretat într-un anumit text ca un simbol obişnuit, fără a mai avea o altă semnificaŃie. Sub Linux, variabilele păstrează informaŃii necesare stabilirii mediului de execuŃie al comenzilor. Valorile lor sunt şiruri de caractere şi sunt iniŃializate prin comenzi de atribuire. Pentru ca iniŃializarea unei variabile să rămână valabilă pe întreaga durată a unei sesiuni de lucru a unui utilizator ea trebuie exportată. Există variabile definite de utilizator în scripturile scrise de acesta şi variabile predefinite, care pot fi utilizate în toate scripturile sau în toate comenzile. Valorile acestor variabile sunt stabilite de sistem la intrarea în sesiune, dar pot fi modificate de utilizator pe parcurs. Variabilele de mediu se mai pot clasifica în variabile globale şi variabile locale. Variabilele locale sunt vizibile numai în cadrul comenzii sau scriptului în care au fost create. Variabilele globale sunt vizible în cadrul altor entităŃi legate de un proces sau un script, cum ar fi o funcŃie din cadrul unui script sau un fiu al unui proces, noŃiuni pe care le vom discuta mai târziu.

1. Ce se afişează în urma execuŃiei comenzii: $echo orele la ID 'se tin sambata' sau duminica # $$ 2. Ce se afişează în urma execuŃiei comenzii: $echo “orele la ID 'se tin sambata' sau duminica # $$” 3. Ce se afişează în urma execuŃiei secvenŃei de comenzi: $zi=sambata

$echo ${zi?duminica}

M3.U1.5. Variabile de sistem

Variabila PATH conŃine o listă a directoarelor în care CPU caută numele de comenzi lansate în execuŃie. Există astfel posibilitatea lansării acestora fără specificarea căii către fişierele de comenzi sau executabile respective. Elementele listei sunt separate prin caracterul :şi ordinea de căutare este dată de ordinea specificării în listă. Pentru a adăuga noi directoare în lista de căutare, se utilizează o comandă de atribuire: PATH=$PATH:cale

Exemplu. Atribuire de valori pentru această variabilă: PATH=.:./bin:$HOME/bin:/bin:/usr/bin Conform acestei specificaŃii, numele comenzii lansate sau se va căuta mai întâi în directorul curent (. înaintea primului :), apoi în subdirectorul bin al directorului curent (./bin), apoi în subdirectorul bin al directorul lui gazdă al utilizatorului (conŃinut în variabila HOME), în directorul /bin şi în final în directorul /usr/bin. Adăugarea căii de căutare /usr/local/bin: PATH=$PATH:/usr/local/bin

Variabila HOME conŃine directorul gazdă al utilizatorului; observăm că în exemplul anterior am utilizat această variabilă.

Exemplu. $echo $HOME /home/ilflorea

Page 7: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

78

Variabila MANPATH conŃine lista directoarelor în care se caută paginile de manual on-line de către comanda man. O valoare tipică este MANPATH=/usr/man:/usr/local/man

Variabila TERM conŃine tipul terminalului folosit în sesiunea curentă. Variabila MAIL conŃine numele de cale pentru cutia poştală a utilizatorului. Variabila PS1 conŃine şirul folosit ca prompt. Implicit utilizatorii obişnuiŃi au promptul $, iar cel cu drepturi de root are promptul #. Ca şi celelalte variabile de mediu, PS1 poate fi redefinit de utilizator. Se pot utiliza mai multe argumente de setare, cele mai utilizate fiind: \h numele calculatorului (host) la care s-a loginat utilizatorul; \s numele shell-ului; \t valoarea curentă a timpului exprimată în formatul ora:min:sec; \u nume de login al utilizatorului(user); \v versiunea shell-ului Bash utilizat; \w calea absolută către directorul curent (working directory ); \W numele directorului curent; \[ începutul unei secvenŃe de codificare; \] sfârşitul unei secvenŃe de codificare. Exemplu. Să presupunem că terminalul bash afişează:

ilflorea@1[~]$ Dacă tastăm: ilflorea@1[~]$echo $PS1 o să se afişeze: \u@\l[\W]\$ Observăm cele trei componente ale prompt-ului: - numele utilizatorului care a lansat shellul (\u): - numărul terminalului virtual (\l); - numele directorului curent (\W); în acest caz este directorul gazdă (semnul tilda afişat între paranteze drepte).

Exemplu. Să presupunem că terminalul bash afişează: [ilflorea@statia1 ~]$ În acest caz, se foloseşte numele de gazdă, în locul numărului de consolă.

Exemplu. Pentru ca terminalul să afişeze un nou prompt, atribuim o nouă valoare

lui PS1. [ilflorea@statia1~]$PS1="[\t][\u]\$"

[21:50:12][ilflorea]$ Observăm că noul prompt afişează ora curentă, şi numele de user, ambele între paranteze drepte. Dacă tastăm: [ilflorea@statia1~]$PS1="\u@\h:\w\$" O să apară prompt-ul: ilflorea@statia1:\home\ilflorea$

Observăm că am folosit codurile:\u – user, \h – host, \w -

working directory. De asemenea, am inserat caracterul @ între numele utilizatorului şi numele de gazdă, respectiv caracterul :între numele de gazdă şi directorul gazdă al utilizatorului. Nu am mai utilizat parantezele drepte ca delimitatori.

Page 8: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

79

Variabila PS2 conŃine şirul prompt suplimentar, utilizat când o comandă se întinde pe mai multe linii (implicit este caracterul >). Variabila $ conŃine numărul procesului (PID) pentru acest shell. Frecvent valoarea acestei variabile este folosită pentru generarea de nume de fişiere temporare, deoarece PID-urile existente în sistem la un moment dat sunt unice. Variabila # conŃine numărul de argumente din linia de comanda. Variabila 0 (zero) conŃine numele comenzii executate. Se foloseşte când pentru aceeaşi comandă există mai multe nume. Variabila n conŃine ( pentru valori între l şi 9 ) reprezintă al n-lea argument din linia de comandă .

Să ne reamintim...

Variabilele de mediu conŃin parametri ai unei sesiuni de lucru. ConŃinutul lor poate fi accesat în cadrul comenzilor şi valorile acestora pot fi modificate, în funcŃie de necesităŃile utilizatorului.

1. ScrieŃi o comandă prin care să se adauge la căile de căutare: directorul curent, directorul tată şi directorul gazdă. 2. ModificaŃi prompt-ul astfel încât acesta să conŃină: numele utilizatorului care a lansat shellul între paranteze drepte, caracterul @, directorul curent şi valoarea timpului între paranteze drepte.

M3.U1.6. Variabile vector

Un vector se declară şi se iniŃializează specificând elementele sale între două paranteze rotunde, separate prin caracterul spaŃiu.

Exemplu: $sir_num=(unu doi trei patru cini)

Am declarat şi iniŃializat un vector cu 5 elemente.

Valorile indicelui sunt 0, 1, 2,… ReferinŃa la un element al vectorului se face specificând numele vectorului şi indicele între paranteze drepte.

Exemplu: $echo ${sir[2]} trei

Pentru a afişa tot vectorul, în poziŃia indicelui trebuie specificat caracterul *. Exemplu: $echo $sir unu În schimb: $echo ${sir [*]} unu doi trei patru cini

Se poate modifica valoarea unui element al vectorului printr-o instrucŃiune de atribuire. Exemplu: $sir[2]=sase $echo ${mytest[*]} unu doi sase patru cini

Pentru a şterge conŃinutul unui element al tabloului, putem folosi comanda unset.

Page 9: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

80

Exemplu: $unset sir[2] $echo ${sir[*]} unu doi patru cini $echo ${sir[2]} $echo ${sir[3]} patru

Se poate şterge un întreg vector, dacă acesta este argument al unei comenzi unset. Comanda poate fi folosită şi pentru ştergerea unei variabile oarecare.

$unset sir $echo ${sir[*]}

Să ne reamintim...

Un vector se declară şi se iniŃializează specificând elementele sale între două paranteze rotunde, separate prin caracterul spaŃiu. Valorile indicelui sunt 0, 1, 2,… ReferinŃa la un element al vectorului se face specificând numele vectorului şi indicele între paranteze drepte.

1. SetaŃi componentele unui vector cu 7 elemente; afişaŃi componentele 3 şi 6; ştergeŃi componentele 2 şi 5; listaŃi conŃinutul întregului vector.

M3.U1.7. SubstituŃia comenzilor

Ieşirea standard produsă de o comandă poate fi substituită în locul în care apare comanda respectivă, daca acea comandă este încadrată între accente inverse (`...`) sau este inclusă între acolade care sunt precedate de semnul $. Prin această construcŃie, ieşirea unei comenzi poate fi folosită ca argument al altei comenzi. De asemenea, există posibilitatea de a se asocia aliasuri unei comenzi.

Exemplu. Un utilizator doreşte să trimită un mesaj prin poşta electronică tuturor utilizatorilor aflaŃi momentan în sesiune cu el. Se tastează:

$mail `who | cut -c1-8 | sort -u `

Cu who se obŃine lista sesiunilor deschise (un utilizator poate avea simultan mai multe sesiuni); prin cut se reŃin primele 8 coloane din linie (numele utilizatorului), iar prin sort -u se face sortarea numelor cu eliminarea duplicatelor.

Exemplu. Dacă directorul curent este /home/ilflorea, comanda: $ echo Va aflati in directorul `pwd`! va afişa la ieşirea standard: Va aflati in directorul /home/ilflorea! Dacă se lansează: $echo Va aflati in directorul pwd! rezultatul execuŃiei va fi: Va aflati in directorul pwd!

Page 10: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

81

Redefinirea comenzilor(alias-uri). În multe situaŃii este preferabil să se asocieze unei comenzi (eventual lansată cu un număr mare de opŃiuni sau parametri ) un identificator. Prin tastarea acestuia în linia de comandă, se obŃine acelaşi efect ca şi când am lansa comanda respectivă. Sintaxa unei astfel de declaraŃii este: nume=`instructiune`

Exemplu. O opŃiune utilă a comenzii ls este –F; efectul ei este de a pune un slash (/) dupa directoare şi un asterisk (*) după fişiere executabile. Se poate defini: $alias lf=‘ls –F`

Exemplu. Se defineşte o asociere între un identificator şi legarea în conductă a două instrucŃiuni. Se tastează: $alias llm=`ls −al | more`

Exemplu de utilizare greşită a alias-ului. Dacă se defineşte un alias pentru un nume

de director, de genul: alias Nume_dir=/dir1/dir2/dir3 şi se tastează $cd Nume_dir bash va afisa un mesaj de eroare: No such file or directory.

Anularea aliasurilor definite anterior se face cu comanda unalias.

Să ne reamintim...

Ieşirea standard produsă de o comandă poate fi substituită în locul în care apare comanda respectivă, daca acea comandă este încadrată între accente inverse (`...`) sau este inclusă între acolade care sunt precedate de semnul $.

Unei anumite comenzi, lansată eventual cu un număr mare de opŃiuni sau parametri, putem să-i asociem un identificator (alias). Prin tastarea acestuia în linia de comandă, se obŃine acelaşi efect ca şi când am lansa comanda respectivă.

1. RescrieŃi exemplele anterioare, punând instrucŃiunea care se substituie între acolade precedate de semnul $. 2. AsociaŃi un alias unei comenzi care să caute toate fişierele din structura care începe din directorul gazdă care au setate toate drepturile pentru toate categoriile de utilizatori, să le afişeze atributele, ordonate după data creerii şi dimensiune.

M3.U1.8. Scrierea scripturilor sub Linux

Pe lângă execuŃia comenzilor citite de la un terminal, shell-ul poate controla şi execuŃia unor comenzi citite dintr-un fişier. Astfel de fişiere se numesc scripturi sau proceduri shell (“shell scripts”). Pe lângă comenzile Linux propriu-zise, aceste fişiere pot conŃine structuri pentru controlul fluxului. Scripturile se pot edita ca orice fişier text.

Pentru a se indica shel-ului dorit să interpreteze comenzile din scriptul respectiv, prima linie din script este de forma: #!/bin/nume_shell De obicei, caracterul # indică începutul unui comentariu; face excepŃie situaŃia în care al doilea caracter este !, caz în care shell-ul interpretează restul liniei ca şi o comandă shell pe care o execută. Dacă se foloseşte shel-ul implicit (bash) această linie nu mai este necesară.

După salvarea fişierului, pentru ca numele său să poate fi folosit ca orice altă comandă Linux, trebuie setat dreptul său de execuŃie, folosind o comandă chmod.

Page 11: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

82

Exemplu. Dacă nume_script este numele cu care a fost salvat scriptul respectiv şi suntem în directorul în care a fost salvat scriptul, dacă se tastează: $chmod a+x nume_script Se va seta dreptul de execuŃie pentru toŃi utilizatorii.

Pentru lansarea în execuŃie, se tastează o linie de forma:

$ cale\nume_script [Lista_arg]

cale indică directorul unde a fost salvat scriptul respectiv; Lista_arg este de forma arg1 arg2 ... argn.

Orice script poate fi parametrizat prin utilizarea parametrilor formali, notaŃi cu $0,..., $n , care pot fi utilizaŃi ca denumiri ale unor entităŃi din interiorul scriptului. Asocierea argumentelor din linia de comandă cu parametrii formali dintr-un script shell se face astfel: $0 se substituie cu numele scriptului (comanda), în timp ce $i se substituie cu al i-lea argument din linia de comandă ( i = 1,..,9). Dacă sunt mai puŃin de 9 argumente, cele absente au ca valoare şirul vid. Dacă comanda este lansată cu mai mult de 9 argumente, se vor reŃine toate, dar la un moment dat vor putea fi referite doar primele 9 prin intermediul construcŃiilor de forma $1 până la $9, plus numele comenzii reŃinut în $0.

Să ne reamintim...

Un script se scrie ca orice fişier text; după salvare, numele poate fi folosit ca orice altă comandă Linux pentru a fi lansat în execuŃie. Orice script poate fi parametrizat prin utilizarea parametrilor formali, notaŃi cu $0,..., $n , care pot fi utilizaŃi ca denumiri ale unor entităŃi din interiorul scriptului.

Întrebări. 1. Dacă nu se foloseşte shell-ul implicit, ce trebuie să conŃină prima liniue a unui script. 2. Care parametru formal se substituie cu $0.

M3.U1.9. Controlul secvenŃial

cda1 && cda2 are semnificaŃia: - se execută cda1; - dacă execuŃia acesteia s-a terminat cu succes (cod de retur zero), se execută şi cda2.

cda1 || cda2 are semnificaŃia: - se execută cda1; - dacă execuŃia acesteia se termină cu eşec (cod de retur nenul) se execută şi cda2.

Exemplu. Dacă se tastează: $cd /home/ilflorea && ls -l

Se afişează conŃinutul directorului /home/ilflorea, numai dacă acesta există (comanda cd s-a terminat cu succes).

Exemplu. Dacă se tastează: $cd /home/ilflorea && echo Director inexistent

Se afişează mesajul Director inexistent numai dacă directorului /home/ilflorea nu există (comanda cd s-a terminat cu eşec).

Caracterul ; separă două comenzi care se vor executa succesiv. Delimitatorul de comenzi permite scrierea mai multor comenzi pe aceeaşi linie. Trecerea la execuŃia comenzii următoare se face numai după terminarea execuŃiei comenzii precedente din aceeaşi linie.

Page 12: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

83

Astfel, într-o linie de forma: cmd1; cmd2; cmd3 execuŃia comenzii cmd2 începe numai după terminarea lui cmd1, iar a lui cmd3 numai după terminarea lui cmd2.

Exemplu. $pwd;ls;cd ../ilflorea;pwd;ls >/tmp/iesiri.out

Redirectarea finală se aplică numai ultimei comenzi ls. Ieşirile celorlalte comenzi apar pe ecran (nu sunt redirectate).

ObservaŃie. Trebuie făcută deosebirea între această construcŃie şi legarea în pipe; prin legare în pipe, pot fi lansate simultan în execuŃie, în procese separate, mai multe comenzi. Gruparea comenzilor. O succesiune de comenzi delimitată de paranteze sau de acolade şi separate prin ; contează sintactic ca o singură comandă. Efectul execuŃiei unei astfel de comenzi este diferit în funcŃie de delimitatorii folosiŃi. Astfel, comenzile dintre paranteze nu afectează mediul exterior, pe când cele dintre acolade modifică acest mediu.

Exemplu. ${ pwd;ls;cd ../ ilflorea;pwd;ls; } >/tmp/iesiri.out Redirectarea se va aplica ieşirilor tuturor comenzilor grupate. Pentru: $( pwd;ls;cd ../ ilflorea; pwd; ls ) >/tmp/iesiri.out Aplicarea redirectării va afecta numai interiorul grupului.

Exemplu. $( pwd;ls |grep fis) | wc are ca efect faptul că pentru comanda wc fişierul de intrare este constituit din: fişierul de ieşire produs de pwd la care se adaugă rezultatul legării în pipe ls| grep. Aceeaşi efect se obŃine prin: $pwd >/tmp/tmp$$; ls | grep >>/tmp/tmp$$ $wc /tmp/tmp$$

Exemplu. Presupunem că directorul curent este /home/ilflorea. ExecuŃia comenzii: $ pwd; (cd ..; pwd;); pwd are ca efect afişarea următoarelor linii: /home/ilflorea /home /home/ ilflorea În schimb, comanda: $pwd; { cd ..; pwd; }; pwd va afişa: /home/ilflorea /home /home

În cazul grupării comenzilor cd şi pwd între paranteze rotunde, acestea au efect doar în interiorul lor, în timp ce în cazul grupării comenzilor între acolade, rezultatul execuŃiei lor este global, fiind vizibil şi în exteriorul grupului.

Să ne reamintim... Shellul Linux oferă posibilitatea ca o comandă să fie executată numai dacă o altă comandă rulată anterior genereză codul de retur 0, respectiv codul de retur 1. Caracterul ; separă două comenzi care se vor executa succesiv. Delimitatorul de comenzi permite scrierea mai multor comenzi pe aceeaşi linie. O succesiune de comenzi delimitată de paranteze sau de acolade şi separate prin ;

Page 13: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

84

contează sintactic ca o singură comandă. Efectul execuŃiei unei astfel de comenzi este diferit în funcŃie de delimitatorii folosiŃi. Astfel, comenzile dintre paranteze nu afectează mediul exterior, pe când cele dintre acolade modifică acest mediu.

1. ScrieŃi o comandă pwd care să se execute numai dacă o comandă cd scrisă anterior, relativ la o cale s-a terminat cu succes. 2. Care este efectul execuŃiei comenzilor: $ ls -l; ( cd ..; ls –l ); ls –l 3. Care este efectul execuŃiei comenzilor: $ ls -l; { cd ..; ls –l }; ls -l

M3.U1.10 Expresii shell

Evaluarea expresiilor aritmetice şi a celor cu şiruri de caractere se realizează cu comanda expr, urmată de expresia care urmează să fie evaluată. AcelaŃi lucru se poate face, plasând expresia respectivă între [ ] şi acestă construcŃie trebuie precedată de caracterul $.Operatorii aritmetici pentru numere întregi şi cei pentru şiruri de caractere sunt prezentaŃi în tabelul 3.1.1. Operator Descriere ARG1 | ARG2 Returnează ARG1 dacă nici unul dintre argumente este zero/şirul vid;

altfel, returnează ARG2. ARG1 & ARG2 Returnează ARG1 dacă nici unul dintre argumente este zero/şirul vid;

altfel, returnează 0. ARG1 < ARG2 Returnază 1 dacă ARG1 este mai mic decât ARG2; altfel, returnează 0. ARG1 <= ARG2 Returnază 1 dacă ARG1 este mai mic sau egal cu ARG2; altfel, returnează

0. ARG1 = ARG2 Returnază 1 dacă ARG1 este egal cu ARG2; altfel, returnează 0. ARG1 != ARG2 Returnază 1 dacă ARG1 este diferit de ARG2; altfel, returnează 0. ARG1 >= ARG2 Returnază 1 dacă ARG1 este mai mare sau egal cu ARG2; altfel,

returnează 0. ARG1 > ARG2 Returnază 1 dacă ARG1 este mai mare decât ARG2; altfel, returnează 0. ARG1 + ARG2 Returnază suma aritmetică ale lui ARG1 şi ARG2. ARG1 - ARG2 Returnază diferenŃa aritmetică ale lui ARG1 şi ARG2. ARG1 * ARG2 Returnază produsul aritmetic ale lui ARG1 şi ARG2. ARG1 / ARG2 Returnază câtul împărŃirii întregi dintre ARG1 şi ARG2. ARG1 % ARG2 Returnază restul împărŃirii întregi dintre ARG1 şi ARG2. SIR:REGEXP Returnază şablonul de potrivire al expresiei regulate REGEXP în şirul

SIR (dacă aceasta există). match SIR REGEXP

Returnază şablonul de potrivire al expresiei regulate REGEXP în şirul SIR (dacă aceasta există).

substr SIR POZ lung

Returnază subşirul de lungime lung, care începe de pe poziŃia POZ (întreg, mai mare sau egal cu 1).

index SIR CHAR

Returnază pozitia din SIR unde CAR este găsit; altfel, returnează 0.

length SIR Returnază lungimea şirului SIR + SIMBOL Interpretază SIMBOL ca un şir, chiar dacă este o tastă. (EXPRESIE) Returnază rezultatul evaluării EXPRESIE.

Tabelul 3.1.1. Operatori matematici şi pentru şiruri de caractere

Page 14: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

85

Rezultatul evaluării unei expresii, este scris în fişierul standard de ieşire. Dacă expresia este validă, codul de retur al comenzii este 0, dacă valoarea expresiei este nenulă, respectiv 1 pentru expresie nulă. Când expresia nu e validă, codul de retur este 2.

Exemplu. $cat ScriptExpr1 rez=`expr $2 / $1` echo “Rezultatul impartirii lui $1 la $2 este: $rez” $ Pentru a-l putea lansa în execuŃie, tastăm: $chmod u+x ScriptExpr1 Pentru a-l lansa în execuŃie din directorul curent, tastăm: $./ScriptExpr1 20 10 Se va afişa: Rezultatul imapartirii lui 20 la 10 este: 2 Prima linie a scriptului se poate înlocui cu: rez=Ş[ expr $2 / $1 ]

Observăm că textul care este argument al comenzii echo este plasat între ghilimele, pentru a se interpreta caracterul Ş.

Evaluarea expresiilor care utilizează operanzi în virgulă mobilă se face cu ajutorul comenzii bc ( bash calculator). bc recunoaşte numere (atât intregi cât şi în virgulă mobilă), variabile (simple şi vectori), expresii, funcŃii etc. Ieşirea din comanda bc se face cu quit. După tastarea numelui comenzii, apare un mesaj de prezentare; pentru a nu se mai afişa acest mesaj se foloseşte opŃiunea –q. Setarea numărului de zecimale afişate după punctual zecimal se face cu comanda scale.

Exemplu. Efectuarea unor calcule aritmetice simple. $bc -q 11 * 6.5 61.5 9.15 * (3 + 7) 91.5 quit

Exemplu. Fixarea numărului de zecimale afişate. $bc -q 4.75 / 6 0 scale=4 4.75 / 6 .7916 quit

Exemplu. Utilizarea de variabile în cadrul bc. bc -q v1=20 v1 * 5 100 v2 = $v1 / 5 print v2 20 quit

Page 15: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

86

Exemplu. Utilizarea de variabile în cadrul bc. bc -q v1=20 v1 * 5 100 v2 = v1 / 5 print v2 20 quit

Comanda bc se poate utilize în cadrul unui script. În acest caz se foloseşte o construcŃie de forma:

Nume_var= `echo "optiuni; expresie" | bc` Partea de opŃiuni permite setarea variabilelor; dacă sunt mai multe setări acestea sunt separate cu ;.

Exemplu. Utilizarea bc în cadrul unui script. $cat >ExBc var1=`echo " scale=3; Ş1 / 10" | bc` echo “Rezultatul este $var1” După ce setăm dreptul de execuŃie şi tastăm: $./ExBc 9.99 Se va afişa: Rezultatul este .999

Să ne reamintim... Evaluarea expresiilor aritmetice şi a celor cu şiruri de caractere se realizează cu comanda expr, urmată de expresia care urmează să fie evaluată. AcelaŃi lucru se poate face, plasând expresia respectivă între [ ] şi acestă construcŃie trebuie precedată de caracterul $. Evaluarea expresiilor care utilizează operanzi în virgulă mobilă se face cu ajutorul comenzii bc ( bash calculator). bc recunoaşte numere (atât intregi cât şi în virgulă mobilă), variabile (simple şi vectori), expresii, funcŃii etc. Linux recunoaşte următoarele condiŃii elementare: comparaŃii numerice, teste asupra şirurilor de caractere, teste asupra fişierelor.

1. ScrieŃi unscript care să determine restul împărŃirii a două numere întregi. 2. ÎnlocuiŃi caracterul ? cu valoarea corespunzătoare. $bc -q 11.75 / 11 ? scale=3 11.75 / 11 ? quit

Page 16: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

87

M3.U1.11. Test de evaluare a cunoştinŃelor. MarcaŃi varianta corectă. 1. Între ce caractere trebuie pus un text, pentru a se dezautoriza toate caracterele speciale din text cu excepŃia $, ` şi \: a) ^^ c) ””

b) ’’ d) {} 2. Ce simbol trebuie pus înaintea unui caracter pentru a-l dezautoriza: a) \ c) # b) & d) \

3. Care specificaŃie ${var+sir} schimbă valoarea variabilei var în sir şi dacă variabila nu există, atunci ea va rămâne nedefinită: a) ${var+sir} c) ${var?sir} b) ${var-sir} d) ${var=sir}

4. Ieşirea standard produsă de o comandă poate fi substituită în locul în care apare comanda respectivă, daca acea comandă este încadrată între: a) acolade c) paranteze drepte b) accente inverse d) paranteze rotunde

5. Ce variabilă conŃine numărul de argumente din linia de comanda: a) $ c) # b) & d) ^ 6.Pentru a se afişa toate componentele unui vector, în poziŃia indicelui trebuie specificat caracterul: a) # c) $ b) & d) *

7. Ce caractere trebuie să se afle la începutul primei linii a unui script, dacă se utilizează alt shell decât Bash: a) #! c) $! b) &! d) *!

8. Pentru a controla scvenŃial două comenzi, astfel încât a doua se execută numai dacă execuŃia primei s-a terminat cu succes , se utilizează specificaŃia: a) || c) $$

b) && d) ## 9. Pentru a controla scvenŃial două comenzi, astfel încât a doua se execută numai dacă execuŃia primei s-a terminat cu eşec , se utilizează specificaŃia: a) || c) $$

b) && d) ## 10. Mai multe comenzi pot fi lansate simultan în execuŃie, în procese separate prin: a) scriere pe aceeaşi linie separate de ;

c) legare în pipe

b) scriere pe aceeaşi linie separate de ,

d) legare în fişier

11. O succesiune de comenzi separate prin ; contează sintactic ca o singură comandă şi afectează mediul exterior, dacă sunt incluse în interiorul: a) {} c) ## b) () d) ^^

Page 17: Modulul 3. Scripturi sub Linux - horatiuvlad.com · Sub Linux, fişierele de comenzi se numesc scripturi; un script este o combinaŃie de comenzi deja existente şi instrucŃiuni

88

M3.U1.12. Rezumat Această unitate de învăŃare, prezintă concepte care vor fi utilizate în realizarea scripturilor. În diverse specificaŃii, unele caractere au semnificaŃie specială pentru interpretorul shell. Dezautorizarea unui caracter, înseamnă că el va fi interpretat într-un anumit text ca un simbol obişnuit, fără a mai avea o altă semnificaŃie.

Sub Linux, variabilele păstrează informaŃii necesare stabilirii mediului de execuŃie al comenzilor. Valorile lor sunt şiruri de caractere şi sunt iniŃializate prin comenzi de atribuire. Pentru ca iniŃializarea unei variabile să rămână valabilă pe întreaga durată a unei sesiuni de lucru a unui utilizator ea trebuie exportată.

Există variabile definite de utilizator în scripturile scrise de acesta şi variabile predefinite, care pot fi utilizate în toate scripturile sau în toate comenzile. Valorile acestor variabile sunt stabilite de sistem la intrarea în sesiune, dar pot fi modificate de utilizator pe parcurs. Variabilele de mediu se mai pot clasifica în variabile globale şi variabile locale. Variabilele locale sunt vizibile numai în cadrul comenzii sau scriptului în care au fost create. Variabilele globale sunt vizible în cadrul altor entităŃi legate de un proces sau un script, cum ar fi o funcŃie din cadrul unui script sau un fiu al unui proces, noŃiuni pe care le vom discuta mai târziu. Variabilele de mediu conŃin parametri ai unei sesiuni de lucru. ConŃinutul lor poate fi accesat în cadrul comenzilor şi valorile acestora pot fi modificate, în funcŃie de necesităŃile utilizatorului.

Un vector se declară şi se iniŃializează specificând elementele sale între două paranteze rotunde, separate prin caracterul spaŃiu. ReferinŃa la un element al vectorului se face specificând numele vectorului şi indicele între paranteze drepte.

Un script se scrie ca orice fişier text; după salvare, numele poate fi folosit ca orice altă comandă Linux pentru a fi lansat în execuŃie. Orice script poate fi parametrizat prin parametri formali, care se substituie cu argumente date în linia de comandă.

Ieşirea standard produsă de o comandă poate fi substituită în locul în care apare comanda respectivă, daca acea comandă este încadrată între accente inverse sau este inclusă între acolade care sunt precedate de semnul $.Unei anumite comenzi, lansată eventual cu un număr mare de opŃiuni sau parametri, putem să-i asociem un identificator (alias). Prin tastarea acestuia în linia de comandă, se obŃine acelaşi efect ca şi când am lansa comanda respectivă.