Sunteți pe pagina 1din 40

Shell Unix

Autor : prof. Georges ROSENTHAL ± IUT Robert Schuman Strasbourg


Traducere şi adaptare : conf. Emilia PECHEANU ± Univ. Dunarea de Jos Galati

c
Introducere (1)
 
 
două categorii

u compilate
u  interpretate

Shell -ul Unix 


u ›  interpretatÄ
u › programare
p
 › script

u ›   limbaj de comenzi ›


limbaj de control JCLÄ

þ
Introducere (2)

u ° 
  p
u  › sh
shÄ
u ï  !csh
cshÄ
u  " -sh
-shÄ
u  ›  bash
bashÄ
u pd-sh 
› #Ätcsh
tcshzsh
zsh 
 $rsh
rshr-sh
r-shÄ ›
 › › vsh
vsh
help
help

Ñ
Introducere (3)
u Avantajele utilizării shell-ului
% &› comenzile
% &
Stil concis 
   modularitate
Administrare p
'   
 ›
› (   
  &  

u ‰uncţiunile shell-ului

  numelor generice  
redirect
redi rectare
are pipe
pipe--lining
  ››
  ››&&
 
programare  
  ›&Ä
substituţţia   
substitu
[
Caractere şi expresii generice

? un caracter oarecare
å un şir oarecare de caractere (eventual vid)
[| ]
] un caracter din lista
[ | ]] un caracter din interval
[!| ]
[! ] un caracter care nu este în lista
[! |

]
] un caracter care nu este în interval

 în bash se pot utiliza clasele de caractere POSIX:


