Sunteți pe pagina 1din 24

: :'iii:E[i$:+ .1' " :": ffi{...

lTJ#ffiif;
1. . '. . , '

il:.,|$ farrta 2 : Commandes syslme et prograntmation Shell

Excrcices corriss

,'i-;,11, "

Labo Environnement

UNIVLIl\trUX
Exercices corrigsen sheltr

163

l::';ll1:, 1 :.:,;!!;1:

i: :::::;::portie 2 :'Cotanandes

..'.:']

systme et programmation

Shell

Exercices coriips

VARIBLES ET EII\IIRONNEMENT
: Exercice u*ir visualis le rsultat de la commande env (diverses valeursde ffir pndfinies), crireun scriptshell qui en affichecertainsainsi variables quccellesrclativesau script et sesarguments.

#sh1: script.affrchant Ia valeur de plusieurs ffuariablespdfinies de I'environnement et du shell echodirectory home : $HOME echouser bgname : $LOGNAME echomy mailbox: $MAIL echopath value : $PATH echoshell courmands : $SHELL echo terminal type : $TERM echoscript name : g0 echoscriptpid: $$ echo arguqts number : ffi. echolst of4rguments : g*

t I

Exercice: Ecrireun sc"ffl>hell manipulant les quotes (simple,doubleet anti).

#sh2 : script nanipulnt

les guotes

var=exemple echocontermde var : $var echo "contenu de var : gvar" echo'contenude var: $var'

echci enf-JYexempletype de l\apostrophe echo"ceci est I'exemple type de I'apostrophel

r65

.'"r,-

; jii;i, ; : :il,*!iii-,i::' t;.,; , .;. , ..1 ;t.:r..i;::;1

",Parte 2': Commaides

Shell

E-terciecs co

Exercice: Ecrire un script shell affichant la liste des caractresspciaux en foissaclasse chaque indiquant

FICHIERS ET REPERTOIRES
Exercice : Ecrire un- script qui adnret un unique paranrtre optionnel devanl

spciauxdu shell #sh 3 : liste deb''caracires echoles caractresspciaux sont : echo -e "\t les diffrentes quottes : \( \" \'\' \)" echo -e "\t les parenthseset assimils \( \[ \] \) \( \{ \} \)" echo -e "\t les symbolesde ponctuations : \( \' \: \; \)". echo -e "\t les oprateurs arithmtiques: \( \+ \' \* \/ \% \)" echo-e "\t les comparateurs: \( \> \< \= \! \ | \& \)" echo -e "\t les symbolesspciaux : \( \\ \? \@ \$ \- \)"

le rpertoire indiqu, si celui_ci estvalide. Idans

rersqui sontinclus

#sh5 : script affichant la liste des fichiers # inclusdans le rpertoireclonn en paranrtre # si pls cleparanrtres il s'agiradlr rpertoirecoul.ant # il s'agirad'une er.r.errr si pir_rsieur.s paraurtres if test $# -gt,I theu echoerrent ; tlop clepat.amtres echo"us.age: $PWD/$O[directorl,] " elif test S#-eq0 then echocontenr.r clu t per.toir.e conrant : l" $r clif tcst -d $1 tl'ren echocontentr du r.pertoire $l ls -l $1 elsc echoerrenr : $1 nYc'stpas ul.rrpertoire echo"rrsage : $PWD/$0[dir.ector1,]"

: Exercice pour a{ficherle contenu possibilits diverses un scriptUtilisant, Ecrire soncontenu' et affecter d'unevariable

: #sh4 : I'affectation varO="" ; echovarO : $varO varl=chaine ; echovarl : $var1 var2="une chaine";echovar 2 : "o^,na1g=gvar1 ; echovar3 : $var3 echo "variable non affeite" ; echo var : $var echo"var est une chaiue vide" ; var="" var4-${var:valeurl} ; echovar4 : $var4 ; echovar : $var varS-$tvar;+valeur2) ; echovarS : $var5 ; echovar: $var var6-${var:-valeur3} ; ehovar6 : $var6; echovar: $var u"17=${var:="valeur4"} ; echo vat7 z $var? ; echo var : $var echo "var est une chaine non videll ; var="valeur" var4-g{var:valeurl} ; echovar4 i $var4; echovar: $var varS=g{var :+vai.eur2} ;-echvarS i $var5 ; echovr : $var var6=${var :-valeurS},;echovar6 : $var6; echovar: $var

fi

rr I
I

Erercice: Ecrire un script qui adnret la spcilicationd'un rpertoire conlme son type. et qui afficherapour chaquefichierqu'il renfernre paranrtre galenrent affich. sera t'ichiers de par tyPe Un total

nbficSpc='expr $nbficspc+ l. else echogi inconntr fi done echonombre total de tchier.r.per.toire : gnbficRen echonombretotal de fichier ordinaire : $nbficOrd echonorubre total de fichier spciaux: gnbficSpc else echogl nYest pas un rper0oire
II

#sh6: script affichant Ie type de chaque fichier 4 appartenant au rpertoire passen paranrtle t 4 ainsi que Ie total par catgorietrcuv r iftest $# -ne 1 then echoerreur : un llaramtre est atlendtt directory" echo"usage: $P!VD/$O elif tesr -d $1 then nbficOrd=0 nbficReP=g nbficSpc=0 cd $1 foriin* do iftest -d $i ihen echo $i est ttn fichier rpertoire nbficReP='s)itt $nbfrcRep+ 1' elif test -f Si then echo$i est un fichier ordinait'e bficOrd='expr $nbficOrd + t' elif.(ls $i) 1> laevlnutt then ' echo $i est Lrnfichier sPcial

Exercice : Ecrireun scriptqui affiche ra risre dessousrpertoires d'un ou prusieurs en paranrtres, qa_sss ainsiqueleui toral. On testera'.tuqr. 19e1oir91 foisla validit du rpertoire pass enpaiamtre.

#sh7 i script lisiant les sous.rpertoires du (des)rpertoire(s) # passs en paramtred'appelainsi queleur ttal ge"ih p1p=.pwd. if test $# -eq0
then else echoerreur : paranrtresmanquants echo"usage: gPWD/gO directory...,f for i in g* do echo if ! test -d gi then echoerreur: $i n\est pas un rpertoire else cd $i Total=0

l o8

'' ':,.;

Pane2:CommandesstsimeaPio|ammatlonShell!Exerclcescorrlgs

te 2 i Commandes fi find $dossier -type d -print

-l-'.r,

':-;': :r!:-'':: ,-,ll]5l I I ' utho -de $i : liste des sous-rpertoires

