d2i23ii
Interpretorul de comenzi al sistemului de operare Unix furnizeaza, pe langa posibilitatea
de executare a comenzilor, un set de instructiuni care permite scrierea de programe
asemanatoare celor scrise in limbaje de programare de nivel inalt. Fireste, posibilitatile
acestui limbaj sunt mult mai slabe decat cele ale unui limbaj ca C ori Pascal,
dar exista aplicatii in care efortul de programare este mult redus. Pe linga comenzile
"obisnuite", care apar in orice sistem de operare, Unix furnizeaza si
o multime de utilitare, mai ales pentru fisiere text. Limbajul Shell este puternic
si eficient pentru:
· Aplicatii a caror rezolvare implica mai multe operatii realizabile prin
comenzi Shell;
· Aplicatii care manipuleaza date sub forma fisierelor text sau a liniilor
de text;
· Aplicatii care cer consultarea directoarelor si parcurgerea sistemului
de fisiere;
Nu in ultimul rand, atunci cand facem operatii periodice care implica folosirea
comenzilor Shell, putem sa ne automatizam munca prin crearea unui fisier de
comenzi.
Vom numi fisier de comenzi orice secventa de comenzi memorata intr-un fisier
disc. Prin program Shell sau script vom intelege un fisier ce contine, pe linga
comenzi, structuri de control al executiei (instructiuni repetitive si de decizie)
si variabile. Acest capitol prezinta cele mai importante concepte in programarea
scripturilor sub Bourne Again Shell (BASH) , cel mai raspindit in sistemul Linux.
Pentru a programa sub alt shell, trebuie consultate documentatiile corespunzatoare,
pentru a vedea care sunt diferentele.
Obiectele ce compun un script sunt:
· Comenzi Linux;
· Variabile:
1. Variabile definite de utilizator;
2. Variabile predefinite (sistem);
3. Variabile speciale;
· Instructiuni de citire/scriere:
1. read pentru citirea datelor;
2. echo pentru afisarea datelor si mesajelor;
· Instructiuni de decizie:
1. if -instructiune de decizie simpla;
2. case-instructiunea de decizie multipla;
3. select-instructiune pentru crearea de meniuri simple;
· Instructiuni iterative:
1. for
2. while
3. until
· Instructiuni de salt:
1. break-iesire fortata dintr-un ciclu
2. continue-forteaza continuarea unui ciclu pentru urmatoarea valoare a contorului
Dupa cum ati observat, nu exista o instructiune de salt neconditionat (goto),
programele capatand astfel lizibilitate. Introducerea instructiunilor repetitive
permite scrierea de programe structurate, spre deosebire de "limbajul"
batch din sistemul de operare MSDOS.
Un script poate primi in linia de comanda argumente. De asemenea, se pot apela,
din interiorul unui script, alte scripturi.
Scripturile pot fi scrise cu ajutorul unui editor de texte ca vi, ed, emacs.
Apoi se stabileste dreptul de executie a fisierului, numele sau putand fi folosit
ca o comanda obisnuita. Shell-ul va executa fisierul comanda cu comanda.
Un exemplu de fisier de comenzi simplu este urmatorul: pwd ls -l finger
EXERCITIU: Ce efect are executarea acestui fisier de comenzi ?
5.2 Afisarea datelor. Comentarii
Introducerea de comentarii
De cele mai multe ori, la inceputul programului, trebuie sa precizam care este
efectul acestuia, pentru ca nu este intotdeauna evident acest lucru (s-ar putea
ca pe unii utilizatori sa nu-i intereseze cum lucreaza scriptul ci doar ce face
acesta). La inceputul programului trebuie precizat sub ce interpretor a fost
scris. De exemplu, comanda speciala #!/bin/sh indica faptul ca instructiunile
care urmeaza trebuie interpretate de Bourne Shell.
O linie de comentariu incepe intotdeauna cu semnul # si nu este interpretata
de shell.
Proceduri de citire/scriere
Afisarea informatiilor se face cu ajutorul comenzii echo a carei sintaxa este: echo aoptiunii aparametrii
Comada echo trimite parametrii pe canalul de iesire standard. Principalele caractere
speciale ale comenzii sunt:
Caracter special Efect
\a Alarma sonora
\n Salt la linie noua
\b Intoarcere
\t Marcheaza un paragraf (TAB)
\\ Afisarea unui backslash
Pentru a se tine cont de caracterele speciale ce apar in sirurile de caractere
date ca argumente, trebuie folosita optiunea -e, de exemplu: echo -e "Luni\nMarti", afiseaza:
Luni
Marti
Afisarea valorii unei variabile se realizeaza prin folosirea caracterului $
inaintea numelui variabilei. echo $s, afiseaza valoarea variabilei s.
5.3 Variabile
Variabile definite de utilizator
Numele variabilelor definite de utilizator trebuie sa respecte urmatoarele reguli:
· Un nume de variabila poate contine litere mari si mici, cifre si caracterul
"_";
· Un identificator nu poate incepe cu o cifra (evitati folosirea ca prim
caracter a caracterului "_");
· Lungimea identificatorului nu este, teoretic, limitata;
· Prin conventie, variabilele definite de utilizator se scriu cu litere
mici;
Declararea unei variabile se face implicit prin atribuirea unei valori (ca in
BASIC).
x=Miercuri este o operatie de atribuire, in urma careia variabila x este declarata
ca variabila sir de caractere si primeste valoarea "Miercuri". Nu
lasati spatii inainte sau dupa semnul "=" !
O variabila poate contine caractere speciale sau spatiiin textul dat ca valoare,
caz in care se folosesc ghilimelele:
Comenzile: s="Azi e luni si\nincepe semestrul" echo -e $s
afiseaza:
azi e luni si incepe semestrul
Exista posibilitatea de a proteja o variabila la eventuale modificari accidentale,
folosind comanda readonly (variabila). Dupa aceasta comanda, incercarea de a
modifica valoarea variabilei determina aparitia unui mesaj de eroare.
In cazul in care nu mai stim numele tuturor variabilelor folosite, putem obtine
lista variabilelor, inclusiv valoarea actuala, prin comanda set. Aceasta lista
contine nu numai variabilele definite de utilizator ci si variabilele sistem.
Variabilele pot fi exportate in alte shell-uri, prin comanda export (var)....
Un script ce contine comenzile #!/bin/sh si export a b c, va exporta variabilele
a,b,c in Bourne Shell. Shell-ul care importa variabile poate sa le modifice
valoarea, dar modificarile nu sunt transmise si in shell-ul care le-a exportat.
Exemplu:
Presupunem ca s-au definit variabilele: a="Decat mult si fara rost" b="putin" c="prost" si s-a creat urmatorul script, in fisierul deviza:
#!/bin/sh echo -e "$a mai bine $b si $c !\n" a="Ce mai faci ?\n" echo -e $a
Daca se dau comenzile:
hasdeuI$ export a b c hasdeuI$ deviza hasdeuI$ echo $a
se va afisa :
Decat mult si fara rost mai bine putin si prost !
Ce mai faci ?
Decat mult si fara rost
Putem defini explicit variabile de tipul intreg prin comanda declare -i (var),
incecarile ulterioare de a da variabilei o valoare sir de caractere determinand
obtinerea valorii 0 pentru acea variabila.
Operatorii disponibili sunt:
· +, -, *, / -adunare, scadere, inmultire, impartire
· % -modulo aritmetic
· <, >, <=, >= -operatori relationali
· == si != pentru egal, respectiv diferit
· && si || pentru si, respectiv sau logic
· &, |, ^ -comparare bit cu bit (si, sau, respectiv sau exclusiv)
Exemplu: declare -i n1 declare -i n2 n1=8 n2=6 n1=n1+n2 #sau let n1=n1+n2 n2=n2%2 echo $n1 $n2
Se poate folosi comanda let pentru a realiza mai rapid operatiile.
Variabile sistem
Foarte multe utilitare lucreaza cu variabile a caror valoare este predefinita
si care sunt la dispozitia tuturor utilizatorilor (le vom numi variabile sistem).
De obicei, variabilele sistem sunt scrise cu litere mari, pentru a le deosebi
de variabilele definite de utilizator. Modificarea valorii unei variabile sistem
poate crea neplaceri, deoarece utilitarele care folosesc valoarea variabilei
vor lucra defectuos !!!
Dintre variabilele sistem prezentam urmatoarele:
VARIABILE SEMNIFICATIE
HOME Contine calea de acces absolut spre directorul personal
PATH Contine caile in care shell cauta programele, de regula/usr/bin si /bin
PS1 Defineste prompterul asociat interpretorului, implicit $
PS2 Defineste al doilea prompter, implicit >, atunci cando comanda se continua
pe alta linie
PS3 Variabila utilizata de comanda select, pentru aspecifica un prompter care
sa apara inaintea fiecarei intrari in meniul creat de utilizator
OLDPWD Conserva calea de acces in directorul precedent
PWD Memoreaza calea catre directorul curent
RANDOM Contine, la fiecare acces, un numar aleator intre 0 si 32767
De exemplu, pentru a schimba prompterul implicit, se foloseste variabila PS1,
careia ii dam valoarea PS1="da comanda, omule $"
Variabile speciale (predefinite)
O categorie aparte de variabile sistem sunt cele predefinite, numite si variabile
speciale. Ele sunt variabile readonly, initializate si actualizate doar de interpretor.
Variabilele speciale sunt date in urmatorul tabel:
VARIABILE SEMNIFICATIE
$? Contine codul de revenire a ultimei comenzi executate
$$ Identificatorul de proces al shell-ului activ
$! Identificatorul (pid) ultimului proces lansat in paralel
$# numarul de argumente pozitionale pentru shell
Valori returnate
Este foarte important a se putea determina daca o comanda a fost executata cu
succes sau nu. Fiecare comanda returneaza o valoare (exit status) memorata in
variabila $?. Daca valoarea este 0 inseamna ca a aparut o eroare in cursul executiei
ultimei comenzi si este nenula in caz contrar. Testul executiei cu succes se
poate face cu ajutorul comenzii test, ce va fi prezentata ulterior.
Parametri de pozitie
Pentru a putea furniza si argumente in linia de comanda a unui script, se folosesc
parametri de pozitie, prin care sunt disponibile valorile acestora. Parametri
de pozitie sunt notati cu $1, $2,..., $9. $0 contine numele scriptului, $1 contine
primul parametru, $2 contine al doilea parametru e.t.c
Variabila speciala $# va contine numarul parametrilor de pe linia de comanda,
fiind utila pentru testarea existentei tuturor argumentelor necesare scriptului
respectiv. Exista posibilitatea folosirii a mai mult de noua parametri in linia
de comanda, insa nu vom detalia aici acest lucru (nici nu cred ca veti avea
nevoie de aceasta facilitate).
5.4 Citirea datelor. Comanda read
Pentru a avea un contact direct cu utilizatorul, in afara folosirii parametrilor
de pozitie, exista pozibilitatea de a se introduce date prin intermediul comenzii
read.Datele citite sunt transmise pe canalul de intrare standard si memorate
in variabilele pasate ca parametrii din comanda read. Sintaxa este urmatoarea: read (variabila)...
La intalnirea unei comenzi read, shell-ul asteapta introducerea datelor si validarea
lor prin apasarea tastei ENTER. Shell-ul imparte linia de intrare in cuvinte,
afectand primul cuvant primei variabile, al doilea celei de-a doua variabile...Ultimele
cuvinte sunt memorate in ultima variabila. Este de dorit ca orice comanda read
sa fie precedata de un echo, pentru a explica utilizatorului ce dorim sa introduca.
5.5 Verificarea unei conditii. Comanda test
Comanda test verifica indeplinirea unei conditii si intoarce o valoare care
sa marcheze acest lucru. Pentru a se cunoaste rezultatul testului, se foloseste
variabila $?. Aceasta are valoarea 0 daca testul este pozitiv (conditie adevarata)
si o valoare diferita de 0 in caz contrar.
Comanda test realizeaza urmatoarele teste:
· teste asupra fisierelor
· teste asupra sirurilor de caractere
· teste numerice
Teste asupra fisierelor
Testul asupra unui fisier consta in verificarea daca acesta verifica o conditie
specificata printr-o optiune. Sintaxa generala este urmatoarea:
test -optiune (fisier sau director)
Conditiile posibile sunt:
OPTIUNE SEMNIFICATIE
-e Fisierul exista (indiferent de tipul sau)
-f Fisier normal ?
-d Fisier director ?
-c Fisier special (periferic) de tip caracter ?
-b Fisier special de tip bloc ?
-p Fisier pipe ?
-r Drept de acces pentru citire ?
-w Drept de acces la scriere ?
-x Drept de executie ?
-s Fisier nevid ?
Comanda test poate fi combinata cu alte comenzi cu ajutorul operatorilor &&
si ||, formindu-se siruri de comenzi. Cea mai folosita combinatie este cea cu
comanda echo: test -x doom && echo "Aveti drept de executie !!!" stabileste daca exista drept de executie asupra fisierului doom si, in caz afirmativ,
afiseaza un mesaj.
Teste asupra sirurilor de caractere
Exista doua tipuri de teste asupra sirurilor de caractere: test pentru a controla
daca un sir de caractere este vid si test pentru a vedea daca doua siruri sunt
identice. Pentru primul tip de test avem doua optiuni: test -z "variabila" (testeaza daca variabila contine un sir vid) test -n "variabila" (testeaza daca variabila contine un sir nevid)
Variabilele se scriu intre ghilimele pentru a ne asigura ca nu vor aparea erori
de sintaxa din cauza sirurilor vide.
A doua forma ne permite sa verificam daca doua siruri sunt sau nu identice,
de exemplu: test "$a" = impozit verifica daca variabila $a are ca valoare sirul impozit. test "$f" != exit verifica daca variabila $f nu are valoarea exit
Aici nu este obligatorie folosirea ghilimelelor pentru sirurile de caractere.
Teste numerice
Pentru testele numerice, comanda test trebuie sa aiba trei parametri: test (valoare1) -optiune (valoare2) , unde valoare1 si valoare2 sunt termenii
care se compara, iar optiunea specifica relatia de ordine folosita.
OPTIUNE SEMNIFICATIE
-eq Egal
-ne Diferit
-lt Mai mic (less than)
-gt Mai mare (greater than)
-le Mai mic sau egal
-ge Mai mare sau egal
Exemplu: x=10 y=6 test "$x" -ge "$y" && echo "$x mai mare ca
$y"
Scriptul verifica daca valoarea variabilei x este mai mare sau egala cu valoarea
lui y si afiseaza mesajul corespunzator.
Daca unul dintre termeni nu este definit (variabila neinitializata), atunci
comanda test nu va functiona.
Exista posibilitatea de a combina mai multe teste prin folosirea unor optiuni
de combonare "logica":
OPTIUNE SEMNIFICATIE
! Negatia logica
-a Combinatie de teste prin SI logic
-o Combinatie de teste prin SAU logic
Exemple:
1) test ! -s "$f" returneaza valoarea 0 daca fisierul cu numele continut de variabila $f este
vid.
2) test -d "$f" -a -x "$f" returneaza 0 daca fisierul $f
este un director si avem drept de executie.
3) test -c "$1" -o -b "$1" && echo "Fisier
asociat unui periferic" returneaza 0 daca primul argument al liniei de comanda este un fisier special
de tip caracter sau bloc; in acest caz se afiseaza si mesajul corespunzator.
Este posibila folosirea parantezelor pentru a crea expresii complexe. Pentru
a putea folosi parantezele, acestea vor fi precedate de caracterul \, ca in
exemplul de mai jos: test \( -e "$1" \) -a \(-f "$1" -o -d "$1" \)
Exercitiu: Ce semnificatie are aceasta comanda ?
Forma restrinsa a comenzii test
Pentru a putea fi folosita mai usor in combinatie cu instructiunea if, comanda
test are si o forma simplificata, in care numele comenzii este inlocuit de parantezele
patrate a si i:
a -r lista i este echivalenta cu test -r lista
Efectul executiei formei simplificate este acelasi !
5.6 Instructiunea if
Marele avantaj al limbajului de programare shell consta in existenta structurilor
de control al executiei instructiunilor. Instructiunea if permite conditionarea
executiei unei comenzi de indeplinirea unei conditii logice.
Sintaxa instructiunii este urmatoarea: if (expresie logica) then
(comanda)...
aelse
(comanda)... i fi
unde:
(expresie logica)- comanda sau suita de comenzi cu rezultat logic
(comanda) - orice comanda acceptata de shell, inclusiv if
Instructiunea if functioneaza la fel ca instructiunile similare din limbajele
Pascal si C. Cuvintele if, then, else si fi sunt cuvinte cheie. Este obligatoriu
ca instructiunea if sa fie scrisa asa cum apare mai sus.
EXEMPLE: 1. Scriptul urmator: if grep "Georgescu" lista > /dev/null then echo "Numele a fost gasit in lista " else echo "Numele nu este in lista " fi cauta numele Georgescu in fisierul lista si afiseaza un mesaj in care se precizeaza
rezultatul cautarii. Dupa cum stiti (oare ?), comanda grep fara optiuni afiseaza
liniile care contin sablonul specificat. Prin redirectarea iesirii (>/dev/null),
se trimit liniile de text catre perifericul null (trimitere catre "nicaieri"),
pentru ca nu ne intereseaza liniile gasite, ci doar daca exista asemenea linii.
2. In exemplul urmator vom rescrie scriptul precedent, sablonul si fisierul
in care cautam fiind date ca argumente pe linia de comanda: if grep "$1" "$2" >/dev/null then echo "$1 apare in fisierul $2" else echo "$1 nu apare in fisierul $2" fi
3. Rescriem scriptul precedent, testand corectitudinea liniei de comanda (se
verifica daca numarul argumentelor din linia de comanda este corect). if a$# -lt 2i then echo "Prea putini parametri. Corect este: $0 sablon fisier" exit 1 fi if grep "$1" "$2" >/dev/null 2>&1 then echo "$1 apare in fisierul $2" else echo "$1 nu apare in fisierul $2" fi exit 0
OBSERVATII:
Pentru testarea numarului de parametri s-a folosit variabila speciala $#, care
memoreaza numarul de argumente din linia de comanda a ultimei comenzi. S-a folosit
comanda test in forma simplificata.
Comanda exit este folosita pentru terminarea fortata a executiei scriptului,
un parametru nenul al acesteia indicand ca scriptul s-a terminat cu eroare.
Daca numarul argumentelor este corect, scriptul va returna la terminare valoarea
0 (exit 0).
Am folosit expresia 2>&1 pentru a uni canalul de iesire si canalul de
eroare standard. Acest lucru este necesar pentru ca, in cazul aparitiei unei
erori, mesajul de eroare sa nu fie trimis pe canalul de eroare standard (ar
aparea pe ecran si nu dorim acest lucru) ci pe canalul de iesire (iesirea a
fost redirectata spre perifericul nul).
5.7 Instructiunea case
Pentru deciziile multiple a fost implementata instructiunea case, care are urmatoarea
sintaxa: case (valoare) in
(sablon_1) (comanda)...;;
(sablon_2) (comanda)...;;
... esac
unde:
(valoare) -"variabila" de selectie
(sablon_i)-criteriu de cautare (domeniu de valori)
(comanda) -orice comanda sau succesiune de comenzi acceptate de shell
FUNCTIONARE:
Daca (valoare) se incadreaza intr-unul din domeniile specificate, se executa
lista de comenzi corespunzatoare domeniului respectiv. Sunt permise folosirea
caracterelor speciale in compunerea sabloanelor.
EXEMPLU:
Urmatorul script:
case $LOGNAME in root) PS1="#";; lucian | danut) PS1="Buna prietene $LOGNAME $";;
*) PS1="Buna user obisnuit \h:\w\$ ";; esac export PS1 readonly PS1
poate fi introdus in fisierul /etc/profile pentru a stabili forma prompterului
pentru fiecare categorie de utilizatori. $LOGNAME contine numele ultimului utilizator
care s-a conectat la sistem. Utilizatorii lucian si danut au un prompter diferit
de cel al utilizatorilor obisnuiti (sunt, probabil, prieteni cu root-ul...).
EXERCITIU:Rescrieti scriptul de la instructiunea if, verificand parametrii din
linia de comanda cu instructiunea case.
5.8 Instructiunea for
Instructiunea for se foloseste atunci cand un grup de comenzi trebuie executat
de mai multe ori. Spre deosebire de instructiunea for din alte limbaje, in limbajul
shell nu se fixeaza o limita inferioara si una superioara pentru variabila contor,
aceasta luand valori dintr-o lista explicita de valori sau potivit unui anumit
criteriu de cautare (in FOXPRO se intalneste o astfel de forma a instructiunii
for). Sintaxa este: for (variabila) in (lista) do
(comanda)... done
Folosirea listelor explicite de valori
O lista explicita este specificata prin enumerarea valorilor sale. Variabila
contor va lua ca valoare, pe rand, fiecare valoare din lista: for fis in lista1 lista2 lista3 do cat $fis rm -i $fis done
Variabila $fis ia, pe rand, valorile lista1, lista2, lista3, reprezentand nume
de fisiere, afiseaza continutul fiecaruia, dupa care le sterge (cu confirmarea
stergerii).
Liste construite dupa un anumit criteriu
Listele pot fi construite cu ajutorul simbolurilor folosite pentru scrierea
numelor de fisier, referindu-ne la o multime de fisiere ce respecta un anumit
criteriu. In exemplul urmator se vor afisa toate fisierele ce contin un text
sursa C: for fis in *.c do cat $fis done
Liste de valori implicite
Lista de valori implicite este formata din lista parametrilor de pozitie, care
este memorata variabila speciala $@. for fis in $@ do lpr $fis done
care este echivalent cu: for fis do lpr $fis done
5.9 Instructiunea while
Ciclul while este folosit pentru executia unei liste de comenzi atat timp cat
este adevarata o anumita conditie. Sintaxa este urmatoarea:
while (expresie logica) do
(comanda)... done
De cele mai multe ori, se foloseste comanda test drept expresie logica in instructiunea
while.
EXEMPLE:
1. Pentru validarea corectitudinii datelor de intrare vom scrie urmatoarea secventa
de instructiuni: echo -e "Introduceti numele fisierului: \c" read fis
while a-z "$fis"i do echo "Eroare de introducere" echo -e "Introduceti numele fisierului: \c" read fis done
Se poate folosi un ciclu while cu executie infinita datorita comenzii true,
care returneaza intotdeauna valoarea zero:
while true do
... done
In acest caz, se vor folosi instructiuni de iesire fortata din ciclu ca break
si exit.
5.10 Instructiunea until
Ciclul until se termina atunci cand conditia devine adevarata. Sintaxa este: until (expresie logica) do
(comanda)... done
Se poate folosi comanda false pentru a obtine o bucla until infinita.
5.11 Crearea meniurilor simple. Instructiunea select
Sintaxa instructiunii select este: select (variabila) in (lista de valori) do
(comanda)... done
Lista de valori este afisata pe ecran prin canalul de eroare standard. Fiecare
optiune, precizata in lista de valori, este precedata de un numar de ordine.
Instructiunea se termina prin apasarea combinatiei ctrl+D.
EXEMPLU:
Scriptul (sa presupunem, ca are numele exemplu):
PS3="Introduceti un numar intre 1 si 3: " select optiune in matematica fizica informatica do if a -n "$optiune" i then echo "Materia preferata este $optiune" fi done
are urmatorul efect:
hasdeu:I$ exemplu
1) matematica
2) fizica
3) informatica
Introduceti un numar intre 1 si 3: 3
Materia preferata este informatica
1) matematica
2) fizica
3) informatica
Introduceti un numar intre 1 si 3: ctrl+D hasdeuI$
Daca se omite lista de valori, se lucreaza implicit cu parametrii de pozitie,
la fel ca in cazul instructiunii for.
5.12 Alte comenzi si chestii interesante
Substitutia unei comenzi
Shell-ul ne ofera posibilitatea de a substitui numele comenzilor cu numele dorite
de utilizator. Sintaxa este urmatoarea: sir=$(suita de comenzi)
Spre exemplu, pentru a substitui comanda pwd, scriem: unde_sunt=$(pwd)
In continuare, scriind sirul unde_sunt se va executa de fapt comanda pwd.
Definirea functiilor
Definirea unei functii se poate face din linia de comanda, scriind numele functiei
si parantezele (). La intalnirea parantezelor, shell-ul asteapta introducerea
acoladei deschise si a corpului functiei, iar in final acolada inchisa (semnificand
terminarea definirii functiei). Sa definim o functie pentru listarea directoarelor
date ca argumente, in forma lunga: hasdeuI$ listez ()
A
/bin/ls -l $@ | more
S
Pentru a se afisa declaratia functiei se foloseste comanda declare -f . Definitia
unei functii nu este disponibila, ca si in cazul variabilelor, decat in shell-ul
in care au fost definite. Pentru a putea exporta o functie in alt shell, se
foloseste aceeasi comanda, insa cu parametrul -fx, urmat de numele functiei
exportate.
Pentru ca functia sa ramana disponibila si dupa ce shell-ul in care a fost definita
isi incheie executia, putem scrie functia in fisierul .profile (un fel de autoexec.bat),
fiind astfel recunoscuta la fiecare conectare.
Cea mai buna solutie este aceea a scrierii functiei intr-un fisier de tip "mai
special", numit, sa zicem, bash.func. Comanda . bash.func va face "vizibile"
functiile din acest fisier in shell-ul activ.
EXEMPLU: listez ()
A
/bin/ls -l $@ | more
S sterg ()
A for i do echo -n "Stergeti fisierul $i (d/n)?" read opt case opt in
adDnNi*) /bin/rm $i;; esac done
S
Exercitiu : Ce efect are executia functiei sterg ?
Pentru crearea scripturilor complexe, se pot folosi functii definite la inceputul
scriptului, functiile jucand rolul de subprogram.
Nu este indicata folosirea comenzii exit in corpul unei functii pentru ca va
putea avea efectul deconectarii utilizatorului din sistem. Cand este necesara
terminarea unei functii se va folosi comanda return.
5.13 Exemple de scripturi
1. Scrieti un script care sa primeasca drept argument un nume de utilizator
si sa afiseze daca acesta este conectat in sistem si cate sesiuni are deschise.