[:alpha:] [:upper:] [:lower:] [:digit:]
[:xdigit:][:alnum:] [:space:] [:print:]
[:punct:] [:graph:] [:cntrl:]

 
Caractere şi expresii generice (exemple)
ls ±d /bin/???
ls ±d *p*
ls ±d /bin/*[!A-Za-z]
ls ±d .[!.]*
ls /usr/bin/[nm]*[[:digit:]]

Observaţie : Dacă numele de fişier conţine caractere generice,


Observaţ
căutarea se efectuează implicit în toate subdirectoarele directorului
specificat. Opţiunea ±d limitează căutarea la directorul specificat.
]
Definiţii Shell (1)
spaţiu alb
u   ›
&››  ›

cuvânt
u &(      (   (
 (Ä  ›token
token

nume
u ›$    › ›    
›
 (››     ›identificator
identificator

cuv
uvâ
ânt rezervat
u ››$  &
(
 › 
 
›$ ›

 
  Ä
! case do done elif else fi for function if in
select then until while {} time [[ ]]
Obsevaţie : numele comenzilor sunt cuvinte rezervate

Definiţii Shell (2)
metacaracter
u ›  
 
 (›

ü & ( ) | < > space tab

operator
u ››$      

|| & && ü üü ( ) | NL (newline)

comentariu
u  ›   (
››››  › 
( ›  ›› NL (new line)
Î
Redirect
Redirectarea
area fi
fiş
şierelor (1)

Trei fişiere implicit ataşate ( › › ›

Nume fişier Descriptor Semnificaţie

STDIN (standard input ) 0       › Ä


STDOUT (standard output ) 1       ݀
STDERR (standard error ) 2        ݀

'
Redirect
Redirectarea
area fi
fiş
şierelor ((2
2)

ï    


 redirectate ( fişiere
fişiere pe disc

<      STDIN intrare  din  


ù      STDOUT ieşire  către  
ùù      STDOUT adăugare  în  
2 ù      STDERR stocare    în  

c)
Redirect
Redirectarea
area fi
fiş
şierelor ((3
3)
u R

     
2ù 1 fuzionare STDOUT şi STDERR
<  asociere STDIN la descriptorul de fişier 
ù - închidere STDOUT
< - închidere STDIN

u @    (   › ( 


 › Ä
ë  <<<<[ [-]ë
° ›  ë   ›   (*"%'  ›   Ä
 
+ › (  › › ›
& &$ ë

u + ›
X    ›  : /dev/null
cc
Redirect
Redirectarea
area fi
fiş
şierelor ((Exemple
Exemple 1)
# Se creează fişierul vid f1 prin redirectare STDOUT
>f1
# Se listează conţinutul directorului § Kn fişierul f2 prin redirectare STDOUT
ls / >f2
# Se adaugă data calendaristică Kn fişierul f2 prin redirectare STDOUT
date >>f2
# Prin redirectare STDOUT se creează fişierul (vid) f3
# Directorul /

ë nu există iar pe ecran se afişează un mesaj de eroare
ls /nimic >f3
# Prin redirectare STDOUT se creează fişierul vid f3
# Mesajul de eroare se stochează Kn fişierul f
 prin redirectare STDERR
ls /nimic >f3 2>fis_err

Redirect
Redirectarea
area fi
fiş
şierelor ((Exemple
Exemple 2)

# Care din comenzile următoare afişează mesajul de eroare pe ecran ?


ls /nimic >f3 2>&1
ls /nimic 2>&1 >f3
Indicaţie : Evaluarea redirectărilor dintr-o comandă se face de
Indicaţ
la stânga la dreapta.

# Redirectare STDIN de la fişierul f3


# Conţinutul fişierului f3 va fi trimis prin un e-mail utilizatorului curent
mail $LOGNAME <f3


Redirect
Redirectarea
area fi
fiş
şierelor ((Exemple
Exemple 3)
# Afişarea unui text pe ecran ca document integrat
# În liniile până la linia cu cuvântul f
se face substiuţia de variabile şi comenzi
cat << f

Numele meu este $LOGNAME
Directorul curent este `pwd`
f

# Afişarea unui text pe ecran ca document integrat


cat <<-gata
Acest text va fi aliniat la stanga
gata

# Trimiterea unui mesaj ± document integrat către toţi utilizatorii conectaţi


wall <<sf_text
Serverul LINUX va fi oprit peste 5 min
Administrator sistem
sf_text

c[
Pipe--lining
Pipe
, conduct
conductă
ă » Ô
Ô Ô
Ô† Ä ›  ( ›(      
u Redirectarea
Redir ectarea ie
ieş
şirii standard (STDOUT) a unei comenzi către conduct
conductăă
u Redir
edirectarea
ectarea intr
intrăării standard (STDIN) a comenzii următoare către
aceeaş
aceea şi conduct
conductă ă care va « conecta » astfel cele 2 comenzi
 › › (     ›(  
Ä

STDIN STDOUT PIPE STDIN STDOUT


Comanda 1 Comanda 2
STDERR STDERR


Pipe--lining (Exemple
Pipe (Exemple))
# Fişierele script din directorul / /b
 conţin o linie cu textul « shell script »
# Care sunt fişierele script din directorul / /b
 ·
file /usr/bin/*|grep "shell script" "
# Care sunt fişierele script din directorul / ë ·
find /etc ±exec file{} \ü 2>/dev/null|grep "shell script"

# Care este numele celui mai mare fişier din directorul /etc ·
ls ±al /etc|tr ±s " "|sort ±nr +4 -5|head -1|cut ±d" " ±f9

# Câte directoare proprii ale utilizatorilor nu se află Kn /h  ·


getent passwd|cut ±d: -f6|grep -cv /home/

# Care este primul nume de utilizator (Kn ordine alfabetică), dar ultimul ·
getent passwd|cut ±d: -f1|sort|tee lista|head -1ü tail -1 lista

# Care este utilizatorul care s-a conectat primul ·


who|sort ±k4|line|cut -f1 -d" " c]
Citarea (Protejare ± Quoting) (1)
u forţează Shell-
Shell-ul să ignore &
(›   
››  
u se împiedică interpretarea caracterelor speciale(
speciale
›  ›    › intezice
intezice expandarea
parametrilor
u trei caractere ›
 ›
 
R anulează semnificaţia shell pentru caracterul următor
se mai numeşte caracter de escape
'  ' apostoafele (quotes
quotes) anulează semnificaţia shell pentru
toate caracterele dintre cele 2 apostroafe
""" ghilimelele (double
double quotes)
quotes anulează semnificaţia shell
pentru toate caracterele înafară
nafară de $ ` \
u  metacaracterele
metacaracterele ü & ( ) | < > space tab
›&
(
 ›  ›

 › 

( 

  
c
Citarea (Protejare ± Quoting) (2)
›
cit
cităării ››caracter
caracter special sau a unui metacaracter
plas
plasă
ării sale între apostroafe inverse, apostroafe sau ghilimele
ghilimeleÄ
  
d
e
l
R   " '
i
m
i  da da da sfâ
sfârşit nu nu
t
a
t " da da nu da sfâ
sfârşit nu
o
r
i
' nu nu nu nu nu sfâ
sfârşit

nu -  ›nu este 


  &  
da -  ›este 
  &  
sfârşit -$   ›    

Citarea (Protejare ± Quoting) (3)

echo ±e "«"
 ››
 'sir' ››  echo
&RRcaracter(e) ›
 ››ï

Rb ˜ Ô  R  Ô Rf  


R |  R  R ˜
R  | ˜ RR ˜ |

\   ›( › .ï%% 


 cÑ Ä
\x   ›( › .ï%%
 cÑ Ä

c'
Citarea (Exemple 1
1))
>\*a # creează un fişier având numele å
echo *
*a Desktop f1.sh f2.sh p1.c p2.c Perles tmp
echo \*
*
echo \**
*a
echo "*"
*
echo pwd
pwd
echo `pwd`
/home/emipec
echo "`pwd`"
/home/emipec
echo '`pwd`µ
`pwd`
# ce afişează comanda ?
echo `echo "*"` þ)
Citarea (Exemple 2
2))
echo "\\"
\
echo "\""
"
echo "\`"
`
echo "\$HOME"
$HOME
echo "\'"
\'

echo 'aaa\tbbbb'
aaa\tbbbb
echo $'aaa\tbbbb'
aaa bbbb

þc
Substituţţia comenzilor
Substitu

`ë `
`
›

$(ë
$( )
ë ) 

u   '      ››


  › ( Ä

u °  
  $ $
 ›  & 
citarea cu bac-slash \
 ›
  `  
  citarea
ï › (   $(X)

þþ
Substituţia comenzilor (Exemple)
Exemple)
# comanda
 afişează identificatorii  | şi  | pentru un utilizator
id
uid=15510(popescu) gid=1500(automatica)
echo $LOGNAME are identificatorul `id|cut ±f1 ±d"("|cut ±f2 ±d=`
popescu are identificatorul 15510

# Ce fac comenzile urmatoare?


cd /tmp
cp `getent passwd|grep popescu|cut ±d: -f6`/fis1 fis2
cd `dirname \`find / -name lista ±print 2>/dev/null \``

þÑ
Execuţţia comenzilor
Execu
ü ›N
NL ›& ( foreground
foregroundÄ
& ›& ( bac-ground
bac-groundÄ
&& 
|| ›
|  ›&

{ } ›
  › ›› 
( ) ›
  › ›› 

u    (
( ( ›(     ›( 


Ä›    (  (   *"%'Ä› 
  *"p*Ä
u %    ›  ›( # › &
&Ä
 /dev/null

þ[
Execuţţia comenzilor (Exemple 1)
Execu 1)
# Execuţia comenzii find se face Kn background
find / -name *aa* 2>/dev/null &

# conectorii && şi †† simulează funcţionarea unei structuri if


# codul de retur al primei comenzi condiţionează execuţia comenzilor următoare
date "+%A %d %B" && echo "Corect!" || echo "Comanda gresita!"
Joi 8 noiembrie
Corect!

date "%A %d %B" && echo "Corect!" || echo "Comanda gresita!"


Date: invalid date %A %d %B
Comanda gresita!

# Cum funcţionează comenzile următoare ?


ls ±l |grep f1 && echo "fişier gasit!" || echo "fişier
negasit"

þ 
Execuţţia comenzilor (Exemple 2)
Execu 2)
# Gruparea comenzilor cu ajutorul parantezelor

(echo Salut ü exit)


{echo salutü exitü}

pwdü (cd ..ü pwdü echo salut) ü pwd


pwdü {cd ..ü pwdü echo salut} ü pwd

þ]
Instrucţţiuni Shell de programare
Instruc
while...do...done  ››  
(   & (
for..in..do...done  ››  (
if...then...else...fi  ››  (
case..in..esac  › 

u  ›&›› ( comenzi


comenzi interne
u ›while,
while, for X ›› › › $ ›
(

   ›$› ›
(
  › ( 
ü NL
NL & && | ||
u condi
condiţţie 
(
codul
codul de retour   o
o comandă
comandă ›
o listă
listă de comenzi 0
0
 ›ADEVARAT
ADEVARATdiferit
diferit de 0
 ›‰ALS
‰ALSÄ

þ
Structura
Structura alternativ
alternativă
ă
if |
1
then |
2
[else
else |
3]
fi
›
if |
1
then |
2
elif
elif |
3
then |

else |
]
fi

› |
1 |
2 
(   (›› ›

  
þÎ
Structura
Structura alternativ
alternativă
ă (Exemple
Exemple))
# Afişare mesaje de eroare Kn limba română
if cat fifi 2>/dev/null
then
echo OK
else
echo "fişier negasit sau fara drept de citire"

# Condiţia se exprimă prin două comenzi Kn pipe-line


if who|grep root 2>/dev/null
then echo "Utilizatorul root este conectat! "
else
echo "Utilizatorul root nu este conectat!"
fi

# Condiţia se poate exprima şi prin operatorii &&  ||


who|grep root 2>/dev/null && echo "Root conectat!" || echo OK

þ'
Lista de cazuri

case variabilă in
model-a  | model-b A)
) lista-1 üü
model-m  | model-n A)
) lista-2 üü

model-x |
| model-y A... ) lista-99
esac

› |
1 |
2 
(   (›› ›

  

Ñ)
Lista de cazuri (Exemple)
Exemple)
# Afişare mesaje Kn funcţie de o valoare numerică tastată de utilizator
read numar
case $numar in
[0-9]) echo "Ati tastat un numar de o cifra!" üü
[0-9][0-9]) echo "Ati tastat un numar de 2 cifre!" üü
*) echo "Ati tastat altceva decat un numar" üü
esac

# Afişare mesaje Kn funcţie de o valoare calculată


nr_util=`who|wc -l`
case $nr_util in
1) echo "Un singur utilizator este conectat! " üü
[2-5]) echo "Sub 5 utilizatori conectati!" üü
?|?? ) echo "Mai mult de 5 utilizatori conectati!"
esac

Ñc
Structuri repetitive
Structura iterativă
for variabila in
in cuvânt-1 cuvânt-2AA
do   
done

›  seq
 ›    ›Ä

Structura repetitivă condiţională


while lista-1
do lista-2
done

R 
(  ››  until do
do

done
done
Ñþ
Comenzi interne pentru controlul
fluxului de execuţie

break A   › cÄ


continue A  ›    cÄ
exit A    › 
›Ä›  
 
› › ›
.          *"%'Ä
 fişier

wait A 


   ›

# › Ä

ÑÑ
Variabile Shell (1)

u numele unei variabile  ›(    


liter
literă
ă
cifră
cifr ă › _  
›     › (

u    implicit
implicităă › ›$ 
›(
 › › 

 
 ˜ |   

ŢIE : ‰ă
ATENŢ
ATEN ‰ără spatiu  ›
( ݁

u  ( implicit


implicit locală
locală  ››   (dar
dar
"exportată"   
›  export
poate fi "exportată export

Ñ[
Variabile Shell
u la execuţia unei comenzi, orice variabilă care face parte din
acea comandă va fi înlocuită (substituită) prin valoarea sa
curentă, care poate fi şi rezultatul unei comenzi

u referinţa la o variabilă (înlocuirea ei cu valoarea sa curentă) se


referinţ
face cu ${
${} sau cu $ , dacă nu există ambiguitate

u un şir de caractere vid sau conţinând caractere speciale


şi/sau spatii va fi delimitat cu ghilimele " sau cu apostroafe '

Ñ 
Variabile speciale ale shell-
shell-ului
u Variabile speciale
$? codul de retur al ultimei comenzi
$ numarul de parametri pozitionali (din linia de comanda)
$$ pid-ul shell-ului curent
$! pid-ul ultimului proces executat in bac-ground
$0 numele script-ului curent (sau a shell-ului curent)

$1..$9
$1.. $9 parametrii poziţionali (introduşi de utilizator în linia de c-dă)

u Variabile create de shell (în afară de ? )

"$*
$*"" toate argumentele separate de spatiu formează un singur
cuvânt (un singur şir)
"$@
$@"" lista cuprinzând  parametri poziţionali

Ñ]
Comanda de testare obiect shell : test(1)
test Ô  sau  Ô  A

YEvaluează Ô  şi întoarce 0 dacă ea este adevarat


adevaratăă , sau o
valoare diferită
diferită de zero dacă este fals
falsă
ă
Y se foloseşte cu instrucţiunile 

 | 
 |
Y în bash
bash, operatorul extins  A permite expresii simplificate
Y Ô  se construieşte pe baza unei sintaxe specifice comenzii test

Pentru testare şiruri de caractere expresiile sunt :


-z  adevărat dacă  are lungimea egală cu 0 (şir vid)
-n  adevărat dacă  are lungimea diferita de 0 (sir non-vid)
 Å  adevărat dacă 
 este identic cu 
 !Å  adevărat dacă 
 este diferit de 

 adevărat dacă 
 nu este vid

Ñ
test (2)
Expresii pentru testare fişiere
-d   adevărat dacă   există şi este un director
-f   adevărat dacă   există şi este un fişier ordinar (obişnuit)
-c   adevărat dacă   există şi este de tip special-caracter
-b   adevărat dacă   există şi este de tip special-bloc
-h   adevărat dacă   există şi este de tip legatură simbolică
-p   adevărat dacă   există şi este de tip conductă cu nume
-r   adevărat dacă   există şi permite citire pentru utiliz. curent
-w   adevărat dacă   există şi permite scriere pentru utiliz. curent
-x   adevărat dacă   există şi permite executie pentru utiliz. curent
-k   adevărat dacă stic--bit pentru   este « on »
-u   adevărat dacă bitul suid pentru   este « on »
-g   adevărat dacă bitul sgid pentru   este « on »
-s   adevărat dacă   are lungimea diferită de 0
-t   Ô adevărat dacă fişierul având descriptorul   Ô (egal implicit
cu 1) corespunde unui dispozitiv de tip terminal
ÑÎ
test (3)
Testare numere
 |  adevărat dacă relatia rel dintre   este
adevarata

u relatia | se exprimă prin -eq -ne , -gt  -ge -lt -le
} ATENTIE : Nu confundaţi operatorii de comparare numere cu cei de
comparare şiruri !

Observaţii
u conditiile compuse se exprima cu ajutorul operatorilor logici:
-a (si) , -o (sau), ! (non) plus paranteze rotunde ( ) pentru operanzi
u pentru a elimina ambiguitatile, delimitati variabilele cu ghilimele "
u operatorii = şi != necesita intotdeuna specificarea operanzilor

u parantezele ( ) se citeaza (sunt precedate) in mod obligatoriu cu \


u paranteza [ (resp. ]) trebuie sa fie urmata (resp. precedata) de spatiu

Ñ'
test - extensii bash

Œe   adevărat dacă fişierul  există


-O   adevărat dacă utilizatorul curent este proprietarul fişierului
-G   adevărat dacă grupul din care face parte utilizatorul curent
este grupul proprietarului
-N   adevărat dacă fişier ul  a fost modificat
de la ultima citire
 -nt  adevărat dacă f1 este mai recent decat f2
-
-ot  adevărat dacă f1 este mai vechi decat f2
-
-ef  adevărat dacă f1 şi f2 sunt legaturi (lin--uri) fizice
catre acelasi fişier
[)