forj in * <io if test 'd $j ,, then echo $j , rl,otal='expr $Total + 1' I fi clone echo "Total = $Total"
done

i Exercic: passen Ecrireun script rcursif qui affiche le contenud'un rpertoire dont la spcification de clremindoit au pralable paramtre trevalide.

: r,#sh9 : script affichant rcursivementle contenu d'un rpertoire passen paramtre # if test $# -ne 1 then echo erreur echo"usage exit tr if ! test -d $1 then echo erreur echo "usage

cd $DIR : restibution du chemin initial echo--------'

un seul argument est ucessaire $0 directory"

Ex e rc i c e: script rpondantaux besoins En recourant Ia commande find crire un soit d rpertoire courant si rpertoires ;ufn"f,ug" de la liste des sous donn en paramtre' rpertoire du ou n'est prcis aucun Daramtre

$1 nYest pas un rpertoire $0 directorv"

#shS : pareil que sh? de celui passen paramtre ii.t. d., sous-rpertoires # if test $# -gl 1 tl'ren echo erreur : nombre de paramtres importants echousage : $O ldirectorY] else if test $# 'eq 0 then d.osbier=;- #r-prtir cotirant, . else #rpertoire passen paramtre " dossier=$1

else echo "" i echo "----i'----.--.-rpertoire : $t --------.-----for j in 1t'* -do "' iftesr -d $j then
# traitement du sous rpertoire $0 $j # appel rcursif eciro $j

, else

done

et Programmaton Sh;U systme Parlie 2 : Commandes

Exelcices'corrigE

;:'.:ti i;portit z t Comman des

Shell

Exercices

E x e rc i c e : Ecrire un script qui utilise les dfinitions d'environnementsque I'on peut pour afficher rcursivement empiler et dpiler moyennant le parenthsage .le contenu d'un rpertoire passen paramtre

de type fichier t$crireun script qui admet en entreun paramtre (sinon il s'agit d'une erreur)et affiche comme ou rpertoire. ordinaire sesl0 premires lignes. rsultat

#shgbis: script affichant rcursivement le contenu d'1rnrpertoire pasSen paramtres # #nota : agit comme ls -R J+ on utilise pour chaque sous rpertoire un J1 t environnement d'excution qui lui est propre 11 et obtenu par les fameuses parenthses ! eChO -e'r\n\n=:=dbUt=---======== if test -d $1 then $

script visualisant les 10 premires lignes du #sh10: contenu d'un fichier ou d'un rpertoire pass en paramtre if test $# -gt I then echoerreur: trop de paramtres echo usage : $0 lichier \ | rpeertoire exit fi if test $# -eq 0 then echo erreui : paramtre obligatoire echo usage : $0 fchier \l rpertoire exit 1r' if test -d $1 -a -r $1 then

( #empilement d'un nouvel environnement for i in $1/* do if test -d $i then $0 $i#appel rcursifcar $i est un rpertoire else

ls $i 2>/dev/null if test $? -eq 1 then echo"rpertoile vide"

echo"------contenupartiel du rpertoire$l ------_ ls -l gt I head-10 :' elif test ,f $l -a -r $1 , then i..


echo "++++ contenu partiel du fichier 91 +++++" head -10 $1 echo ":::::: rpertoire ou fichier non accessible:::::,,

done ) f*dpilement d'environnement

173

paniei i co:i;;;t"'#t$i

et

liste de noms de fichiers'admis en paramtresd'entre. Le script devra vrifier que la donnen est correcteet il en est de mme avec les fichiers.

#sh10bis: script visuaiisant les n premiresIignes (par dfaut = 5) d'une liste de fichiers # paramtres de ce script sont n et les fichiers les # else if test $# -lt 1 then echo erreur : paramtres attendus echo usage : $0 [nbrelignes] Iichier... exit 1
tl

