Documente Academic
Documente Profesional
Documente Cultură
Scriptur I Unix
Scriptur I Unix
Programare Shell
1. Introducere
1.1 Ce este shell-ul ?
Shell-ul este o componenta a sistemului de operare care permite interpretarea comenzilor UNIX
tastate de catre utilizator in terminalul UNIX, sau in consola. A interpreta aceste comenzi inseamna
de fapt a transforma comenzile utilizator in procese care se pot executa la nivelul procesorului. De
exemplu la tastarea comenzii date care permite afisarea datei curente procesorul va trebui sa
citeasca informatiile referitoare la ora sistemului de la ceasul procesorului, sa converrteasca aceste
sdate intr-un format inteligibil, si apoi sa tipareasca aceste date aflate intr-un format citibil la
terminalul utilizatorului. Din acest exemplu se poate trage concluzia ca toate comenzile UNIX nu se
pot realiza direct la nivelul procesorului, ci este nevoie de un mediu care sa permita aceasta
translatare, transpunere din formatul de comanda UNIX in operatii care se pot efectua la nivelul
procesorului.
Cuvantul shell defineste in limba engleza termenul de cochilie. Aceasta cochilie poate fi
vizualizata in schita de mai jos care prezinta componentele sistemului de operare UNIX :
Asa cum se poate obseva din figura de mai sus shell-ul UNIX este un limbaj de comenzi. Deci
elementele constitutive ale shell-ului sunt comenzile UNIX. Echivalentul literar si stiintific in
limba romana pentru cuvantul shell este de interpretor de comenzi.
Pentru sistemele de operare de tip UNIX shell-ul poate fi interpretat ca fiind aplicatia Konsole,
pentru sistemele de operare Windows 9x este command.com, pentru NT este cmd.exe iar
echivalentul cu interfata grafica este explorer.exe.
Pentru sistemele de operare de tip UNIX exista mai multe tipuri de shell cum ar fi Bourne Shell,
Bourne Again Shell, Z Shell, C Shell, Korn shell, etc.
Pentru detalii suplimentare despre conceptul de shell studiati
In continuare gasiti cateva exemple de scripturi shell formate dintr-o succesiune de comenzi. Testati
aceste scripturi !
#!/bin/bash
clear
echo -n Dumneavoastra utilizati un sistem
uname
echo
echo -n Versiunea kernelului dumneavoastra este
uname -r
3. Variabile si operatii
3.1 Declararea si utilizarea variabilelor
Spre deosebire de alte limbaje de programare, cum ar fi C/C++ sau Java, in scripturile shell nu este
nevoie de declararea explicita a variabillelor. Pur si simplu efectuati o atribuire acolo unde este
necesar si folositi aceasta variabila acolo unde se cere.
Atribuirea unei valori se face utilizand o constructie de tipul urmator :
variabila = valoare
Orice variabila este folosita mai departe prefixand numele variabilei de simbolul $ (dolar) .
Intotdeauna accesul la valoarea unei variabile se face cu ajutorul simbolului $ (dolar). Atunci cand
dorim sa facem calcule simple cu o anumita variabila este recomandat sa se utilizeze notatia
$variabila, deoarece intr-o asemenea situatie este nevoie sa se acceseze valoarea varibilei. La
atribuirea de valori unei variabile nu se foloseste simbolul $, deoarece nu trebuie accesata valoarea
variabilei, ci trebuie modificat continutul acesteia.
Operatiile aritmetice si de compararea pe care le permite spre evaluare comanda expr sunt :
adunare : +
scadere : inmultire: *
impartire : /
restul impartirii : %
comparare : > >= < <= != =
Aceasta comanda permite de asemeni lucrul cu expresii complexe, care contin paranteze.
Introducerea parantezelor se face cu ajutorul lui \ (slash). Exemplul de mai jos sugereaza cum se
poate utiliza aceasta comanda :
$ expr \( 5 + 2\)
7
Descriere
Exemplu
[ -e /etc/shadow ]
-d fisier
[ -d /home/ Desktop ]
-f fisier
[ -f fisier]
-L fisier
[ -L /home ]
-r fisier
[ -r fis.txt ]
Descriere
Exemplu
-w fisier
[ -w fis.txt ]
-x fisier
[ -x script1.sh ]
fisier1 -nt fisier2 Adevarat daca fisier1 este mai nou decat
fisier2
fisier1 -ot fisier2 Adevarat daca fisier1 este mai vechi decat
fisier2
[ -z $var ]
-n sir
[ -n $var ]
sir1=sir2
[ $sir1 = $sir2 ]
sir1!= sir2
[ $sir1 != $sir2 ]
egalitate
[ $a -eq 15]
inegalitate
[ $a -ne 15]
<
[ $a -lt 15]
<=
[ $a -le 15]
>
[ $a -gt 15]
>=
[ $a -ge 15]
5.5 Case
Similarul instructiunii case din linbajele de programare este case. Acesta are sintaxa :
case $variabilaOptiune in
multimea1) instructiuni1 ;;
multimea2) instructiuni2 ;;
multimea3) instructiuni3 ;;
.............................................
multimean) instructiunin ;;
*)
instructiuniDEFAULT ;;
esac
Variabila dupa care se exprima optiunea poate sa fie intr-o anumita multime. Aceasta multime poate
avea un singur element, de exemplu :
5.6 Select
Instructiuna select este o extensie a instructiunii case. Spre deosebire de case, lista de valori posibile
Exemple
1. Exemplul urmator calculeaza suma numerelor introduse de catre utilizator atata timp cat
numerele introduse sunt mai mici sau egale decat 10 :
#!/bin/bash
read x
s=0
while [ $x -le 10 ];
do
s=`expr $s + $x`
read x
done
echo "Suma este $s"
2. Exemplul urmator numara de cate ori a fost introdusa optiunea DA. Ciclul while se opreste la
introducerea altui sir de caractere diferit de DA.
#!/bin/bash
read r
u=1
x=0
while [ "$r" = "DA" ]
do
x=` expr $x + $u `
read r
done
echo "Contorizarea = $x"
Remarcati ca in acest script shell este utilizata comanda seq. Aceasta comanda construieste
o secventa de numere. De exemplu seq 100 , creeaza o secventa care contine primele 100 de
numere naturale. Comanda seq 41 56 creeaza o secventa de numere ce contine toate
numerele cuprinse intre 41 si 56, inclusiv extremitatile 41 respectiv 56. O optiune
importanta pe care o are aceasta comanda este de a permite construirea de secvente de
numere construite prin incrementare . De exemplu comanda seq 1 3 100 permite afisarea
de numere de la 1 la 100 din 3 in 3, incepand cu 1.
Cititi pagina de manual a comenzii seq si rulati cele cateva exemple de mai sus pentru o mai
buna intelegere a acestei comenzi.
#!/bin/bash
s=0
for i in `seq 100`
do
s=`expr $s + $i`
done
echo "Suma primelor 100 de numere este $s"
3. Exemplul urmator calculeaza dimensiunea totala a tuturor fisierelor si directoarelor din
directorul curent de lucru.
#!/bin/bash
s=0
for i in `ls -l |tr -s ' ' | cut -d ' ' -f5`
do
s=`expr $s + $i `
done
echo "Dimesniunea totala a fisierlor este $s biti"
7. Transmiterea parametrilor
Orice comanda UNIX se apeleaza prin numele sau urmat de anumite optiuni si de parametri.
De exemplu comanda de copiere a unui fisier fis.txt intr-un director DirectorA este :
cp fis.txt DirectorA
0
1
2
0 : comanda
1 : parametrul 1
2 : parametrul 2
Parametrii se utilizeaza pentru a nu cere introducerea de date suplimentare de catre utilizator dupa
lansarea procesului care efectueaza o anumita comanda, in felul acesta asigurandu-se o atomicitate a
procesului si continuitate.
Este asadar recomandabil sa se utilizeze pe cat posibil scripturi care utilizeaza tehnica transmiterii
de parametri. Pentru a pasa un parametru unui script shell se procedeaza analog cu parmetrarea
comenziilor UNIX :
numele_scriptului parametru1 parametru2 ...
Acesti parametrii pot fi referentiati in cadrul programului scriptului cu ajutorul unor variabile
speciale dupa cum urmeaza :
$1 la $9 : contine al X-lea parametru
$*
: contine toti parametrii
$#
: contine numarul de parametri transmisi
$0
: contine numele scriptului
$$
: contine numarul procesului shell care trateaza scriptul dumneavoastra
Pentru clarificarea notiunilor prezentate testati urmatorul script :
#!/bin/bash
echo "Ati transmis $# parametrii dupa cum urmeaza : "
echo "Parametrul 1 : $1"
echo "Parametrul 1 : $2"
echo "Parametrul 1 : $3"
echo "Parametrul 1 : $4"
echo "Putem afisa toti parametrii printr-un singur apel : $* "
Apeland acest program se obtine :
$ ./parametri.sh a b c d
Ati transmis 4 parametrii dupa cum urmeaza :
Parametrul 1 : a
Parametrul 1 : b
Parametrul 1 : c
Parametrul 1 : d
Putem afisa toti parametrii printr-un singur apel : a b c d
8. Redirectari
Iesirea standard a orciarei comenzi UNIX este ecranul. In anumite situatii este necesar ca iesirea
unei comenzi, adica raspunsul ei, sa fie utilizat ca si parametru pentru o alta comanda. Pentru a
utiliza iesirea unei anumite instructiuni ca si parametru se utilizeaza tehnica redirectarii asupra
careia se concentreaza acest paragraf.
8.1 Comanda1 | Comanda2
Fenomenul descris printr-o inlantuire ca cea exprimata in titlul acestui paragraf poate fi sintetizat
intr-un singur cuvant : PIPE. Un fisier in care un proces poate scrie, iar un alt proces poate citi se
numeste fisier de tip PIPE. Pentru executia unei comenzi shell in marea majoritate a cazurilor se
creeaza un proces care va executa cerintele acelei comenzi. Atunci cand dorim ca procesul creat
CAT(1)
NAME
cat - concatenate files and print on the standard output
SYNOPSIS
cat [OPTION] [FILE]...
.....................................................................................................
Urmeaza continutul celor doua fisiere ls.txt si cat.txt .
:~/TestRedirectareErori$ cat erori.txt
cat: A: Is a directory
cat: B: Is a directory
cat: C: Is a directory
Programul urmator arata cum se poate scrie la cele doua iesirii standard : stdout si stderr .
#include <stdio.h>
int main()
{
fprintf(stdout,"message on stdout\n");
fprintf(stderr,"message on stderr\n");
fprintf(stdout,"2nd message on stdout\n");
return 0;
}
Creati un fisier redirectari.c care va contine programul sursa de mai sus. Compilati si rulati
programul de mai sus. Pentru a pune in evidenta mesajele de tip eroare redirctati stderr spre un
fisier numit erori.txt .
9. Functii
Ca majoritatea limbajelor de programare si scripturile shell pot contine functii ce sunt definite in
interiorul acestora si care pot fi apelate ulterior.
Declararea unei functii se face urmand sintaxa :
function nume( ) {
}
Apelul unei functii se face prin numele sau. Unei functii i se pot transmite anumiti parametri ca unui
script shell .
10.Referinte WEB