Sunteți pe pagina 1din 13

Sisteme de Operare Laborator nr.

3
Laborator nr. 3
Interpretoare de comenzi - Bourne Shell (bash). Scripturi
1. Shell-ul ca limbaj de programare
Interpretorul de comenzi Shell permite utilizatorului realizarea unor programe
numite Shell Scripts facilitind construirea unor secvente de comenzi ce sint executate in
mod identic cu programele compilate.
Shell-ul are si functia de limbaj de programare. Recunoaste toate notiunile de baza
specifice oricarui limbaj de programare cum ar fi! variabile instructiuni de atribuire
instructiuni de control "if, while, for, case# proceduri$functii parametri. %oate
aceste facilitati permit automatizarea unor actiuni pe care utilizatorul le desfasoara in mod
repetat. &xista posibiliatea de a scriere fisiere care sa contina comenzi fisiere care pot fi
executate la cerere de catre interpretorul de comenzi "in terminologia Linux$'nix un
asemenea fisier se numeste script#.
2. rearea !isierelor shell script
Scripturile shell sunt fisiere de comenzi Linux$'nix analog cu fisierele batch (.bat
din )OS. *pelul lor se face la fel ca pentru orice comanda Linux$'nix. Recuperarea in
script a argumentelor de apel se face cu ajutorul unor variabile speciale "care vor fi
parametrii formali in script# pe care le vom vedea mai jos.
In fisierele script se foloseste caracterul +#+ pentru a indica un comentariu ce este
valabil pina la sfirsitul acelei linii de text analog cu forma! $$comentariu din limbajul ,--.
Lansarea in executie a unui fisier de comenzi se poate face in mai multe moduri!
a# prin numele lui la fel ca orice comanda "posibil numai in cazul in care fisierul a
fost facut executabil setindu-i dreptul de executie i.e. atributul x cu comanda chmod#!
$ nume_fisier_comenzi [parametri]
b# prin comanda . a interpretorului de comenzi!
$ . nume_fisier_comenzi [parametri]
c# apeland un anumit shell de exemplu!
$ bash nume_fisier_comenzi [parametri]
&xista unele diferente semnificative intre aceste forme de apel dupa cum vom
vedea mai tirziu "la modul de executie a proceselor#.
)atorita existentei mai multor interpretoare de comenzi este necesar un mecanism
prin care sistemul sa poata fi informat asupra interpretorului de comenzi pentru care a fost
scris un numit fisier de comenzi in caz contrar acesta riscind sa nu poata fi executat.
.rintr-o conventie respectata de mai multe variante 'nix "inclusiv de Linux# prima linie a
fisierului de comenzi poate contine numele interpretorului caruia ii este destinat in forma!
#!nume_interpretor_comenzi
"#emple$
#!/bin/bash
#!/bin/sh
#!/bin/csh
#!/bin/perl
Se observa ca trebuie precizata si calea absoluta pentru interpretorul de comenzi
cu care se doreste a fi executat acel script. *cest mecanism este folosit si de fisierele care
sint scrise in limbaje mai puternice dar de acelasi tip "de exemplu /bin/perl#.
Observatie! apelul shell-ului specificat intr-un script in felul descris mai sus pentru a
executa acel script se face doar pentru prima forma de apel!
$ script [argumente]
Sisteme de Operare Laborator nr. 3
.entru a doua forma de apel!
$ . script [argumente]
scriptul va fi executat de fapt tot de shell-ul in care am dat aceasta comanda.
.entru a treia forma de apel!
$ shell script [argumente]
scriptul va fi executat de shell-ul specificat pe prima pozitie a aestui apel.
.entru ca noul script sa fie executabil se va folosi una din urmatoarele comenzi!
% chmod !! m"script
sau
% chmod a#$ m"script
"vezi comanda chmod#
'n shell script este invocat exact ca o comanda Linux obisnuita - prin tastarea
numelui ei.
3. %ariabile de shell
O alta facilitate comuna tuturor interpretoarelor de comenzi Linux$'nix este
utilizarea de variabile. .entru a creste flexibilitatea sistemului este posibila definirea citirea
si modificarea de variabile de catre utilizator. %rebuie retinut ca variabilele sunt numai de
tip sir de caractere "exceptie facind partial interpretorul csh#.
Instructiunea de atribuire are forma!
$ %ar&e$pr
unde %ar este un nume "identificator# de variabila iar e$pr este o expresie care
trebuie sa se evalueze la un sir de caractere.
/ariabilele sunt pastrate intr-o zona de memorie a procesului shell respectiv sub
forma de perechi nume0valoare. .entru a vedea ce variabile sunt definite puteti folosi
comanda!
$ set
care va afisa lista acestor perechi.
,omanda!
$ %ar&
sau
$ unset %ar
are ca efect nedefinirea variabilei var "adica acea variabila este stearsa din memorie si
orice referire ulterioara la ea va cauza afisarea unui mesaj de eroare.
Referirea la valoarea unei variabile "i.e. atunci cind avem nevoie de valoarea
variabilei intr-o expresie# se face prin numele ei precedat de simbolul $ ceea ce cauzeaza
substitutia numelui variabilei prin valoarea ei in expresia in care apare!
$ echo $%ar
&fect! se va afisa valoarea variabilei %ar.
$ echo %ar
&fect! se va afisa sirul de caractere +%ar+.
,iteva exemple!
$ %& a'()b
&fect! operatia de atribuire a unei valori variabilei %1 spatiile nu se iau in
considerare.
$ cat $"$%
&fect! este echivalent cu! $ cat $"a'()b
$ %& zz$%
&fect! variabila % este modificata1 se observa ca are loc o operatie de concatenare.
$ %&
&fect! variabila % primeste valoarea nula "este distrusa#.
Sisteme de Operare Laborator nr. 3
$ %&*wc +l fis*
&fect! variabila % primeste drept valoare iesirea standard a comenzii specificate
intre caracterele 2...2 .
*lte exemple pentru modul de actiune al caracterelor 2...2 !
$ dir+curent & *pwd*
&fect! variabila dir+curent va primi ca valoare iesirea standard a comenzii pwd
care este tocmai numele directorului curent "specificat prin cale completa#.
$ a&',
$ a&*e$pr $a # !*
$ echo $a
&fect! se va afisa 34.
Obs! e$pr este o comanda care evalueaza expresii aritmetice si stringuri "vezi
detalii in help adica cu! $ man e$pr #.
.entru substitutia variabilelor prin numele lor se folosesc caracterele -. pentru a
indica numele variabilei atunci cind acesta nu este urmat de spatiu si anume daca este de
forma!
$-%ar.sir
&fectul! se va substitui variabila cu numele %ar si nu cea cu numele %arsir "cum
s-ar fi intimplat daca nu foloseam caracterele -.#.
$ rad&/home/
$ ls +l $-rad.so
&fect! se va lista continutul directorului /home/so
*lte forme de substitutie!
$-%ar/+sir. = rezultatul expresiei este valoarea variabilei %ar daca aceata este
definita altfel este valoarea sir.
$-%ar/+. 0 rezultatul expresiei este valoarea variabilei %ar daca aceata este
definita altfel este afisat un mesaj standard de eroare care spune ca acea variabila este
nedefinita.
$-%ar/&sir. 0 rezultatul expresiei este valoarea variabilei %ar dupa ce eventual
acesteia i se asigneaza valoarea sir "asignarea are loc doar in cazul in care var era
nedefinita#.
$-%ar/0sir5 0 rezultatul expresiei este valoarea variabilei %ar daca aceata este
definita altfel este afisat mesajul sir "sau un mesaj standard de eroare daca sir
lipseste#.
$-%ar/#sir. 0 daca variabila %ar este definita "are o valoare# atunci i se
asigneaza valoarea sir altfel ramine in continuare fara valoare "deci asignarea are loc
doar in cazul in care %ar era deja definita#.
.e linga set mai sunt si alte comenzi pentru variabile!
$ e$port %ar [%ar( %ar) ...]
&fect! are loc +e#portul+ variabilelor in procesele fii ale acelui proces "in mod
obisnuit variabilele nu sunt vizibile in procesele fii ele fiind locale procesului shell
respectiv fiind pastrate in memoria acestuia#.
Sau!
$ e$port %ar&%aloare
&fect! asignare - export de variabila printr-o singura comanda.
$ read %ar [%ar( %ar) ...]
&fect! citeste de la stdin valori si le atribuie variabilelor specificate.
$ readonl" %ar [%ar( %ar) ...]
&fect! acele variabile sunt declarate ca fiind read-onl6 "i.e. nu mai pot fi modificate
dupa aceasta comanda ramin cu valoarea pe care o aveau cind s-a executat aceasta
comanda#.
Sisteme de Operare Laborator nr. 3
In terminologia Linux$'nix se folosesc termenii de &ariabila de shell si &ariabila
de mediu cu semnificatii diferite!
&ariabila de shell este o &ariabila accesibila doar procesului curent'
&ariabila de mediu este o &ariabila accesibila tuturor proceselor !ii ale acelui
proces shell "atunci cind este o &ariabila e#portata#.
&xista o serie de variabile ce sunt modificate dinamic de catre shell pentru a le
pastra semnificatia pe care o au si care pot fi folosite in scripturi in conformitate cu
semnificatia lor!
3# $, 0 numele procesului curent "numele scriptului in care este referita#
7# $'...$1 0 parametrii cu care a fost apelat procesul curent "i.e. parametrii din
linia de apel in cazul unui script#1
(bser&atie! un fisier de comenzi poate primi la lansarea in executie o serie de
parametri din linia de comanda. *cestia sint referiti in corpul fisierului prin denumirile
$',$(,...,$1.
Interpretorul de comenzi pune la dispozitia utilizatorului comanda interna shift
prin care se poate realiza o deplasare a valorilor parametrilor din linia de comanda!
vechea valoare a lui $( va fi referita prin $' vechea valoare a lui $) va fi referita prin $(
s.a.m.d. iar vechea valoare a lui $' se pierde.
,omanda shift este utila pentru cazurile cind avem mai mult de 8 parametri in
linia de comanda pentru a avea acces la toti acestia.
3# $2 0 lista parametrilor din linia de comanda "fara argumentul $,#1
9# $# 0 numarul acestor parametri1
4# $$ 0 pid-ul procesului curent "i.e. pid-ul shell-ului ce executa acel script#1
Observatie! variabila $$ poate fi folosita pentru a creea fisere temporare cu nume
unic de exemplu! fisierul cu numele /tmp/err$$.
:# $0 0 codul returnat de ultima comanda shell executata1
Observatie! la fel ca in )OS si in 'nix fiecare comanda returneaza un cod de retur
la terminarea ei care este ; in caz de succes sau este o valoare nenula "codul erorii# in
cazul unei erori.
<# $! 0 pid-ul ultimului proces executat in bac=ground1
># $+ 0 optiunile cu care a fost lansat procesul shell respectiv. *ceste optiuni pot fi!
a# +$ 0 afiseaza linia din script executata "istoric al ultimelor comenzi
executate#1
b# +% 0 modul verbose de executie "listeaza toate comenzile executate#1
*ceste optiuni se pot folosi cu comanda set!
a# set +% 1 script -? util pentru depanare! setez intii optiunea -v si apoi execut
scriptul specificat in modul verbose1
b) set +$ -? util pentru a vedea istoricul "ultimele comenzi executate#1
c# set +u -? verifica daca variabilele au fost initializate1
d# set +n -? anuleaza toate comenzile ce urmeaza dupa ea pina la sfirsitul
scriptului "aceasta comanda se foloseste in interiorul scriptului#1
e# set +i -? shell-ul devine interactiv "util pentru depanare#.
*lt exemplu pentru modul de actiune al caracterelor `...` ! recuperarea
rezultatului unei comenzi pe cimpuri in variabilele $',$(,...,$1 !
$ set `date` 3 echo $4 $( $) $5
&fect! prima comanda determina initializarea variabilelor $',$(,...,$1 cu
cimpurile rezultatului comenzii "observatie! cimpurile sunt subcuvintele din iesirea standard
a comenzii ce sunt separate prin spatii#. * doua comanda va afisa anul "cimpul :# luna
"cimpul 7# ziua "cimpul 3# si ora "cimpul 9# curente.
$ set a b c
Sisteme de Operare Laborator nr. 3
&fect! determina crearea si initializarea variabilelor $', $(, $) respectiv cu
valorile a, b, c.
/ariabilele speciale de tip $ sint!
$0name 0 ; daca numele nu este stabilit
0 3 daca numele este stabilit
$name['+)] 0 primele 3 elemente ale numelui de tip arra6
$name[(+] 0 toate elementele de la al doilea pina la ultimul din numele
respectiv
$name[2] 0 toate elementele numelui
$6 0 citeste linia 3 a intrarii de la terminal
%ariabile de tip arg&$
/ariabilele de tip arra6 argv primesc argumentele destinate scriptului. *cestea
permit un alt procedeu de referire a argumentelor similar cu $', $( etc.
$# arg% 0 numarul de elemente din argv
$arg%['] 0 primul element al variabilei de tip arra6 argv "$'#
$arg%[$#arg%] 0 ultima valoare a variabilei de tip arra6 argv
$arg%['+)] 0 primele trei argumente
)lte e#emple$
a# $ who 7 grep an(8so
&fect! se va interpreta caracterul & drept executie in bac=ground1
b# $ who 7 grep an(98so sau $ who 7 grep :an(8so+
&fect! se va interpreta caracterul 8 prin el insusi si nu ca fiind executie in
bac=ground1
c# $ who 7 grep :an($;<=>:
&fect! se va substitui variabila $;<=> cu valoarea sa1
d# $ who 7 grep ?an($;<=>?
&fect! nu se va substitui variabila $;<=> cu valoarea sa.
)e asemenea exista o serie de variabile de mediu predefinite "i.e. au anumite
semnificatii fixate aceleasi pentru toata lumea# si anume!
3# $>@AB 0 directorul de login al acelui utilizator1
7# $CDBE 0 username "numele de login# al acelui utilizator1
3# $F@GH<AB 0 la fel ca $CDBE1
9# $D>BFF 0 shell-ul implicit al acelui utilizator1
4# $A<IF 0 numele complet al fisierului de posta electronica al acelui utilizator "este
utilizat de shell pentru a ne anunta daca a fost primit un nou mesaj necitit inca adica acel
binecunoscut mesaj +Jou ha%e new mail in $A<IF+ 1
:# $;D' 0 sirul de caractere al prompterului principal asociat shell-ului1
<# $;D( 0 sirul de caractere al prompterului secundar asociat shell-ului "prompterul
secundar este folosit pentru liniile de continuare ale unei comenzi scrise pe mai multe linii#1
># $=BEA 0 specifica tipul de terminal utilizat "vt3;; vt3;7 s.a.#1
8# $;<=> 0 o lista de directoare in care shell-ul cauta fisierul corespunzator unei
comenzi tastate "specificata doar prin nume nu si prin cale absoluta sau relativa#1
3;# $KL;<=> 0 o lista de directoare in care shell-ul cauta directorul dat ca
parametru comenzii cd in cazul cind acesta a fost specificat doar prin nume nu si prin
cale "absoluta sau relativa#1 similar ca ;<=> pentru fisiere1
33# $IMD 0 specifica multimea caracterelor ce sunt interpretate ca spatiu.
@ai sunt si alte variabile de mediu "le puteti vedea pe toate utilizand comanda set
fara parametri#. *ceste variabile sunt initializate de catre shell la deschiderea unei sesiuni
de lucru cu valorile specificate in fisierele de initializare ale sistemului "de fapt sunt
Sisteme de Operare Laborator nr. 3
exportate dupa cum puteti constata citind aceste fisiere#.
In continuare vom prezenta aceste fisiere de initializare "de configurare# a
sistemului.
*. +isierele de con!igurare
Aiecare user isi poate scrie un script care sa fie executat la fiecare inceput de
sesiune de lucru "analogul fisierului autoe$ec.bat din )OS# script numit
$>@AB/.profile sau $>@AB/.bash_profile in cazul cind se utilizeaza bash ca
shell implicit "pentru alte shell-uri este denumit altfel#. In plus poate avea un script care sa
fie rulat atunci cind se deconecteaza de la sistem "adica la logout#1 acest script se
numeste $>@AB/.bash_logout in cazul shell-ului bash. )upa cum observati toate
aceste fisiere se gasesc in directorul home al acelui user.
@ai exista doua fisiere de initializare valabile pentru toti userii si anume fisierele
/etc/profile si /etc/en%ironment. La deschiderea unei noi sesiuni intii sunt
executate scripturile de sistem "din /etc/# si abia apoi cele particulare userului respectiv
"din $>@AB/#.
@ai exista niste fisiere de configurare si anume /etc/bashrc si $>@AB/.bashrc
"in cazul shell-ului bash# care sunt executate ori de cite ori este lansat un proces shell
interactiv "&xemplu! atunci cind de sub broBserul l"n$ apelati interpretorul de comenzi
printr-o anumita comanda Cmai exact cu tasta! +D+E sau dintr-un editor de texte etc.#
@ai exista un fisier numit $>@AB/.bash_histor" care pastreaza ultimele F
comenzi tastate "exista o variabila de mediu care specifica aceasta dimensiune F#. &le pot
fi vizualizate cu comanda!
$ histor"
,. Structuri de control pentru scripturi
Aiecare interpretor de comenzi furnizeaza o serie de structuri de control de nivel
inalt ceea ce confera fisierelor de comenzi o putere mult mai mare decit este posibil in
)OS. ,ele mai utilizate structuri de control ale interpretorului bash sint! for, while,
until, if, case. "(bser&atie! acestea sunt comenzi interne ale shell-ului bash.#
3# Gucla iterativa for are sintaxa!
for 6%arN [ in 6te$tN ]
do
6lista_comenziN
done
Semantica! 6te$tN descrie o lista de valori pe care le ia succesiv variabila
6%arN; pentru fiecare asemenea valoare a lui 6%arN, se executa comenzile din
6lista_comenziN.
Observatii!
a# Se poate folosi in corpul buclei for valoarea variabilei 6%arN1
b# %oate instructiunile exceptind do si done trebuie sa fie urmate de caracterul +3+
sau caracterul neBline1
c# )aca lipseste partea optionala +in 6te$tN+ atunci ca valori pentru 6%arN se
folosesc argumentele din $2 "i.e. parametrii din linia de comanda#.
"#emplu!
for i in *ls +t*
do
echo $i
done
sau!
for i in *ls +t* 3 do echo $i 3 done
&fect! acelasi cu comanda ls +t "se afiseaza continutul directorului curent sortat
Sisteme de Operare Laborator nr. 3
dupa data#.
7# Gucla repetitiva while are sintaxa!
while 6lista_comenzi_'N
do
6lista_comenzi_(N
done
Semantica! Se executa comenzile din 6lista_comenzi_'N si daca codul de retur
al ultimei comenzi din ea este ; "i.e. terminare cu succes# atunci se executa
comenzile din 6lista_comenzi_(N si se reia bucla. *ltfel se termina executia
buclei Bhile.
Observatii!
a# )eci bucla while se executa iterativ atit timp cit codul returnat de
6lista_comenzi_'N este ; "succes#1
b# *deseori 6lista_comenzi_'N poate fi comanda!
test 6argumenteN
sau echivalent!
[ 6argumenteN ]
care este o comanda ce exprima testarea unei conditii dupa cum vom vedea mai
jos.
"#emplu!
while true
do
date3
sleep 4,3
done
&fect! se afiseaza incontinuu pe ecran din minut in minut data si ora curenta.
3# Gucla repetitiva until are sintaxa!
until 6lista_comenzi_'N
do
6lista_comenzi_(N
done
Semantica! Se executa comenzile din 6lista_comenzi_'N si daca codul de retur
al ultimei comenzi din ea este diferit de ; "i.e. terminare cu eroare# atunci se
executa comenzile din 6lista_comenzi_(N si se reia bucla. *ltfel se termina
executia buclei until.
Observatii!
a# )eci bucla until se executa iterativ atit timp cit codul returnat de
6lista_comenzi_'N este diferit de ; "eroare# sau cu alte cuvinte bucla until se
executa iterativ pina cind codul returnat de 6lista_comenzi_'N este ; "succes#1
b# *deseori 6lista_comenzi_'N poate fi comanda de testare a unei conditii.
9# Structura alternativa if are sintaxa!
if 6lista_comenzi_'N
then
6lista_comenzi_(N
[ else
6lista_comenzi_)N ]
fi
Semantica! Se executa comenzile din 6lista_comenzi_'N si daca codul de retur
Sisteme de Operare Laborator nr. 3
al ultimei comenzi din ea este ; "i.e. terminare cu succes# atunci se executa
comenzile din 6lista_comenzi_(N, iar altfel "i.e. codul de retur este diferit de ;#
se executa comenzile din 6lista_comenzi_)N.
Observatii!
a# *deseori 6lista_comenzi_'? poate fi comanda de testare a unei conditii1
b# Ramura else este optionala1
c# Structura if are si o forma sintactica imbricata!
if 6lista_comenzi_'N
then
6lista_comenzi_(N
elif 6lista_comenzi_)N
then
6lista_comenzi_5N
elif 6lista_comenzi_!N
.....
else
6lista_comenzi_HN
fi
4# Structura alternativa case are sintaxa!
case 6e$prN in
6sir_%alori_'N O 6lista_comenzi_'N 33
6sir_%alori_(N O 6lista_comenzi_(N 33
.....
6sir_%alori_H+'N O 6lista_comenzi_H+'N 33
6sir_%alori_HN O 6lista_comenzi_HN
esac
Semantica! )aca valoarea 6e$prN se gaseste in lista de valori 6sir_%alori_'N
atunci se executa 6lista_comenzi_'N si apoi executia lui case se termina. *ltfel!
daca valoarea 6e$prN se gaseste in lista de valori 6sir_%alori_(N atunci se
executa 6lista_comenzi_(N si apoi executia lui case se termina. *ltfel! ...
s.a.m.d.
Observatii!
a# )eci se intra in prima lista de valori cu care se potriveste fara a se verifica
unicitatea "i.e. daca mai sunt si alte liste de valori cu care se potriveste#1
b# 'ltima linie dinainte de esac nu este obligatoriu sa se termine cu caracterele + 33+
1
c# Lista de valori 6sir_%alori_PN poate fi de forma!
6%al_'N 7 6%al_(N 7 ... 7 6%al_AN "deci o enumerare de valori#
sau poate fi o expresie regulata ca de exemplu!
case $opt in
+[a$+z] O 6comenziN 33
...
esac
care este echivalent cu!
case $opt in
+a7+$7+"7+z O 6comenziN 33
...
esac
"#emplu!
case $%ar' in
2.c O %ar(&*basename $%ar' .c* 3 gcc $%ar' +o$%ar( 33
...
esac
Sisteme de Operare Laborator nr. 3
echo Dource $%ar' was compiled into e$ecutable $%ar(.
&fect! daca variabila var3 are ca valoare +fisier.c+ "i.e. numele unui fisier sursa#
atunci variabila %ar( va avea ca valoare +fisier+ si apoi fisierul sursa $%ar' este
compilat obtinindu-se un executabil cu numele $%ar(.
Observatie! comanda basename 6arg'N 6arg(N returneaza in iesirea standard
valoarea argumentului 6arg'N dupa ce se inlatura din el sufixul 6arg(N.
I-.(/0)10! aceste structuri de control fiind comenzi interne puteti folosi
comanda de help pentru comenzi interne!
$ help 6structuraN
pentru a afla mai multe detalii despre fiecare structura in parte.
2. )lte comenzi
,omanda de testare a unei conditii este comanda "predicatul# test avind forma!
test 6conditieN
sau!
[ 6conditieN ]
unde conditia 6conditieN poate fi!
a# o comparatie intre doua siruri de caractere "utilizind simbolurile +&&+ si +!&+
cunoscute din limbajul ,#!
$ test 6e$pr_'N && 6e$pr_(N
&fect! returneaza true "codul de retur ;# daca cele doua expresii au aceeasi
valoare altfel returneaza false "cod de retur nenul#1
$ test 6e$pr_'N !& 6e$pr_(N
&fect! returneaza true "codul de retur ;# daca cele doua expresii au valori diferite
altfel returneaza false "cod de retur nenul#1
b# conditii relationale!
$ test 6%al_'N +6relN 6%al_(N
&fect! returneaza true "codul de retur ;# daca valoarea 6%al_'N este in relatia
6relN cu valoarea 6%al_(N unde 6relN este unul dintre operatorii relationali urmatori!
- eQ 0 eHual "egal! 0#
- gt 0 greater-than "mai mare decit! ?#
- ge 0 greater-eHual "mai mare sau egal cu! ?0#
- lt 0 less-than "mai mic decit! I#
- le 0 less-eHual "mai mic sau egal cu! I0#
c# una din urmatoarele conditii!
$ test +e 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca exista un fisier de orice fel "obisnuit
director special etc.# avind numele InumeJfisier?1
$ test +d 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca 6nume_fisierN este un director1
$ test +f 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca 6nume_fisierN este un fisier
obisnuit1
$ test +p 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca 6nume_fisierN este un fisier de tip
pipe1
$ test +b 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca 6nume_fisierN este un fisier de tip
dispozitiv in mod bloc1
$ test +c 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca 6nume_fisierN este un fisier de tip
dispozitiv in mod caracter1
Sisteme de Operare Laborator nr. 3
$ test +s 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca fisierul 6nume_fisierN este nevid
"i.e. are lungimea mai mare decit ;#1
$ test +r 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca fisierul 6nume_fisierN poate fi citit
"i.e. are setat atributul r#1
$ test +w 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca fisierul 6nume_fisierN poate fi
modificat "i.e. are setat atributul B#1
$ test +$ 6nume_fisierN
&fect! returneaza true "codul de retur ;# daca fisierul 6nume_fisierN poate fi
lansat in executie "i.e. are setat atributul x#1
d# o expresie logica! negatie conjunctie disjunctie!
$ test !6conditie_'N
&fect! FO% ! negatia conditiei 6conditie_'N1
$ test 6conditie_'N +a 6conditie_(N
&fect! *F) ! conjunctia conditiilor 6conditie_'N si 6conditie_(N1
$ test 6conditie_'N +o 6conditie_(N
&fect! OR ! disjunctia conditiilor 6conditie_'N si 6conditie_(N1 unde
6conditie_'N si 6conditie_(N sunt conditii de una din formele a# b# c# sau d#.
"#emplu!
#!/bin/bash
for i in 2
do
if test +f $i
then
echo $i
fi
done
&fect! acest script listeaza fisierele obisnuite din directorul curent.
Observatie! caracterul ( joaca un rol special! in evaluare caracterul ( se inlocuieste
cu numele oricarui fisier din directorul curent "exceptindu-le pe cele al caror nume incepe
cu caracterul +.+#. .entru ca ( sa nu se evalueze in acest fel ci sa se evalueze prin el
insusi trebuie sa se utilizeze apostroafele! K(K 1 am vazut si mai sus un exemplu "si anume!
who 7 grep ?an($;<=>? # in care apostroafele determina evaluarea caracterelor
speciale prin ele insele.
*lte comenzi "instructiuni# ce pot apare in scripturi!
3# comanda breaR cu sintaxa!
breaR [n]
unde n este 3 in caz ca lipseste.
&fect! se iese din n bucle do-done imbricate executia continuind cu urmatoarea
instructiune de dupa done.
7# comanda continue cu sintaxa!
continue [n]
unde n este 3 in caz ca lipseste.
&fect! pentru n&' se reincepe bucla curenta do-done "de la pasul de reinitializare#
respectiv pentru nN' efectul este ca si cum se executa de n ori comanda continue 3.
3# comanda e$it cu sintaxa!
e$it cod
&fect! se termina "se opreste# executia scriptului in care apare si se intoarce drept
cod de retur valoarea specificata.
9# comanda e$ec cu sintaxa!
Sisteme de Operare Laborator nr. 3
e$ec 6lista_comenziN
&fect! se executa comenzile specificate fara a se creea o noua instanta de shell
"astfel shell-ul ce executa aceasta comanda se va reacoperi cu procesul asociat comenzii
deci nu este reentrant#.
4# comanda wait cu sintaxa!
wait pid
&fect! se intrerupe executia scriptului curent asteptindu-se terminarea procesului cu
pid-ul specificat.
:# comanda e%al cu sintaxa!
e%al parametri
&fect! se evalueaza parametrii specificati.
<# comanda e$port cu sintaxa!
e$port %ariabile
&fect! se exporta variabilele specificate.
># comanda trap cu sintaxa!
trap 6comandaN 6e%enimentN
&fect! cind se va produce evenimentul specificat "i.e. se va primi semnalul
respectiv# se va executa comanda specificata.
&venimente "semnale#!
- semnalul 3 0 hang-up signal1
- semnalul 7 0 interrupt signal "semnal generat prin apasarea tastelor L,#1
- semnalul 3 0 Huit signal "semnal generat prin apasarea tastelor L)#1
- semnalul 8 0 =ill signal "semnal ce +omoara+ procesul#1
- semnalul 34 0 semnal de terminare normala a unui proces1
- etc.
@ai multe detalii vom vedea in lectia despre semnale 'nix.
"#emplu!
trap ?rm /tmp/ps$$ 3 e$it? (
&fect! cind se va primi semnalul 7 se va sterge fisierul temporar /tmp/ps$$ si apoi
se va termina executia scriptului respectiv.
3. "#ecutie conditionala
&xista doua posibilitati de a conditiona executia unei comenzi de rezultatul executiei
unei alte comenzi si anume!
a# prima forma este!
6comanda_'N 88 6comanda_(N
&fect! intii se executa comanda ' si apoi comanda ( se va executa doar daca
executia comenzii ' intoarce codul de retur ; "succes#.
b# a doua forma este!
6comanda_'N 77 6comanda_(N
&fect! intii se executa comanda ' si apoi comanda ( se va executa doar daca
executia comenzii ' intoarce un cod de retur nenul "eroare#.
Sisteme de Operare Laborator nr. 3
4. .robleme propuse pentru rezol&are$
4.1. Scrieti un script care sa va ajute la scrierea programelor in , care sa
automatizeze ciclul! modificare-sursa -? compilare -? testare"executie#. Scriptul trebuie se
afiseze un meniu cu o serie de optiuni pentru utilizator. .entru fiecare optiune trebuie
scrisa o functie " functiile sunt scrise intr-un fisier separat#.
Optiuni meniu!
a# sa lanseze editorul de texte pentru fisierul fisier.c specificat ca parametru
sau cerut de la linia de comanda1
b# sa lanseze compilatorul "fisierul executabil sa aiba numele fisier deci fara
sufixul .c#1 daca sunt erori de compilare "lucru observabil prin erorile de compilare afisate
de compilator# sau Barning-uri si sa le salveze intr-un fisier "fisier.err#1 fisierul de erori
si executabilul se sterg la fiecare compilare1
c# sa afiseze continutul fisierului fisier.err daca sunt erori "exista fisierul si are
dimensiunea ? ;#1
d# sa lanseze in executie programul " afisare mesaj de eroare daca nu exista
executabilul#1
e# iesire din script.
4.2. Sa se scrie un script care modifica caracterele dintr-un fisier "numele fisierelor
sursa si destinatie sunt parametri in linia de comanda# transformand caracterele litere mici
in litere mari " se foloseste comanda tr#.
&xemplu de rulare!
./script fisier' fiser(
4.3. %estati ce se intimpla cind aveti in directorul home ambele fisiere .profile si
.bash_profile ! cum sunt executate "in ce ordine sau care dintre ele#M ,e se intimpla
daca aveti doar .profile nu si .bash_profile sau invers M
Indicatii$
.entru a testa modul de executie a fisierelor de initializare folositi comenzi de
afisare pe ecran a unor mesaje. )e exemplu adaugati in fiecare fisier la sfirsit cite o linie
de forma!
echo :B$ecuting file .profile:
respectiv
echo :B$ecuting file .bash_profile:
")aca vreunul dintre fisiere nu exista acesta trebuie creat.#
*poi deschideti o noua sesiune de lucru si urmariti mesajele afisate pe ecran.
.entru a doua parte a exercitiului redenumiti altfel cite unul din cele doua fisiere si repetati
experimentul de mai sus.
5. Bibliogra!ie$
6 @endel ,ooper Advanced Bash-Scripting Guide
http///tldp.org/FL;/abs/abs+guide.pdf
http///tldp.org/FL;/abs/html/
6 @achtelt Narrels Bash Guide for Beginners 7;;>
http///tldp.org/FL;/Sash+Seginners+Guide/Sash+Seginners+Guide.pdf
http///tldp.org/FL;/Sash+Seginners+Guide/html/
6 @ihai Gudiu - &lemente de programare On Shell-ul 'nix
http///www.cs.cmu.edu/Tmihaib/articles/shell+(/shell+(+html.html
6 Nareth *nderson GNU/Linux Command-Line Tools Summar 7;;:
http///tldp.org/FL;/GHC+Finu$+=ools+Dummar"/GHC+Finu$+=ools+
Dummar".pdf
http///www.tldp.org/FL;/GHC+Finu$+=ools+Dummar"/html/
6 http///en.wiRipedia.org/wiRi/Bn%ironment_%ariable
6 G*SP AreHuentl6-*s=ed Questions
Sisteme de Operare Laborator nr. 3
http///www.faQs.org/faQs/uni$+faQ/shell/bash/
6 Rilliam &. Shotts Sr. Rriting shell scripts
http///linu$command.org/writing_shell_scripts.php

S-ar putea să vă placă și