head -$n $p 2>/dev/null if test $? -eq 1 then echo -e "\t Aucun fichier de ce nom !!!,' fi echo-e "\t $p n'est pas un fichier !!!"
{i

if (((expr $1 + 1) l>/dev/null) 2>/dev/nu11) then if test $1 -Ct 0 then #un nbre de lignes est prcis n=$1 shift else echo "erreur : nombre incorrect" echo usage : $0 [nbrelignes] fichier'.. exit 2 fi else n=5 #valeur prdfinie fi if test -z $1 then h6 "erreuf :'un liste de fichier est attendue" echousage.i $0 [nbrelignes] fichier... exit 3 t'' fi ..----- - -' ,. .. ... .,, r i-,

- .- .J-- - :.- .- - -

r ,'"

_ . -. '

-ri_:t::::

._

- : r . ir . r ' irt.: "

-!:i:--:* : - ir.;,l -1 .. - '

t,5i

fi
:i
i

Shell systry94i2y9g1gymg1ptt Panie 2 : Commandes

Exercicescorrigs

i,Poat,2 , 3!-!non4!!

DU CALCUL ARITHMETQUE
Ex e rc i c e: Ecrire un script qui indique si une donnelue partir du clavier est de type entier ou chanede caractres

;'prod=1 ! test -z $1 ,-while som='expr ido $som+ g1'


done

ii l,'i
l; l
ll

!i

prod='expr gprod \* $1' shift

Ii
gi
l'

i: I i. ,

l.r

#shl1 : script pour commencer du calcul vrifie # si la donne lu est un dcimal echo "ce script reconnat si une donne est un entier ou pas" echo "== echo -e "introduire une donne : \c" read val analyse de la-donne: \c" echo -e "...-.-...'... if ((expr $val + 1) 1> /dev/null ) 2> /dev/null then echo c\est un entier else echo c\est une chaine de caractres fi

expr gsom / gnbr'


ril.lti,i: r

gcho"Iiste traiter : gliste" ,...,;.. ' i echo"taille de cette liste = $nbr', , ,.,echo"somme de ces nombres = $som,. .: echo"produit de ces nombres.= $prod,, .: echo"moyenne de ces nombres - $-oy',

Ii

qui raliseles diverscalculsarirhmtiques t.il,.,jl.1:ril, simptes connaissance d'un premire oprande, d'un oprateur ,r;,1lf"t_tlt"t,la et oprande..on vrifiera quetesoprandes sontbel;t biendes r d'unsecond
et que les oprateurs pr-i :+,_ additifs) ,x.t (la anoT9..r: ' (oprateurs lont et la division) et %(modulo). $.grultinlication

Exercice: casepour crire un script qui admet en entre Utilisez la comman.Jc La plusieursentierset ql aeterminera leur somme,produit et moyenne. listedesentiers estde taille quelconque.

calcul arithmtique simple du style 5 + ? trois paramtres sont attendus : op.l oper op2 .#d'abord un tgst sur les paramtres if test $# -ne B echo erreur dans l\expression echo usage : $0 oprandel oprateur oprande2

#sh12 : calculons la somme, le produit, la moyenne # d'une liste de nombre donne en paramtres #hypothse ;-on ne vrifiera pas qu'il s'agit de nombres

echoattention : la multiplication est rprsentipar x -- bxit 0

liste=$@ nbr=g#

n99i!9 un calculqu!v4-19-nt xpr $t $2 $g vec


vrification pralable des oprandes
111

iill

lil Iif

ill

176

.,,

'' #puis des oprateursparmi +, ', *, I et Yo if (((expr $1 + 1) 1>idev/null) 2>/dev/null)


then if (((expr $3 + 1) l>/dev/null) then 2>/dev/null)

i. :. .

..it, :.

'^'" "i{i'i,*3;i
'/') if test $3 -eq 0 then echo erreur : divison par zro else expr $1 / $3 fi;; expr $1 % $3;; 'olo') * echoerreur : oprateurinconnu ;; ) esac

eiho "erreur : factorielle d'un nombre neatif' fact=1 n=S1 until test $n -lt t do f".t='expr gfact \* $n' i t n='expr $n - 1' done echofactorielle\($1\) = gfaci

Exerclce: Ecrire un script shell utilisant le conceptde fonction rcursivepour la factorielle calculer d'un nombre.

else echoerreur : 2d oprandenon numrique fi else non numrique echoerreur : 1er oprande
?r '

#sh15 : factorielle rcursivement # et de plus avecun sousprogr.amme (une fonctionlocale) function factorielleQ

t
if test $1 -eq0 then return I else fact='expr$Z \* tt' n+'expr $1 - 1' factorielle gn gfact #appelrcursif avecn-1 et la factorielle prcdente

I E x e rc i c e: Ecrire un script de calcul itratif de la factorielleen utilisant la de dpassentent while ou until. On ne traiterales problmes commande de capacit.

n
)

calcul de la factorielle itrativement # le paramtre doit tre un entier positif if test $#'-ne 1 '---'then - echo"erreur : fatorielle de quoi ??"
#sh14 :

:.''#programme principal echo CALCUL DE LA FACTORIELLE" -e'\t\t -*:i


.::-'. gghg - !\t\t :ri l =========================,1

r 'fi:l|.t:'_tql,:lt 0 'i - ',in ' '1,+ii;;,'

