.1' :'iii :E
. Exercices coriip s
VARI BLES ET EII\IIRONNEMENT
Exercice :
ffir u*ir visualis le r sultat de la commande env (diverses valeurs de
variables pn d finies), crire un script shell qui en affiche certains ainsi
quccelles rclatives au script et ses arguments.
#sh1: script.affrchant Ia valeur de plusieurs
ffuariablesp d finies de I'environnement et du shell
echo directory home : $HOME
echo user bgname : $LOGNAME
echo my mailbox: $MAIL
echo path value : $PATH
echo shell courmands : $SHELL
echo terminal type : $TERM
echo script name : g0
echo scriptpid: $$
echo arguq ts number : ffi.
echolst of4rguments : g*
I
t
I
Exercice:
Ecrire un sc"ffl>hell manipulant les quotes (simple, double et anti).
#sh2 : script nanipul nt
les guotes
var=exemple
echo contermde var : $var
echo "contenu de var : gvar"
echo'contenu de var: $var'
ech ci enf-JYexemple type de l\apostrophe
echo "ceci est I'exemple type de I'apostrophel
r65
.'"r,-
", Parte 2': Commaides
Exercice:
Ecrire un script shell affichant la liste
indiquant chaque fois sa classe
des caract res sp ciaux en
#sh 3 : liste deb''caraci res sp ciaux du shell
echo les caract res sp ciaux sont :
\)"
echo -e "\t les diff rentes quottes : \( \" \'\'
echo -e "\t les parenth ses et assimil s \( \[ \]
echo -e "\t les symboles de ponctuations : \( \' \: \; \)".
echo -e "\t les op rateurs arithm tiques: \( \+ \' \* \/ \% \)"
echo -e "\t les comparateurs : \( \> \< \= \! \ | \& \)"
echo -e "\t les symboles sp ciaux : \( \\
\? \@ \$ \- \)"
\) \( \{ \} \)"
Exercice :
Ecrire un script Utilisant, diverses possibilit s pour a{ficher le contenu
d'une variable et affecter son contenu'
:
#sh4 : I'affectation
varO="" ; echo varO : $varO
varl=chaine ; echo varl : $var1
var2="une chaine" ;echo var 2 : "o^-
,na1g=gvar1 ; echo var3 : $var3
echo "variable non affeit e" ; echo var : $var
echo "var est une chaiue vide" ; var=""
var4-${var:valeurl} ; echo var4 : $var4 ; echo var : $var
varS-$tvar;+valeur2) ; echo varS : $var5 ; echo var: $var
var6-${var:-valeur3} ; e ho var6 : $var6; echo var: $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; echo var: $var
varS=g{var :+vai.eur2} ;-ech varS i $var5 ; echo v r : $var
var6=${var :-valeurS},; echo var6 : $var6; echo var: $var
; jii;i, ; : :il,*!iii-,i::' t;.,;
..1
, .;. ,
;t.:r..i;::;1
Shell
E-terciecs co
FICHIERS ET REPERTOIRES
Exercice :
Ecrire un- script qui adnret un unique paranr tre optionnel devanl
le r pertoire
indiqu , si celui_ci est valide.
Idans
rers qui sont inclus
#sh5 : script affichant la liste des fichiers
#
#
#
inclus dans le r pertoire clonn en paranr tre
il s'agira dlr r pertoire coul.ant si pls cle paranr tres
il s'agira d'une er.r.errr si pir_rsieur.s paraur tres
if test $# -gt, I
theu
echo errent ; tlop cle pat.am tres
echo "us.age- : $PWD/$O "
elif test S# -eq 0
then
echo contenr.r clu t per.toir.e conrant :
l" $r
clif tcst -d $1
tl'ren
echo contentr du r. pertoire $l
ls -l $1
elsc
fi
echo errenr : $1 nYc'st pas ul.r r pertoire
echo "rrsage : $PWD/$0 "
rrI
I
Erercice :
Ecrire un script qui adnret la sp cilication d'un
paranr tre et qui affichera pour chaque fichier qu'il
Un total par tyPe de t'ichiers sera galenrent affich .
r pertoire conlme
renfernre son type.
nbficSpc='expr $nbficspc + l.
echo gi inconntr
else
fi
done
#sh6:
4
t
4
r
script affichant Ie type de chaque fichier
appartenant au r pertoire pass en paranr tle
ainsi que Ie total par cat gorie trcuv
iftest $# -ne 1
then
echo erreur : un llaram tre est atlendtt
echo "usage : $P!VD/$O directory"
elif tesr -d $1
then
nbficOrd=0
nbficReP=g
nbficSpc=0
cd $1
fori in*
do
iftest -d $i
ihen
echo $i est ttn fichier r pertoire
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 Lrn fichier sP cial
l o8
echo nombre total de t chier. r. per.toire : gnbficRen
echo nombre total de fichier ordinaire : $nbficOrd
echo norubre total de fichier sp ciaux : gnbficSpc
else
echo gl nYest pas un r per0oire
II
Exercice :
Ecrire un script qui affiche ra risre des sous r pertoires d'un ou prusieurs
1 9e1oir91 qa_ss s en paranr tres, ainsi que leui toral. On testera' .tuqr.
fois la validit du r pertoire pass en paiam tre.
#sh7 i script lisiant les sous.r pertoires du (des) r pertoire(s)
#
pass s en param tre d'appel ainsi que leur t tal ge" ih
p1p=.pwd.
if test $# -eq 0
then
echo erreur : paranr tres manquants
echo "usage : gPWD/gO directory...,f
-
else
for i in g*
do
echo
if ! test -d gi
then
echo erreur:
$i n\est pas un r pertoire
else
cd $i
Total=0
':,.; ''
Pan e2:Commandesstsi meaPio |ammatlonShell!Exerclcescorrlg s
:r!:-''::
':-;':
,-,ll]5l
I I ' utho liste des sous-r pertoires de $i :
--
-l-'.r,
forj in *
<io
if test 'd $j
then
, ,
,
I
fi
echo $j
rl,otal='expr $Total + 1'
clone
echo "Total = $Total"
done
cd $DIR : restibution du chemin initial
echo --------'
Exercice :
En recourant Ia commande find crire un script r pondant aux besoins
;ufn"f,ug" de la liste des sous r pertoires soit d r pertoire courant si
aucun Daram tre n'est pr cis ou du r pertoire donn en param tre'
#shS : pareil que sh?
#
ii.t. d., sous-r pertoires de celui pass en param tre
if test $# -gl 1
tl'ren
echo erreur : nombre de param tres importants
echo usage : $O ldirectorY]
else
if test $# 'eq 0
then
d.osbier=;-
#r- p rt ir cotirant,
else
.
dossier=$1 #r pertoire pass en param tre
"
t e 2 i Commandes
fi
find $dossier -type d -print
i
Exercic :
Ecrire un script r cursif qui affiche le contenu d'un r pertoire pass en
param tre dont la sp cification de clremin doit au pr alable tre valid e.
:
r, #sh9 : script affichant r cursivement le contenu
d'un r pertoire pass en param tre
#
if test $# -ne 1
then
echo erreur
echo "usage
exit
tr
if ! test -d $1
then
un seul argument est u cessaire
$0 directory"
echo erreur
echo "usage
$1 nYest pas un r pertoire
$0 directorv"
Publicité
else
echo "" i
echo "----i'----.--.--
for j in 1t'* --
do
"'
r pertoire : $t --------.------
iftesr -d $j
then
traitement du sous r pertoire
$0 $j
, # appel r cursif
else
eciro $j
done
Parlie 2 : Commandes syst me et Programmat on Sh;U
Exelcices'corrig E
;:'.:ti i;portit z t Co m ma n d es
Shell
Exercices
Exercice:
Ecrire un script qui utilise les d finitions d'environnements que I'on peut
empiler et d piler moyennant le parenth sage pour afficher r cursivement
.le contenu d'un r pertoire pass en param tre
t$crire un script qui admet en
ordinaire ou r pertoire. (sinon il
r sultat ses l0 premi res lignes.
entr e un param tre de type fichier
s'agit d'une erreur) et affiche comme
#shgbis: script affichant r cursivement le contenu
d'1rn r pertoire pasS en param tres
#
#nota : agit comme ls -R
J+
on utilise pour chaque sous r pertoire un
environnement d'ex cution qui lui est propre
et obtenu par les fameuses parenth ses !
J1
t
11
eChO -e'r\n\n=:=d bUt=---========
if test -d $1
then
$
(
#empilement d'un nouvel environnement
for i in $1/*
do
if test -d $i
then $0 $i#appel r cursifcar $i est un r pertoire
else
ls $i 2>/dev/null
if test $? -eq 1
then echo "r pertoile vide"
done
)
f*d pilement d'environnement
#sh 10 :
script visualisant les 10 premi res lignes du
contenu d'un fichier ou d'un r pertoire pass en
param tre
if test $# -gt I
then
echo erreur: trop de param tres
echo usage : $0 lichier \ | r peertoire
exit
fi
if test $# -eq 0
then
echo erreui : param tre obligatoire
echo usage : $0 f chier \l r pertoire
exit
1r'
if test -d $1 -a -r $1
then
i..
echo "------ contenu partiel du r pertoire $l ------_
ls -l gt I head -10
:' elif test ,f $l -a -r $1
, then
echo "++++ contenu partiel du fichier 91 +++++"
he ad -10 $1
echo ":::::: r pertoire ou fichier non accessible :::::,,
173
p a n i e i i co:i;;;t"'#t$i
et
liste de noms de fichiers'admis en param tres d'entr e. Le script devra
v rifier que la donn e n est correcte et il en est de m me avec les fichiers.
#sh10bis : script visuaiisant les n premi res Iignes
(par d faut = 5) d'une liste de fichiers
#
les param tres de ce script sont n et les fichiers
#
if test $# -lt 1
then
echo erreur : param tres attendus
echo usage : $0 Iichier...
exit 1
tl
if (((expr $1 + 1) l>/dev/null) 2>/dev/nu11)
then
if test $1 -Ct 0
then #un nbre de lignes est pr cis
n=$1
shift
else
fi
echo "erreur : nombre incorrect"
echo usage : $0 fichier'..
exit 2
else
fi
n=5 #valeur pr d finie
if test -z $1
then
h6 "erreuf :'un liste de fichier est attendue"
echo usage.i $0 fichier...
exit 3
fi
..----- - -'
t''
,.
.. .. . ., , r i-,
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 !!!"
else
{i
r ,'"
- .-.J- - -:.- .-- -
I
_
. -.
'
-ri _:t::::
._
- :r.ir.
-!:i:- -:* :
- ir .;,l -1 .. -'
'ir. " r
t:
t,5i
fi
:i
i
Panie 2 : Commandes syst ry94i2y9g1gymg1ptt Shell
Exercices corrig s
i,Poat,2 , 3!-!non4!!
DU CALCUL ARITHMETQUE
Exercice :
Ecrire un script qui indique si une donn e lue partir du clavier est de
type entier ou cha ne de caract res
#shl1 :
#
script pour commencer du calcul
v rifie si la donn e lu est un d cimal
echo "ce script reconna t si une donn e est un entier ou pas"
echo "==
echo -e "introduire une donn e : \c"
read val
echo -e "...-.-...'... analyse de la-donn e : \c"
if ((expr $val + 1) 1> /dev/null ) 2> /dev/null
then
echo c\est un entier
else
fi
echo c\est une chaine de caract res
;'prod=1
,-while ! test -z $1
ido
som='expr $som + g1'
prod='expr gprod \* $1'
shift
done
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',
qui r alise les divers calculs arirhm tiques simptes
t.il,. ,jl.1:ril,
,r ;,1lf"t_tlt"t,la connaissance d'un premi re op rande, d'un op rateur et
r d'un second op rande..on v rifiera que tes op randes sont bel;t bien des
et que les op rateurs
p r-i :+,_ (op rateurs additifs) ,x.t (la
anoT9..r:
'
$.grultinlication et la division) et %(modulo).
lont
Exercice:
Utilisez la comman.Jc case pour crire un script qui admet en entr e
plusieurs entiers et q l aeterminera leur somme, produit et moyenne. La
liste des entiers est de taille quelconque.
#sh12 : calculons la somme, le produit, la moyenne
d'une liste de nombre donn e en param tres
#
#hypoth se ;-on ne v rifiera pas qu'il s'agit de nombres
liste=$@
nbr=g#
calcul arithm tique simple du style 5 + ?
trois param tres sont attendus : op.l oper op2
.#d'abord un tgst sur les param tres
if test $# -ne B
echo erreur dans l\expression
echo usage : $0 op randel op rateur op rande2
echo attention : la multiplication est r pr senti par x
-- bxit 0
n99i!9 un calcul qu!v4-19-nt xpr $t $2 $g
vec v rification pr alable des op randes
176
-
111
ll
!i
ii
l,'i
l;l
l.r
i:
I
i.
,
Iil'gi
Ii
i l l
lil
Iif
iill
.,,
.
i. :.
.. it, :.
#puis des op rateurs parmi '' +, ', *, I et Yo
if (((expr $1 + 1) 1>idev/null) 2>/dev/null)
then
if (((expr $3 + 1) l>/dev/null) 2>/dev/null)
then '^'" "i {i'i,*3;i
'/') if test $3 -eq 0
then
echo erreur : divison par z ro
else
fi;;
Publicité
expr $1 / $3
'olo') expr $1 % $3;;
*
) echo erreur : op rateur inconnu ;;
esac
echo erreur : 2d op rande non num rique
else
fi
else
echo erreur : 1er op rande non num rique
?r
'
Exercice :
Ecrire un script de calcul it ratif de
commande while ou until. On ne traitera
de capacit .
I
la factorielle en utilisant la
les probl mes de d passentent
#sh14 :
#
if test $#'-ne 1
calcul de la factorielle it rativement
le param tre doit tre un entier positif
'---'then - echo "erreur : fa torielle de quoi ??"
- ;___:-el!f l_(((9xp1 $1 t .1) 1> {4 "1""10" |> /dev/null)
;:, i, then 1.' QcJro "erreur : param tre,iton nombre"
.
r 'fi:l|.t:'_tql,:lt 0 'i - ',in ' '1,+ii;;,'
*;?ffiffis
eiho "erreur : factorielle d'un nombre n eatif'
fact=1
n=S1
until test $n -lt t
do
i
t
f".t='expr gfact \* $n'
n='expr $n - 1'
done
echo factorielle\($1\) = gfaci
Exerclce :
Ecrire un script shell utilisant le concept de fonction r cursive pour
calculer la factorielle d'un nombre.
#sh15 : factorielle r cursivement
#
et de plus avec un sous progr.amme (une fonction locale)
function factorielleQ
t
if test $1 -eq 0
then
return I
else
fact='expr $Z \* tt'
n+'expr $1 - 1'
factorielle gn gfact
#appel r cursif avec n-1 et la factorielle pr c dente
n
)
:.'' #programme principal
-*:i echo -e'\t\t CALCUL DE LA FACTORIELLE"
.::-'. gghg
:ri l
=========================,1
- !\t\t
.":.. I l!..,
r;:r,-(,!;
:i1,::
e
on suppose que I'entier est positif ou nul
UTILISATEURS
fact=1
?ToiGue glvur $gEl
appel de la fonction avec deux arguments :
- iact tant le germe initialis t et devant contenir
#
- Nbi est l'entier pour lequel on cherche calculer la
#
Ie r sultat finai
factorielle
echo -e "\t r sultat de factorielle($Nbr) = $fact \n"
Exercice :
ffiEilt.ript
r cursif pour le calcul de la factorielle d'un nombre.
#sh 16 : Ia factorielle r cursive
#attention : ici on ne v rifie pas les erreurs sur les donn es
if test $1 -eq 0
then
echo 1
else'
#on d cr ment n
n='expr $1 - 1'
#on calcule n x factorielle(n -1)
echo'expr $r \* $($0 $n)'
rappel :
#
#
#
$0 est Ie nom du Pr sent scriPt
$1est I'argument d'appel qui vaut chaque fois
Ie r sultat de I'expression n:= n - 1
' # do.tc Ia Commande ci.dessus est quivalente
un appel recursifdu ltYle :
fact(n);n * fact (n- 1)
'
fi
i
Ii
t.
f,
l :
I
l'
i
1l
F:
t,
f;
l!
;t
t'
t'
ii
[':
li
_!
.t'
it
li
Exercice :
Ecrire un script qui, tant donn e le nom d'un utilisateur, renseign ra sur
I'appartenance de cet utitisateur au syst me et s'il st acttiellem"nr
connect .
#sh 17 :
t+r
1+tr
script v riliant si un nom d'utilisateur
fait partie des utilisateurs du syst me
et s'il est connect au svst me
echo.e "\n\t\t RENSEIGNEMENT UTILISATEUR "
gChO -e "
\ *rl
==================----------
\t\t
echo -e " \t donnez un nom d'uilisateur : \c',
read nom
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 syst me"
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 syst me !!! \n,,
,t
esac
Exercice:
Le script: - riie-admet deui param tres : le nom d,un
nom
lichier conrenanr uh t xte imprimable. Il doit :
'
!:ll
v rifierla validit de ses param trei;
utilisateur et le
-- tgo
.1 81 .
i i i.::l ::*l:
:^ i :
iriri
et
d cider d'envoyer le fichier ra boite aux lettres de l'utitisateur ou rJ
lui afficher direcrement sur son cran seton que |utirisa"ri .ri,
actuellement connect ou pas et en fonction de son etrt o'uc..pi t i
de messages en ligne ou pas.
I
4
#sh1B : script qui, tant donn un nom d'un utilisateur
et d'un message dont le contenu est d fini dans
un fichier donn , se propose de faire parvenir le
message I'utilisateur soit par envoi direct sur
sa boite au lettres soit directement sur son cran
1+
J+
suppose que la commande mail est accessible
#on
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/passwd I cut -f 1 -d ":,' I grep $dest >/dev/rtull
case $? in
0)
if ! test -f $paq
then echo "ERREUR : nom de fichier incorrect"
elif
then echo "message affich sur l' cran de $nom"
else
write gdest < $paq D/dev/null
.mail gdest < $paq D/dev/null
case g? in
0) echo "message envoy la boite aux lettres',
L) echo "pas de boites aux lettres trouv !!"
,ii
esac
--
1)
tr
,,
echb'TERREIIR : utilisateur inconnu d.u yst me"
.. .
tt
'
LISTE DES PARAMETRES
' xercice :
Ecrire u,n script shell permettant
des ses iraram tres effectifs.
I'affichage de plusieurs fa ons de la Iistc
#sh$ : sript obtention des param tres d'un script
echo nom du script: $0
echo nombre d\arguments d\appel : $#
iftest $# -eq 0
then
echo liste de param tres vide
else
echo liste des param tres obtenus par \g : g
echo liste des param tres obtenus par \g@ ; $@
echo "liste des param tres
affich s par une boucle for : "
for i
do
i
done
echo -e "gi \c"
echo "\nm me liste obtenue par une boule while :',
while test $# -ne 0
do
echo -e "91 \c"
shift
done
.!
,-i
-: :r '-l.r
;\ '. :
i'i:: i
Publicité
!' ,-
;
:! -
'l: :, :.
. iitt
. : .r :
-i-
.. -
,
:
Partie 2 : C mnandes sysl me et programmatiott SlJell
E*ercices corrig s
Exercice :
En recourant la commande cut et un fichier temporaire contenant
initialement la liste des param tres, crire un script shell qui construit une
liste invers e de ces paramQtres avant de les afficher dans cet ordre. On
suppose que la liste des param tres effectifs est de taille quelconque'(et
donc au del de 9).
#shl9bis:
4
tt
script pareil au sh19
avec plusieurs variables
if test $# -eq 0
then
echo nombre de param tres gal z ro
else
echo liste des param tres :
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 invers e :
echo -e "\[ $]isf,s"
fi
SIMULATION MSIDOS
Exercice :
Ecrire un script shell qui peut interpr ter les commandes internes de
MS/DOS et en particulier: copy, cls, date, del, dir, exit, more, ren, time,
rype.
Remarques:
- Les commandes peuvent tre
minuscule ou en majuscule.
introduites en
indiff remment
- On devra respecter galement la syntaxe de ces commandes et leurs
options, par exemple : DIR .
script des commandes internes de MS/DOS
interpreter Q
I
t
case $1 in
lCcllLUlSsl )
lcclloollPpltYyl)
. clear;;
if test x$3 = :
then cp $2 $HOME/.
else cp $2 $3
fi;;
tDdllAallTtllEel) date *"Yoa%oD";;
tDdltEel )
)
lrtl )
*)
cat $2 | more;;
mv $2 $3;;
date *"%T";;
cat $2;;
echo commande incorrect;;
esac
)
##
function menuQ
t
whiie true
do
echo -e "\tDOS>\c"
reacl commancle
set $commande
if test zzz$I t= zzz
then
case $1 in
tEeltxxlllillTtl )
fi """.
l
done
)
##
ciear
echo -e-"\t\t DOS COMMANDS '
eChO -g "\t\t---===========\n"
m n - -
clear; break;;
$*;;
.interPreter
186,i ;;,
,'t :.1
et
Eiercices
PROCESSUS & SIGNAIIX
fd1
tii
Exeicice: ' j
.signal par la commande kill n cessite la
L'envoi d'un quelconque
connaissanbe du num ro du processus signal . On d sire crire un script.
qui tue un processus connu par son nom (param tre d'entr e v rifier au
pr alable)'
#sh21 :
#
script qui tant donn ie nom du processus
lui envoie le signal SIGKILL pour le tuer
iftest $# -eq 1
then
#obtenir avec ps de la ligne contenanl le nonr
nu='ps I grep $t'
#d couper cette ligne en plusieurs chanrps
set $nu
#premier champ = num ro de processus
kill -9 $1
else
fi
echo erreur : param tre attendu
echo usage : $0 NomProcessus
Exerclce :
Ecrire un script permettant de d truire un ensenrble de processus dont les
noms sont pass s comme param tres d'entr e au script.
..#sh22 :
#
,i.
. ij ..-
script d truisant une liste de processus
dont les noms sont donn s en param tres
',r! if test $# -eq 0
FI
l l:i
|{
i.
Part e 2 : Comntandes syst me et programmat on Slrell
Exerc ces corrig s
echo usage : "$0 process..."
else
for i in $"
do #on suppose que les sorties de ps sont de
#la forme :
#
#
#
#on utilise cut avec comme d limiteur "p"
TIME CMD
PID TTY
500 pts/O 00:00:01 bash
'cat
6L5 pts/O 00:00:00
' #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 : processus inexistant
.
fi
done
fi
Exercice :
gcrire un script qui affiche le nom de chaque sous r pertoire appartenant
au r pertoire donn en param tre (par d faut le r pertoire courant) puis lit
au terminal'une commande qu'on ex cutera sous le sous-r pertoire
affich . L'ex cution de la commande, lorsqu'elle est valide, ne doit pas
tre interrompue (par un CTRL-C)
#sh23 : script qui affiche le nom de chaque sous r pertoire
appartenant au r pertoire donn en param tre (par d faut
il s'agira du r pertoire courant) puis ex cute dans ces sous'
- =# r pertoires une commande qui sera introduite au terminal
-.
if
then
elif
test $# -gt 1
echo I'erreur : trop de param tres"
test $#.eq 0
then
elif
then
"orrr"p1='pwd'
test .d $1
if test "$1" = ".'
then courant-'pwd'
else courant=$1
fi
else echo "erreur : Auncun r pertoire de ce nom"
exit 1
fi
echo -e "\l ====== liste des r pertoires de $couranf, =====.
nbrep='6nd $courant -type d -maxdepth 1 lwc -l'
if test $nbrep -eq 1.
then . echo "pas de sous r pertoires dans $courant',
exit 2
ls -l gcourant I grep "^d"
.,,. else
' ii; {i
:
cd $courant
cho -e "\n\n\tCommande ex cuter, e)uitter, ?)help:\n"
.i i i
:. for dir in *
+r do
r;' iftest -d $dir
.:.: then
.,i:, echo -n "$dir => "
trap 'clear ; exit' 2
.;
:.
read cmde
', case $cmde in
rrt\
ij
,
''
,r
cho
tt
"
ti
:'
''
,
,.!
t t
taql)
clear
exit 0
',, ,-.. _:
t88
18 9
Partie 2 : Commandes
.. :l:r)'1;r
et Dro.
? l
Publicité
")
lHhl tPpl)
echo "ce script vous facilite la r alisation"
echo "d'une commande que vous saisissez "
echo "sur un r pertoire qui vous sera pr cis "
echo "parmi ceux du r pertoire courant ou"
echo " celui que vous allez donn en param tre"
exit 3
t;
if trap : 2 ; eval $cmde $dir b/dev/null
then
echo "\n"
echo "erreur : commande inconnue ou erron e"
else
fi
esac
fi
done
Shell
Exercices
COMMANDE EVAL
,:':".. Exercice:-
,::-lri',Ecrire ur1 script.Qui affiche.-ses param tres donn es dans |ordre inverse
r,i .d!-]l].1_ipl..rl,i:i..On. utitisera pour cela la commande eval et on
construir au pr arable ra riste invers e. on suppose que Ie nomure a.
;..1j ,param tres effectifs ne d passe pas la valeur 9.
1:vsr w rc 14 uurilIllanqe
et On
- j_r.
eval
i...
.
affichage des arguments dans l,ordre inverse
. de leur apparition lors de I'apoel
on utilisera la commanae elr i en construisant
une commande echo avec les param tres invers s
#sh19:
#
#
#
#attention : ne fonctionne que partiellement cause
du nombre de param tres formels r cjuits g
#
if test $# -eq 0
then echo pas d\arguments
else
echo -e "liste des arguments :',
tr================,,
gChO
echo -e "\t $@"
-g
#construction de la commande echo
cor Pt=$g
cm e="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 :,,
gChO _e r'===:==============:rtrtl=======
evali$cmde
-
:
t
.. :.
:. '-. .: .'. t: .: ;: .. i
'-"
r...
.. -1. ':. .. r:1, :: :: l-11
,-.
.._ . -..::::-_-
:' l-
--
--
:'
-
-
-
-
2 : Commandes syst me et prograrnmation Shell
E-rercices corrip o
2: Conmandes
Shell
Exercices
RECHERCHE DE FICHIERS PAR FIND
rcice :
ire un script shell permettant de facilitef I'utilisation de la commande
l. L'objectif est de pr senter un menu I'utilisateur pour choisir quel
,e de recherche il voudra r aliser partir d'un r pertoire donn e.
.emple : affichage de la liste des fichiers ordinaires, affichage de la liste
s fichiers appartenant un utilisateur donn , etc.
-script findl qui aff che une liste de fichiers
I
I
selon les besoins de l'utilisateur exprim s
par un choix dans un menu
menuQ
t
echo -e':\t\t 0) quitter"
echo -e "\t\t 1) sous r pertoires de $dir"
echo -e "\t\t 2) liste des fichiers ordinaires de $dir"
echo -e "\t\t 3) liste des fichiers sp ciaux de $dir"
echo -e "\t\t 4) fichiers de $dir ayant une taille donn e"
echo -e "\t\t 5) fichiers appartenant un utilisateur donn "
echo -e "\t\t 6) frchiers r cemment mis jour"
echo -e "\t\t 7) fichiers r cemment acc d s"
echo -e "\t\t 8) fichiers r cemment cr s'
echo -e "\t\t 9) fichiers ayant des droits d'acc s particuliers"
)
rvhile true
do
gChO - g n\n==========:==========================r'
trap 'clear; exil' 2 3
egho -e "R pertoire traiter : \c"; read dir
if test 'l$dir' = r!'rr
then dii-'pwd'.
-- -elif test-d $dir
.
then:
t>z
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
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'acc s : \c"; read droit
find gdir -perm -gdroit -print
*) echo -e "\n>i>> ERREIJR at nS l
s isie ! <<<<\n"
lr
"
,,
:, .1, ,;,. ,
193--.;-.,+
'::., -. ':,' . -::
-_ r: --r_ :- r
' '-_
--.
: . ji:ji. . . -: . j: : , .
Exercice :
shell qui va traquer la liste des fichiers de taille nulle et
ffiG1"ript
c"ux dont le uit suto est mis en place. Le script attend un param tre en
la sp cification du chemin d'un r pertoire
entr e qui doit corresponclre.
purti. aiqu.f la recherche va tre op r e. Si ce param tre est absent, il
s'ag.t du r Pertoire courant.
#script find2 traquant les fichiers de taille nulle
#
et de SUID'BiI mis en Place
'
if test $# 'gt 1
then
echo erreur : troP de Param tres
echo usage : $0 lPath]
exit 1
fi
echo ${1:-'pwd'} 1>/dev/null D/dev/null
echo $1
echo "liste des fichiers de taille nulle"
g 6 | 6
= ====--==============tr
===
t t
nbre='find $1 'size 0 lwc 'l'
find $1 -size 0
echo -e "\n))))))>>
TOTAL = $nbre \n"
echo "liste des fichiers avec SUID'BiI=1"
g f g tt ====
nbre='find g1 -perm +4100 | wc'l'
find $1 -perm +4100
======================
echo -er1\n))>)))>>> TOTAL = $nbre \n"-
.
t, arborescence de racine le nom d'un r pertoire et appartenant un groupe
''d'utilisateurs donn , et qui vous propose au travers d'un menu soiide les
afficher, deiles d truire ou de les archiver.
t
#script lind3 qui cherche tous les fichiers appartenant un
T
JIr
groupe donn et qui ex cute une commande parmi une
liste donn e dans un menu
tt======================
function menuordre Q
I(
gglg
echo "
echo "
, echo "
i!' cho "
A)rchiver
D) truire
L)ister
Q)uitter
t'
echo -n "
)
votre choix : "
clear
echo -n "nom du groupe : "
l,read giroupe\
:. ,
t
i if ! grep "^$groupe:" /etc/group l>/dev/null 2>/dev/null
'.then echo "erreur : nom du groupe erron !!!"
exit 1
II
-t::
,',echo .n "r pertoire de recherche : "
...i
:.:.
i.i r:.;::j:.
'.
:::''*-:+:
-i r pertoire inexisant ou inaccesible"
i iit: ir::
menuordre
read choix
case $choix in
) echo -n "nom de I'archive : "; read archive
find $dossier -g oup $groupe I cpio -ocvB > $archive
,t
Publicité
tDd]) find $dossier -group $groupe 'e...