Shell Programming Exercises

Shell Scripting, Programming, Unix Commands · lab

Voir tous les documents en systèmes d'exploitation et cloud

.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...