$1 t .1)1> {4"1""10" l_(((9xp1 |> /dev/null) - ;___:-el!f


"erreur : paramtre,iton nombre" QcJro ;:, i, then 1.'

*;?ffiffis

.":.. I l!.., r;:r,-(,!;

:i1,:

queI'entier est positif ou nul # on suppose fact=1


# # # # #

UTILISATEURS
: Exercice Ecrireun scriptqui, tantdonne le nom d'un utilisateur, renseignra sur I'appartenance de cet utitisateurau systmeet s'il st acttiellem"nr connect.

glvur$gEl ?ToiGue

appel de la fonction avec deux arguments : - iact tant le germe initialis t et devant contenir Ie rsultat finai la - Nbi est l'entier pour lequel on cherche calculer factorielle

#sh17:
t+ r 1+ tr

= echo -e "\t rsultat de factorielle($Nbr) $fact \n"

script vriliant si un nom d'utilisateur fait partie des utilisateurs du systme et s'il est connect au svstme

echo.e"\n\t\t
i

E x e rc i c e: ffiEilt.ript

rcursifpour le calcul de la factorielled'un nombre.

gChO -e "

RENSEIGNEMENTUTILISATEUR "
==================---------\ *rl

\t\t

Ii t.
f, l: I
l'

echo-e " \t donnez un nom d'uilisateur : \c', read nom #sh 16 : Ia factorielle rcursive #attention : ici on ne vrifie pas les erreurs sur les donnes if test $1 -eq 0 then echo 1 else' #on dcrment n n='expr $1 - 1' #on calcule n x factorielle(n -1) echo'expr $r \* $($0 $n)' # rappel : # $0 est Ie nom du Prsent scriPt ' # $1est I'argument d'appel qui vaut chaque fois Ie rsultat de I'expression n:= n - 1 # ' # do.tc Ia Commandeci.dessus est quivalente # un appel recursifdu ltYle : cat /etc/passwd I cut -f I -d ":" I grep gnom >/dev/null case$? in 0) echo 'e "\t gnom : fait partie des utilisateurs de ce systme" if who I cut -f 1 | grep gnom >/dev/null then echo -e "\t\t et il est en ce moment connect \n,, - else echo -e "\t\t mais il est absent en ce moment \n,, fi' r)'fcho -e'l\t $nom : n'est pas connu de ce systme!!! \n,,
,t

i 1l
F: t, f;

l ! ;t
t'
t'

ii
li

[':
_!

.t' it li

esac

fact(n);n * fact (n- 1)

fi

Exercice: Le script:-riie-admet deui paramtres : le nom d,un utilisateur et le nom lichier conrenanr uh txteimprimable. Il doit : !:ll ' vrifierla validit de sesparamtrei;

-- tgo

.181.

i i i . : : l : : *l :

:^ i :

iriri

et

dcider d'envoyer le fichier ra boiteauxlettres de l'utitisateur ou rJ lui afficherdirecrement sur son cransetonque |utirisa"ri .ri, actuellement connect ou paset en fonction desonetrt o'uc..piti de messages en ligneou pas.

LISTE DES PARAMETRES


: 'xercice shellpermettant script u,n I'affichage de plusieurs faons Ecrire de la Iistc effectifs. ses des iraramtres

#sh1B : script qui, tant donnun nom d'un utilisateur et d'un messagedont le contenu est dfini dans 4 un fichier donn, se proposede faire parvenir le J+ message I'utilisateur soit par envoi direct sur 1+ sa boite au lettres soit directement sur son cran #on supposeque la commandemail est accessible
I

#sh$ : sript obtention des paramtresd'un script echonom du script: $0 echonombre d\arguments d\appel : $# iftest $# -eq 0 then echoliste de paramtresvide else echoliste des paramtresobtenuspar \g* : g* echoliste desparamtres obtenuspar \g@ ; $@ echo"liste des paramtresaffichspar une bouclefor : " for i do echo-e "gi \c" i done echo"\nmme liste obtenuepar une boule while :', while test $# -ne 0 do echo-e "91 \c" shift done

echo-e "\t\t ENVOI POSTAL' eChO -e "\t\t =-=-========= \n" echo-e "\t introduire le nom du destinataire r:ead dest echo-e "\t introduire I'emplacement du paquet envoyer: \c,' read paq cal /etc/passwdI cut -f 1 -d ":,' I grep $dest>/dev/rtull case$? in 0) if ! test -f $paq then echo "ERREUR : nom de fichier incorrect" elif write gdest < $paq D/dev/null then echo "messageaffich sur l'cran de $nom" else .mail gdest < $paq D/dev/null caseg? in 0) echo "messageenvoy la boite aux lettres', L) echo "pas de boites aux lettres trouv !!" esac -1) tr ... ,, echb'TERREIIR : utilisateur inconnu d.uystme"
tt '

, ii

.! , -i
-::r'-l.r !',- :!; 'l::,:. ;\'.: i'i::i ..-i, :

. iitt . : .r:

Partie 2 : Cmnandessyslmeetprogrammatiott SlJell

E*ercices corrigs

Exercice : En recourant la commande cut et un fichier temporaire contenant crire un script shell qui construit une initialement la liste des paramtres, paramQtres de ces avant de les afficher dans cet ordre. On inverse liste supposeque la liste des paramtreseffectifs est de taille quelconque'(et donc au del de 9).

SIMULATION

MSIDOS

Exercice: Ecrire un script shell qui peut interprter les commandes internes de MS/DOS et en particulier: copy, cls, date, del, dir, exit, more, ren, time,

rype. Remarques:
#shl9bis:
4 tt

script pareil au sh19 avec plusieurs variables

if test $# -eq 0 then echo nombre de paramtres gal zro else echoliste des paramtres : echo -e u\t $t"' #construction de la liste echo $@> tmp.tmp n=$# until test $n -eq 0 do lisgs="$Iiste'cut -f$n -d" " tmp.tmp"' n='expr $n - 1' done rm -f tmp.tmp #fin constructipn echo liste inverse : echo -e "\[ $]isf,s"

Les commandes peuvent tre indiffremment introduites en minusculeou en majuscule. On devra respectergalementla syntaxe de ces commandeset leurs options,par exemple: DIR [P | /W] [chemin].

script des commandes internes de MS/DOS interpreter Q


t
I

case$1 in

lCcllLUlSsl ) . clear;; lcclloollPpltYyl) if test x$3 = :


then cp $2 $HOME/. elsecp $2 $3 fi;;

tDdllAallTtllEel) date*"Yoa%oD";; rm -f g2;; tDdltEel[LU ) =x if test x$2 tDdltliltRrl)


then ls . elsecase$2 in '7p" | '7P') if test x$3 = i then ls I more elsels $3 | more fi;; :_. jllWll | ,'/W1)if test xg3 = x then ls -: :'----elsels$3 fi;; then ls $2

fi

,, ':-.

184

t 85

,'t :.1

et
: ! i : . . -: . . . > rl , j i . -

Eiercices

,: ,:r ,:t :;. .i .

else echooption $2 inconnue


f i. .

PROCESSUS& SIGNAIIX
fd1 tii

fi;; cat $2 | more;; MmllOollRrllEel)


[Rr][Ee][Nn]) [rt][Ii][Mm][Ee]) lrtl[Yy] [Pp][Ee]) *) esac )
## function menuQ

