Documente Academic
Documente Profesional
Documente Cultură
UNIX
Caracterizare
Script-uri bash
Comenzile bash pe care dorim s le execute shell-ul pot fi stocate n
fiiere. Acestor fiiere li dau drepturi de execuie (cu comanda chmod +x
fiier), dup care pot fi executate ca orice alt comand. Fiierele
coninnd comenzi ale unui limbaj de tip script, cum este cazul
bash-ului, se mai numesc i script-uri.
De obicei, la nceputul fiecrui fiier script se stabilete shell-ul care
va fi invocat de ctre sistemul de operare pentru a se executa comenzile
i construciile bash. Pentru bash vom avea: #!/bin/bash. Pentru a executa script-urile putem utiliza urmtoarele modaliti de apelare:
Variabile
Deseori am dori ca anumite rezultate s le stocm temporar n memorie
pentru prelucrri ulterioare. Acest lucru poate fi realizat fie cu ajutorul
unor fiiere temporare (soluie ineficient, consumatoare de resurse ale
sistemului), fie prin intermediul variabilelor puse la dispoziie de shell.
Pentru shell-ul bash, toate variabilele sunt de tip ir de caractere, ele fiind
create din zbor. Pentru a vizualiza toate variabilele definite i valorile
corespunztoare acestora trebuie utilizat comanda set. Iniializarea
unei variabile se realizeaz cu operatorul = (acest operator nu trebuie s
fie precedat sau succedat de spaii): variabila=valoare. Numele variabilei trebuie precedat de simbolul $ atunci cnd referim valoarea respectivei variabile. Pentru bash, avem la dispoziie i comanda intern
let pentru a realiza atribuiri de valori unei variabile. Sunt acceptai i
operatorii +=, -= etc. prezeni n C ori Perl. De asemenea, shell-ul bash
pune la dispoziie un bogat set de faciliti pentru evaluri matematice
utiliznd numere ntregi (n alte shell-uri posibile doar cu ajutorul
comenzii expr). Astfel, pentru a evalua o expresie vom scrie acea expresie ntre paranteze rotunde duble precedate de caracterul $. Pentru efectuarea de calcule fracionare se poate utiliza comanda bc. Afiarea
coninutului unei variabile se poate realiza cu ajutorul comenzii echo.
(infoiasi)$ a = 10
bash: a: command not found
Execuie
Depanare
(infoiasi)$ a=10
(infoiasi)$ echo $a
10
Script bash
Pasarea variabilelor
spre script
Forme speciale
ale variabilelor
(infoiasi)$ ls $v
total 4
-rwxr-xr-x
Controlul fluxului
Comparaii
Operaii
cu fiiere
1 user
Comenzi
UNIX/Linux
Comenzi bash
interne
Ieire
ATELIER
UNIX
\a emite un sunet (alarm).
\b deplazeaz cursorul cu o poziie spre stnga (backspace).
\f trece cursorul pe rndul urmtor, rmnnd pe aceeai coloan.
\n trece cursorul pe prima poziie de pe linia urmtoare.
\r mut cursorul la nceputul liniei curente.
\t insereaz un caracter tab.
\nnn insereaz caracterul care are codul ASCII nnn (poate avea una,
dou sau trei cifre), n octal.
\xnnn insereaz caracterul care are codul ASCII nnn (poate avea una,
dou sau trei cifre), cod dat n hexa.
O comand nrudit este printf (foarte asemntoare ca funcionalitate cu funcia printf() din C). Atunci cnd dorim dup o variabil
s afim imediat un alt ir de caractere, numele variabilei trebuie ncadrat de acolade.
(infoiasi)$ nume=Maria
Iarna
Mariana
(infoiasi)$
Ultima comand afieaz coninutul variabilei vna (n cazul nostru nefiind definit n prealabil va fi considerat vid).
Dac n loc de ghilimele vom folosi apostrofuri, atunci shell-ul nu
va mai expanda valoarea variabilei:
(infoiasi)$ curs=Web
(infoiasi)$ echo "Cursul meu preferat este $curs"
(infoiasi)$ cale=/home/user/tmp
(infoiasi)$ echo ${cale:=/tmp}
/home/user/tmp
(infoiasi)$ echo $v
8 void.html
/tmp
(infoiasi)$ echo $cale
/tmp
(infoiasi)$ variabila=
(infoiasi)$ cale=
Sabin Corneliu
(infoiasi)$ nume=Victor
(infoiasi)$ cale=/home/busaco
ATELIER
UNIX
(infoiasi)$ echo ${cale:?"Calea de directoare este vida."}
/home/busaco
Variabile predefinite
n cadrul shell-ulului avem acces la un numr de variabile predefinite,
cele mai semnificative dintre acestea regsindu-se n tabelul Variabile
(prin convenie, variabilele predefinite ale sistemului au numele dat cu
majuscule).
Cteva exemple:
(infoiasi)$ echo $BASH_VERSION
2.04.11(1)-release
(infoiasi)$ echo $MACHTYPE
i386-redhat-linux-gnu
#!/bin/bash
/home/stanasa
linux
21144
Valorile variabilelor de sistem predefinite pot fi consultate prin intermediul comenzii set. De asemenea, asupra lor se pot utiliza comenzile
export, readonly sau unset.
Variabile speciale
Exist cteva variabile speciale foarte utile n script-uri:
Variabile
Variabil
Descriere
Conine calea complet a directorului corespunztor
utilizatorului curent. n cadrul specificatorilor de fiier, $HOME
poate fi substituit de caracterul tilda ~.
Furnizeaz numele de cont al utilizatorului curent.
USER
Conine numele de cont al utilizatorului curent.
LOGNAME
Desemneaz numele serverului.
HOSTNAME
Furnizeaz tipul mainii (procesorului).
HOSTTYPE
Desemneaz tipul sistemului de operare.
OSTYPE
Descrie tipul sistemului n formatul procesor - firma
MACHTYPE
productoare - tipul sistemului de operare.
Indic shell-ul implicit.
shell
Indic fiierul care a generat aceast instan a shell-ului.
BASH
BASH_VERSION Furnizeaz versiunea bash.
Conine numele fiierului unde sunt depozitate mesajele de
MAIL
e-m
mail primite.
Desemneaz structura prompt-ului principal al shell-ului.
PS1
Reprezint prompt-ul secundar al shell-ului (apare atunci
PS2
cnd o comand este scris pe mai multe rnduri).
Furnizeaz tipul de terminal.
TERM
Conine lista de directoare utilizat de shell pentru cutarea
PATH
comenzilor (fiierelor executabile).
Furnizeaz directorul curent de lucru (cel care a fost stabilit
PWD
de comanda cd).
Conine un numr generat aleator cuprins ntre 0 i 32767.
RANDOM
Dup utilizare, valoarea variabilei se modific automat.
HOME
PID: 1465
Se observ faptul c pentru primul apel fiierul care se execut este bash
(shell-ul), care execut comenzile din fiierul cmd (numele su este parametru). A doua variant de apel aduce rezultatul scontat: cmd este
fiierul care se execut.
Instruciuni
Shell-ul bash pune la dispoziia programatorilor o serie de structuri de
test: if i case i repetitive: for, while, until.
Structura condiional if are urmtoarea sintax:
if
lista_de_comenzi_1
then
lista_de_comenzi_2
[ elif
lista_de_comenzi_3
then
lista_de_comenzi_4 ]
...
[ else
lista_de_comenzi_N ]
fi
Secvena elif poate aprea de cte ori este nevoie. Dac ultima comand din prima list de comenzi se termin cu succes (returneaz valoarea zero), se execut instruciunile care urmeaz lui then, altfel se
ATELIER
UNIX
continu cu urmtorul elif sau else. Cnd se ajunge pe o ramur elif
se execut ca i cum ar fi un alt if. n programul de mai jos (denumit
rmtemp) apare structura if:
#!/bin/bash
if
echo "Stergerea fisierului \"temp\""
rm temp 2>/dev/null
then
echo "Fisierul \"temp\" a fost sters."
else
Comanda rm terge fiierul temp dac exist i poate fi ters (e.g. utilizatorul care apeleaz script-ul are drepturile necesare), altfel afieaz
un mesaj de eroare (mesajul nu apare pe ecran ntruct ieirea standard
de eroare este redirectat la /dev/null).
Sintaxa structurii condiionale case este cea de mai jos:
case expresie in
[ sir_de_valori_1 ")" lista_de_comenzi_1 ";;" ]
...
[ sir_de_valori_N ")" lista_de_comenzi_N ";;" ]
esac
case $1 in
-* )
stop|start )
do
finger $U >> lista_utilizatori
done
while
?* )
#!/bin/bash
-a|-[fx-z] )
Variabila var va lua succesiv valori din textul specificat (cte o linie).
Dac textul lipsete variabila va lua ca valori parametri transmii n linia
de comand.
Programul de mai jos va genera un fiier coninnd informaii despre fiecare utilizator conectat:
lista_de_comenzi_1
do
lista_de_comenzi_2
esac
done
Se execut prima list de comenzi. Dac ultima comand din prima list
se ncheie cu succes (returneaz un cod de eroare nul), atunci se execut i
a doua list dup care se reia bucla, altfel se iese din structura repetitiv.
Urmtorul script va simula execuia comenzii cat:
while read -r linie
do
echo "$linie"
done
Pentru a iei forat dintr-un ciclu repetitiv se poate folosi break, iar
pentru a trece direct la urmtoarea iteraie se va utiliza continue, ca n
limbajele C sau Java. Un exemplu:
OPTIUNI="Salutari Iesire"
select opt in $OPTIUNI; do
if [ $opt = "Iesire" ]; then
echo "Am terminat..."
exit
tail="$dir/tail"
break
fi
done
echo "Am gasit comanda tail: $tail"
ATELIER
UNIX
Comanda test
Script-uri sistem
Ori de cte ori este lansat un proces shell interactiv, va fi lansat mai nti
fiierul script /etc/bashrc, apoi $HOME/.bashrc. De altfel, n orice sistem UNIX (Linux) prin convenie orice nume de fiier terminat n rc
(de la run commands) desemneaz un fiier script de configurare. Spre
exemplu, script-urile de configurare a serviciilor sistem rulate la iniializarea sistemului de operare se gsesc n directorul /etc/rc.d/init.d.
ntr-un fiier .bashrc se pot defini alias-uri i se pot stabili diverse valori ale unor variabile de sistem:
# .bashrc
then
alias h='history'
echo $director
fi
done
Resurse bibliografice
! M.Budiu, Articolele publicate n NET Report:
http://www.cs.cmu.edu/~mihaib/articles/articles.html
TERM=vt100
# schimbam prompt-ul
# \h - numele masinii
# \u - numele utilizatorului
# \w - directorul de lucru (curent)
PS1="\h (\u): \w>"
export TERM PS1