mv $2 $3;; date *"%T";; cat $2;; echo commandeincorrect;;

Exeicice: ' j .signal par la commande kill ncessite la L'envoi d'un quelconque du numro du processus signal. On dsirecrireun script. connaissanbe connupar sonnom (paramtre d'entre vrifierau quitueun processus pralable)'

script qui tant donn ie nom du processus #sh21: lui envoie le signal SIGKILL pour le tuer # iftest $# -eq 1 then #obtenir avecps de la ligne contenanl le nonr nu='ps I grep $t' #dcouper cette ligne en plusieurs chanrps set $nu #premier champ = numro de processus kill -9 $1 else echoerreur : paramtre attendu echo usage : $0 NomProcessus fi

t
whiie true do echo-e "\tDOS>\c" reaclcommancle set $commande if test zzz$I t= zzz then case$1 in

) tEeltxxlllillTtl
fi """. done ) ## ciear echo-e-"\t\t DOS COMMANDS ' eChO -g "\t\t---===========\n" mn- l

break;; clear;
$*;; .interPreter

Exerclce : Ecrire permettant un script de dtruire un ensenrble de processus dontles noms sontpasss paramtres comme d'entre au script.

..#sh22: # ,i.
. ij ..-

script dtruisant une liste de processus dont les noms sont donns en paramtres

',r!if test $# -eq 0

186,i ;;,

FI
l:i |{ i.

Parte 2 : Comntandes systme et programmaton

Slrell

Exercces corrigs

echo usage : "$0 process..." else for i in $" do #on supposeque les sorties de ps sont de #la forme : TIME CMD PID TTY # pts/O bash 00:00:01 500 # 'cat pts/O 00:00:00 6L5 # dlimiteur "p" comme #on utilise cut avec ' #ce n'est pas fameux mais ?!! . pid='ps I grep -e $i I cut -fl -d "pu' if tesr $pid then t<ill -9 $pid else echo $i : processusinexistant . fi done
fi

then elif then

else
fi

"orrr"p1='pwd' test .d $1 if test "$1" = ".' then courant-'pwd' else courant=$1 fi echo "erreur : Auncun rpertoire de ce nom" exit 1

echo-e "\l ====== liste des rpertoires de $couranf,=====. nbrep='6nd $courant -type d -maxdepth 1 lwc -l' if test $nbrep -eq 1. then . echo "pas de sous rpertoires dans $courant', exit 2 ls else -l gcourant I grep "^d" .,,. : {i 'ii; cd $courant

-.

cho-e "\n\n\tCommande : Exercice gcrire un script qui affiche le nom de chaquesousrpertoireappartenant :. for dir in * (par dfautle rpertoire courant)puis lit donnen paramtre au rpertoire +r do au terminal'une commandequ'on excuterasous le sous-rpertoire r;' iftest -d $dir lorsqu'elleest valide,ne doit pas affich.L'excutionde la commande, .:.: then (par un CTRL-C) treinterrompue .,i:, echo -n "$dir => " .; trap 'clear ; exit' 2 :. read cmde #sh23 : script qui affiche le nom de chaque sous rpertoire ', case $cmdein (par dfaut # appartenant au rpertoire donn en paramtre rrt\ ij , '' # il s'agira du rpertoire courant) puis excute dans ces sous' tt cho " ,r qui au terminal introduite sera une commande rpertoires =# .i i i ti t t

excuter, e)uitter, ?)help:\n"

if test $# -gt 1 then echoI'erreur: trop de paramtres" test elif $#.eq 0


t88

''
,.!

:' taql)
clear

exit 0

_: ',,,-.. 189

Partie 2 : Commandes

.. :l:r)'1;r

et Dro.

Shell

Exercices

? l lHhl[Ee][Ll]tPpl)
echo "ce script vous facilite la ralisation" echo "d'unecommandeque vous saisissez " echo "sur un rpertoire qui vous sera prcis" echo "parmi ceux du rpertoire courant ou" echo " celui que vous allez donn en paramtre" exit 3 t; ") if trap : 2 ; eval $cmde $dir b/dev/null then echo "\n" else echo"erreur : commandeinconnueou errone" fi
esac
fi

COMMANDE EVAL
,:':".. Exercice:,::-lri',Ecrire ur1 script.Qui affiche.-ses paramtres donnes dans|ordre inverse .d!-]l].1_ipl..rl,i:i..On. utitisera r,i pour cela w rc - j _r . la 1 4 commande u u ri l Illanqe i . . . 1 : v s r . eval e val et e t O on n au prarable construir ra risteinverse. on suppose que Ie nomure a. ,paramtres effectifs ne dpasse pasla valeur9. ;..1j

#sh19: affichagedes arguments dans l,ordreinverse de leur # apparition lors de I'apoel . on utilisera la commanaeelri en construisant # # une commandeechoavecles paramtres inverss #attention: ne fonctionneque partiellement cause # du nombrede paramtres formels rcjuits g if test $# -eq 0 then echopas d\arguments else echo-e "liste des arguments :',
gChO -g tr================,,

done

echo-e "\t $@" #construction de la commande echo corPt=$g cme="echo -e \u\t " while test gcompt-gt 0 do cmde="$cmde\ggcompt " compt='expr$compt - 1. done cmde="$cmde \"" #fin de la construction echo-e "liste des atguments dans l,ordre inverse :,, evali$cmde
gChO _e r'===:==============:rtrtl=======
t ..:. :'l-:' : :.'-..:.'.t:.:;:..i .. -1.':...r:1,::::l-11 '-"

r. . .

, -.

. . _ . -. . : : : : -_ -

--

2 : Commandes systme et prograrnmation Shell

E-rercices corripo

2: Conmandes

Shell

Exercices

RECHERCHE DE FICHIERS PAR FIND


rcice: de facilitef I'utilisation de la commande ire un script shell permettant prsenter un menu I'utilisateur de est pour choisirquel l. L'objectif partird'un rpertoire ,ede recherche il voudraraliser donne. de la listedesfichiersordinaires, affichage : affichage de la liste .emple un utilisateur donn, etc. s fichiersappartenant echo -e ">>>>>>REPERTOIRE INCONNU <<<<<\n" exit 1 fi menu ecbo-e "\n\t\tChoisir parmi : \c"; read choix case$choix in 0) exit;; r) find gdir -type d -print;; 2) find gdir \( .type f -o -rype I \) -print;; 3) frnd $dir \( -type c -o -type b -o rype p -o -rype s\) 4) echo -e "\ttaille min en octets : \c',; read min min='expr gmin / 512' echo -e "\ttaille max en octets : \c,'; read max max= expr $max | 512'; max='expr $max + l' find $dir \( -size +$min -a -size -gmax \) -prinr 5) echo -e "\tnom de I'utilisateur: \c',; read nom find gdir -user gnom -print
tt

-script findl qui affche une liste de fichiers I selon les besoins de l'utilisateur exprims par un choix dans un menu I menuQ

t
echo -e':\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t echo -e "\t\t ) rvhile true do

0) quitter" 1) sous rpertoires de $dir" 2) liste des fichiers ordinaires de $dir" 3) liste des fichiers spciaux de $dir" 4) fichiers de $dir ayant une taille donne" 5) fichiers appartenant un utilisateur donn" 6) frchiers rcemment mis jour" 7) fichiers rcemment accds" 8) fichiers rcemment crs' 9) fichiers ayant des droits d'accsparticuliers"

6) echo -e "\tnombre de jours : \c"; read nbjour find gdir -mtime -$nbjour -print
t)

7) echo -e "\tnombre de jours : \c"; rea{, nbjour find gdir -atime -gnbjour -print ,, 8) echo -e "\tnombre de jours : \c"; read nbjour find gdtime -$nbjour -print 9) echo -e "\tpermission d'accs: \c"; read droit find gdir -perm -gdroit -print

gChO - g n\n==========:==========================r'

trap 'clear; exil' 2 3 . traiter : \c"; read dir egho-e "Rpertoire if test 'l$dir' = r!'rr then dii-'pwd'. -- -elif test-d $dir then:
t>z

*) echo-e "\n>i>> ERREIJR atnS l sisie ! <<<<\n"


lr "

,,
' ' -_

193--.;-.,+
. -:: '::., -.':,'
-_r: --r_: -r --. : . ji: ji. . . -: . j: : , .

,;,. , :, .1,

la liste desfichiersde taille nulleet shellqui va traquer ffiG1"ript en place. Le scriptattendun paramtre en est mis suto uit le c"ux dont rpertoire d'un du chemin la spcification qui doit corresponclre. entre absent, est il paramtre Si ce va treopre. purti. aiqu.f la recherche courant. rPertoire du s'ag.t

Exercice :

t, arborescence de racine le nomd'un rpertoire et appartenant un groupe ''d'utilisateurs donn, et qui vouspropose au travers d'un menu soiideles dtruire deiles ou de lesarchiver. afficher,
t

#script find2 traquant les fichiers de taille nulle ' et de SUID'BiI mis en Place # if test $# 'gt 1 then echo erreur : troP de Paramtres echousage: $0 lPath] exit 1 fi echo${1:-'pwd'} 1>/dev/nullD/dev/null echo$1 echo "liste des fichiers de taille nulle"
g 6| 6 tt === = ====--==============tr

#script lind3 qui cherche tous les fichiers appartenant un T groupedonn et qui excuteune commandeparmi une JI liste donne dans un menu r function menuordre Q I (
gglg

tt======================

t'

echo" echo" , echo" " i!'cho echo-n " )

A)rchiver D)truire L)ister Q)uitter votre choix : "

nbre='find $1 'size 0 lwc 'l' find $1 -size0 TOTAL = $nbre \n" echo -e "\n))))))>> echo "liste des fichiers avec SUID'BiI=1"
tt g f g ==== ======================

clear echo -n "nom du groupe : " l,readgiroupe\


:. ,

i if ! grep "^$groupe:" /etc/group l>/dev/null 2>/dev/null '.then echo"erreur : nom du groupe erron !!!" exit 1
II

nbre='find g1 -perm +4100 | wc'l' find $1 -perm +4100 echo -er1\n))>)))>>> . TOTAL = $nbre \n"...i :.:.

-t::

.n "rpertoire de recherche : " ,',echo

-i rpertoire inexisant ou inaccesible"


i iit: ir::

:::''*-:+:

'.

i.i r:.;::j:.

'i::lrf!..r.(fi: :;-:.1

,r".il: .

menuordre read choix case $choix in [Aa]) echo -n "nom de I'archive : "; read archive find $dossier -goup $groupe I cpio -ocvB > $archive
,t

&EgEEHqpreMormsFnGp
: Exercice rcrirg un script utirisantra.-commande grep qui affiche res donnes connues compltes propos d'un utilisateui. i" ,"ript sig'ateraaJ p, .l en question I'utilisateur possde ou pasun mot de passe et si son uID et GID sontvalides.

tDd]) find $dossier -group $groupe 'exec rm 'f 0 \;


,t

[Ll]) find $dossier.group $groupe-print *) echo "erreur con'rmandeinconnu" ; exit 3 esac


tt

#script gp1 cherchant si un utilisateur est connu du systme et si oui affiche ses donnescaractristiques prsentes 4 dans le fichier /etc/passwd savoircor, D, -CfO, -...
t

#attention : doit galementindiquer si l'utilisateur a ou non # un mot de passe et renseignesur la validit de U et # GID
'-:lti;i '"f,,ttclear

if test g# -ne 1 then echo erreur: un paramtres est attendu .,,r .. echo usage : $0 nom_utilisateur exit I -,fi
.;r;.gggp=$l ' :'i .a:-?i'

j'l
x-r

ll

ll

,!i,1sg='grp "^$user:',/etc/passwd., ,, if ! test -z $res then IFS=: , 't; set-$res j ,r echo "infos de $user: " echo.l' UID=$3, GID=$a,. HOME=$6,j,SHELL=$ 2,, if test - z$2 1 then

echo" !!!!ATIENTION: pasde mot de psse,,

I'i
196

tl

l!,I

f!:1 it !

t9't

.1,'l:

Shell

Exerclccs

case$3 in *[!0-9]*) echc " !!!!IATTENTION: UID non valid.e" esac case$4 in *[!0-9]*)echo" !!!!!ATTENTION: GID non valide" ;; esac else ,
I

else TT

echo$ligneItr"""1n" echopas dYentre pour le groupe$grp

a.
i.,

r.:,: ril.,i,

'ti.i:

eSaCi

, . ' d on
: , ii-.,Exerclce *:l,iEr.ir.unscriptutilisant Ia commande grepqui prend comme paramtrcs nomsde groupes rrste.de une et qui affiche la listede sesmembres et les qui lesconcernent. l, informations

echo"utilisateur Snom: inconnu"

Ex e rc i c e: Ecrire un script utilisant la commandegrep qui affiche les infomrarions relatives tous les utilisateursconnus d'un groupe identifi par leur n u m ro .

#scriptgrepS qui pend la liste des utilisateurs cl'unsr.ouDe dont le nom est un paramtre donne*et ,:;1;,# qui affiche leurs informations respectives ,# :i.then i: echoerreur : paramtres attendus echo usage : g0 nom_groupe... fil'

#script grep2 affiche les informations concernant tous les # utilisateurs d'un mme groupe if test $# -eq 0 then echoerreur: paramtresattendus echousage: $0 goupeld... exit 1 fi for grp do

,,::iftest$# -eq 0

r,t'

exit 1
ll t

for g.p

i
':,lill1

g|tg r'======--===

tfaitgmgnt

caseggrp in *[!0-9]*)echo-$grp n\lest pas un nombre, ;; r*)-lige='grp I'l [^:]*:[^:]*:[^:]*:$gtp:"/etc/passwd'

de $gfp ==============r'

,"$iljl ''::i;ll' :,11'rif


.'\il ri .r,:iii ,j.:U.,,r,
,ti l ;i !

ggfig=--====== ll2ilgment de $grp ==---======= membre='grep "^ggrp:" /etclgroup lcut _f4 _d:.

test -z "$membre" ,.then . echoliste des membresrduite priori ggrp if grep "^$grp:" /etc/passwd ..: i . ,: thbn $.
i .:. _ -!_.. _-L!_...

.' elde . : -. . -.:. - . . . .

':J

i' -: ' irr/ l' t : ' -1

-i

2: Commandes

'' .

Exercices

echo $grp non utilisateur de ce systme Fr else echo liste des menbres du groupe $grp : $membre IFS=, set $membre while test -n "$1" do grep "^$1" /etc/Passwd shift done

LE TRANSFORMATEUR DE TEXTE AWK

fi
done

.:f system("clear") contenudu frchier: ", ARGVII] ii print "

,;i.print "=No= =======contenu de Ia ligne====

ti,)

de slection particulire pour les actions qui suivent F:#et qui concernent chaque ligne du fichier pass en paramtre

1i{

t
I

I !

Fxercice: i:ii Ecrireun scriptawk qui utiliseles variables prdfinieS pour afficherdes : du fichier/etc/passwd. -;.champsparticuliers
1t

ii, l'l
ll

r;. rx

! It

,;,: ,1#scrjpt.f2.awk qui renseigne prrlpos des champs UID et GID du fichier /etc/passwd 'ii# : '#F$='tttr#field separator"

?rBEGIN{

l 4!

200 \
lri

print "\t le : ",.strftiefl%D)

"'

iti"i
,,

t'=====i56ut='-= ==========================r'

END{
print "\n\t\t\t
I

$$$$ TOTAL = ", compteur

'.1

#rien { = \t UID = ",$3, " \t GID = "'' $4 irint "username " , $1," ) END{ i

.t : Exercice les factorielles Ecrire un script awk qui calcule itrativenrent cle l6 et qui afficheraleur rsultat. entiers prenriers

pf inf "==-========----===================f1n====tt l

#script f4,arvk affichant les 16 premires valeurs de la factorielle (je ne sais si on perrt # aller plus loin !l) #

: Exercice UID et GID surla validitdeschamps ..ir.in ,"ript awk qui renseigne trouves' erreurs des total le qui affiche u fichier/etc/passrvdet

de la validit prop-os#scriptf3.awk qui renseigne /etc/passwd fichier du UID .t CtO deschamps # BEGINT FS=":" #field separator" compteur=0 valiit de UID et GID dans le fichier/etc/passwd" ;;l;;';= ) ligne du fichier/etc/pasrvrvd no 3 et 4 de chaque #leschamps le #doiventne contenirque deschiffressinon on incrmente un fois chaque d" ,,o-u.e a urreur et on affche #;;;;;;;; approPri #message
, j.lil

BEGIN { FactN_1=1 print "n \t factorielle(n)" print "0", "\t\t", FactN_1 for (i=1;i<-tS; i++; 1 FactN= i * FactN_l print i, "\t\t". FactN FactN_1=FactN

I
I
I

#comme ctp n'estque du calcul (!) il n'l'a pas lieu de donner pour la selectioncouranterelative une iigne #une expr',ession #d'un fichier traiter (n'estce pas ???) et il en de mmepour #une partie introduire par END. #Iout celamontre qu'enfait awk esl un langage assez expressif #et qu'onpeut imaginer I'utiliser autrelrent quepour traiter #desfichiers

?cie

2 : Conarcndes $'s\ne et progrannation

Shell

E-rercicescorri-s-

',

Erercice: tableaupour afficlrer awk utilisant la stntcturede donnes ffil"ript I'ordre inverse de leur dans par ligne ligne le contenu d'un fichier initiale. apparitipn

NR = nb de lignes du fichier (Number of Row) BEGIN { print "$rvc" ARGV[1] nbli9=6 nbnrot=0 nbcar=0

#script f5.awk utilisant des tableaux affiche le contenu du fichier dans I'orclreinverse # BEGIN { print "\t\taffichage inverse du contenu de : ",ARGV[l] print'\f, \[======AVANT:-==================="

l
{ nblig=nblio+ 1 + split($O, nbmot=nbmot t, " ") + length(90)+ I nbcar=nbcar l END i prrint"\tNombr.ede lignes : \t", nblig print "\tNombre de mots : \t", nbmot print "\tNonrbre de caractres: \t',, nbcar I

l
lrien { l END { print o\g\l===-===-APRES========= ==============" for(i:NR;i>0; i-') { print "< ",lignes[i] ] print -\1\t======================= ==============" Print "t ",$0 lignes[NR]=$0

. i:i :rl

l
Exercice: ivc awk qui ralise les mme calculs que la commande Fit=-*.-r"ript en fichier) d'un lignes et mots (comprage du nombr <te caractres, variables aux recourir de et en split, vitant length, titisantles fonctions prdfinies NF et NR.

Erercice: Ecrire un scriPt awk qui aft'ichepour chaque li-sne du fichier traiter la somnlede ses chanrpsnumriqueset en fin du parcou,Ts le total de ces

4 t

#script ff-arvk qui calcule Ia sommecleslignes d'un fichier dont les clonnes sont des entiers

#qcliltt f6.awk gui compte le nombr de caractres' mots et ligne d'un ' "'# du-n[ier donii en paramtre NF et #attention: on'n'utilisera pas les variables prclfinies ,;,. $iR '1-1 * NF = nb de mots par ligne clu fichier (Numbel of Fielcls)
1;

;fi].BEcrNI
[ -+-..--- -

prmt

===========================,,

l!] ia: t'

Li
20-l

' 205

NR>o && NF*>o {


somParligne=O split($O,ligne, " ") i=1 do { somParligne+=ligne[i] totalgeneral+=$i i++ ) while (i<=NF) print "<"somParligne">\t", $0 ) END {
print tt========================================tl

: Exerclce Ecrireun script awk qui tantdonnun nom de fichier et un motif donn, te fichier ligne par ligne pour indiquersi le motif en question y est rscrute prsentou plts.

print " )

Total Gnral= ", totalgeneral #script f9.awk de recherched'un motif dansun lchier

: Exercice dans contenuS desnombres E"rirc un scriptarvkqui affrchela moyenne encolonnes' du scriptet prsents d'entre un frchierparamtre

BEGIN { printf("motif rechercher: "); getline motif printf("fichier concern : "); getline fichier ) { getline< frchier if ($0==""; exit else{ print $0 idx=index($0,motif) if(idx==Q) printf("\t\>non trouv") else printf("\t\>>trouv I'indice: %d", iclx) ) ) END { plint "============ bientt =============,1 )

#script f8.awk qui affiche la moyennedes nombres BEGIN { if (ARGC-l==O){print "Aucun fichier de ce nom !!!" ; exit} else print "contenude fichier : ", ARGV[1] ) { split($O, champ,FS) for(i=1; i<=NF; i++) { printf("\t %s",champ[i]) T[i]+=champ[i] ) Printf(t'1t'1 )

:-:!--:T

i:-

etprogrammationShell systme Pane 2 : Commandes

Exerclces corrigs

Ecercice: Ecrire un script awk qui affiche toutes les occurrencesd'un motif donn dansun fichier donn. rechercher

if (idnx=-O) break else ligne=substr(ligne,idnx+ 1,len gth(ligne) -length(motif)) #indiquer le rsultat de la recherche dumotif pour #la ligne courante if (idx[l]!=0) { print ,'trouv >>. for(-1 j<i- 1j+-r) printf(,,\t\>%d,,,idx[il) ) else print "non trouv !!,'
I
I

#script f10.awk de recherchede toutes les occurrences d'un motif dans un fichier # # on supposeque le fichier ne contient pas de lignes vides # BEGIN { printf("motif rechercher : ");getline motif printf("nom du fichier : "); getline frchier printf("\n==========fl {!gg-==============\n ") ).. getline < fichier #cette fonction lit une ligne partir d'un lichier #par hypothse: elle ne doit pas tre vide pour raliser une recherche de motif
1

) END { print "==--========fiI}===============-===ri

a .! : :l

if (90=="') exit else { #affrcher la ligne traiter print $0 for(i=l;i<=leneth($0);i*) printf('-"); printf("\n") : #chercherdans la ligne courante toutes les occurrences #du motif dsir (on utilise pour cela la fonction indexQ #et la fonction substrQ ligne=$o; idx[O]=Q; i=l for(;){ idnx=index0igne,motif) ir[i] =id:1i'1l+idnx; i++ ,

i,: !i
'i i: ri rl

.i

t_t i: ;'l
ir !

ili ;i:
! l;

I l: 'fh

il: I t\
i

i tt lx,

i:l;

; li I

i :t
:I lr ['1 L
'l

l ; _. ,
t'

1:

'i

208

209

ti.;:

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