Vous êtes sur la page 1sur 396

Ressources

Ïnfornzatiques

Programmation
EIl
Unix/Linux
sh, ksh, hash

ChristineDEFFAIXRÉMY

Ï INFORMATIQUE
TECHNIQE
lbs";
3,325?!
KessourcesI

îProgrammation
sousUnix/Lin
sh,ksh,hash
Avant-propos
Cet ouvrages'adresse
aux utilisateurset administrateursdes systèmesUNIX et
LINUXqui ont besoind'automatiserdes tâcheset qui doiventdans cet objectif se
former à l'écriture
de scripts shell. Les lecteursde ce livre doivent au préalable
connaîtreles principesde basede ce systèmed'exploitation
et être relativementà
l'aise
avec la manipulationdes fichiers et des processus.La connaissancedes
concepts de base de la programmation(notions de variables, structures de
contrôleset d'algorithmique)
est souhaitable.
Lesfonctionnalitésdes trois shellscourammentutilisés(BourneShell, KornShellet
BourneAgainShell) sont détailléeset leurs différencessignalées.Les thèmessont
présentésde manièreprogressiveet pédagogique,ce qui fait de cet ouvrageun
supportidéal destinéaussibien à la formationprofessionnellequ'à
l'auto-formation.
Lestrois premierschapitresde ce livre sont consacrésau fonctionnementdu shell :
- le chapitreIntroductionprésenteles interpréteursde commandedisponiblessous
Unix/Linux.
le chapitre Mécanismesessentielsdu shell présenteles caractèresspéciauxdu
shell utilisésen ligne de commandeet/ou dans les scripts. Il est importantd'être
à l'aise
avec les notionsexposéesdans ce chapitreafin d'aborderaisémentles
chapitresdédiésà la programmation.
- le chapitre Paramétragede l'environnement
de travail permettraau lecteur de
comprendre de quelle manière le shell positionne son environnementet
commentmodifierles paramètresd'initialisation.
Ce chapitrepeut être étudié de
manière indépendante,il n'est
pas indispensablepour aborder les chapitres
suivants.
Leschapitres
Lesbasesde la programmation
shellet Aspectsavancés
de la pro-
grammationshell sont dédiés entièrementà la programmation.A l'issue du cha-
pitre Les basesde la programmationshell, le lecteurdébutantou moyennement
expérimentéaura acquis les principalesfonctionnalitésdu langagequi lui permet-

AII
rights
reserved
tent d'écrire
des scripts : variables,tests, boucles,calculs... Le chapitre Aspects
avancésde la programmationshell présentedes fonctionnalitéscomplémentaires,
parmi lesquelles on trouvera lecture/écriturede fichiers textes, gestion
d'arguments
de la lignede commandes,gestionde menus...

ENI
Editians
- Le chapitreLes expressionsrégulièresprésenteles deuxjeux d'expressions
réguliè-
res utiliséesdans la rechercheet/ou substitutionde chaînesde caractèrespar les
commandesexpr,grep,vi, sed et awk.

sh, ksh, bash


ÔXÊRBËQEÊËW
Les chapitresLa commandesed et Le langagede programmationawk présentent
deux commandesUnix qui permettentde traiter des chaînesde caractèreset des
fichierstextes.
Le dernierchapitreLes commandesfiltres présentede manièredétailléeles princi-
paiescommandesfiltres d'UN|X
pouvantêtre utiliséesen ligne de commandeet à
partir de scriptssheils.

Pro
sh
so
U
Lesexemplescités tout au long de cet ouvragesont téléchargeables à l'adresse
suivante: http://www.editions eni.fr
Saisissezla référenceENI de l'ouvrage
Rl3PROdans la zonede recherche
et validez.Cliquezsur le titre du livre puis sur le lien de téléchargement.

Avant-propos
Introduction Cha
1
A.Définitiondushe|l................. 18

B. Caractéristiques d'un
interpréteur de commandes . . . . 18

C.Historiquedushell................. 18

D. Principaux interpréteurs de commandes . . . . . . . . 19

E. Shells abordés dans cet ouvrage. . . . . . . . . . . . 20

Mécanismes essentiels du shell Chapitre2

}A. Commandes
interneset externes . . . . . . . . . . . 22
1. Lescommandesexternes . . . . . . . . . . . . . . . . . . 22
2. Lescommandesinternes . . . . . . . . . . . . . . . . . . 23
3. Implémentationinterneet implémentationexterne. . . . . . . . 25
Table des matières

c. Le caractère
"\t". . . . . . . . . . . . . . . . . . . . . 27
d. Listedescaractères d'échappement
. . . . . . . . . . . . 28
2. Lescommandesprint et printf . . . . . . . . . . . . . . . . 28

C. Lecaractèrewüilde)................ 28

D. Lacommandeinternecd............... 30

E. Substitution de noms de fichiers . . . . . . . . . . . 30


1. Expressionsbasiques. . . . . . . . . . . . . . . . . . . . 31
a. Le caractère* . . . . . . . . . . . . . . . . . . . . . 31
b. Lecaractère? . . . . . . . . . . . . . . . . . . . . . 31
c. Lescaractères[] . . . . . . . . . . . . . . . . . . . . 31
2. Expressionscomplexes. . . . . . . . . . . . . . . . . . . 32
a. ?(expression)
. . . . . . . . . . . . . . . . . . . . . . 33
b. *(expression). . . . . . . . . . . . . . . . . . . . . . 33
c. +(expression). . . . . . . . ._. . . . . . . . . . . . 33
d. @(expression). . . . . . . . . . . . . . . . . . . . . 34
e. Kexpression). . . . . . . . . . . . . . . . . . . . . . 34
f. Alternatives . . . . . . . . . . . . . . . . . . . . . . 35
3. Interprétationdu shell. . . . . . . . . . . . . . . . . . . . 35

F. Séparateurdecommandes. . . . . . . . . . . . . . 36

G.Redirections....
1. Entréeet sortiesstandarddesprocessus. . . . . . . . . . . . 37
a. Entréestandard. . . . . . . . . . . . . . . . . . . . . 37
b. Sortiestandard. . . . . . . . . . . . . . . . . . . . . 37
c. Sortied'erreur
standard . . . . . . . . . . . . . . . . . 38
2. Héritage . . . . . . . . . . . . . . . . . . . . . . . . . 38
3. Redirectiondessortiesenécriture . . . . . . . . . . . . . . 39
a. Sortiestandard. . . . . . . . . . . . . . . . . . . . . 39
b. Sortied'erreur
standard . . . . . . . . . . . . . . . . . 40

Programmation shell sous Unix/Linux


T
c. Sortiestandardet sortied'erreur
standard. . . . . . . . . . 41
d. Éliminerles affichages. . . . . . . . . . . . . . . . . . 42
e. Mécanismeinterne . . . . . . . . . . . . . . . . . . . 43
4. Redirectionde l'entrée
standard . . . . . . . . . . . . . . . 44
5. Redirectionsavancées . . . . . . . . . . . . . . . . . . . . 45
a. Redirigerles descripteurs1 et 2 vers le mêmefichier. . . . . 45
b. La doubleredirectionen lecture. . . . . . . . . . . . . . 52
c. Fermetured'un
descripteur. . . . . . . . . . . . . . . . 53

H. Tubes de communication. . . . . . . . . . . . . . . 53
1. Commandesne lisant pas leur entréestandard . . . . . . . . . 55
2. Commandeslisant leur entréestandard . . . . . . . . . . . . 55
a. Exemplestriviaux . . . . . . . . . . . . . . . . . . . . 55
b. Casdesfiltres . . . . . . . . . . . . . . . . . . . . . 56
3. Compléments. . . . . . . . . . . . . . . . . . . . . . . 60
a. Enchaînerdes tubes. . . . . . . . . . . . . . . . . . . 60
b. Dupliquerles sorties. . . . . . . . . . . . . . . . . . . 61
c. Envoyerla sortiestandardet la sortied'erreur
standard
dans le tube . . . . . . . . . . . . . . . . . . . . . . 62

l. Regroupementde commandes . . . . . . . . . . . . 62
1. Les parenthèses. . . . . . . . . . . . . . . . . . . . . . 63
2. Lesaccolades. . . . . . . . . . . . . . . . . . . . . . . 68
3. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . 73

J. Processus en arrière-plan . . . . . . . . . . . . . . 73

sh, ksh, bash


gloiredesmatières un

3
Paramétrage de l'environnement Chapitre
de travail

A. Variables d'environnement . . . . . . . . . . . . . . 76
1. Listedesvariables. . . . . . . . . . . . . . . . . . . . . 76
2. Affichagede la valeurd'une
variable
. . . . . . . . . . . . . . 76
3. Modification
de la valeurd'une
variable. . . . . . . . . . . . 76
4. Principales
variables. . . . . . . . . . . . . . . . . . . . 77
a. HOME. . . . . . . . . . . . . . . . . . . . . . . . . 77
b. PATH. . . . . . . . . . . . . . . . . . . . . . . . . 77
c. PWD . . . . . . . . . . . . . . . . . . . . . . . . . 79
d. PS1. . . . . . . . . . . . . . . . . . . . . . . . . . 79
e. PS2. . . . . . . . . . . . . . . . . . . . . . . . . . 83
f. TMOUT . . . . . . . . . . . . . . . . . . . . . . . . 84
g. TERM. . . . . . . . . . . . . . . . . . . . . . . . . 84
h. LOGNAME . . . . . . . . . . . . . . . . . . . . . . . 84
i. Processus et variables
d'environnement
. . . . . . . . . . . 85
5. Exportation
desvariables. . . . . . . . . . . . . . . . . . 85
a. Listedesvariables exportées. . . . . . . . . . . . . . . 85
b. Variablesdevantêtreexportées. . . . . . . . . . . . . . 86
c. Exporterunevariable . . . . . . . . . . . . . . . . . . 86

B. Lesoptionsdushell. . . . . . . . . . . . . . . .. 89
1. Activeret désactiveruneoptiondushell. . . . . . . . . . . . 89
2. Visualiserla listedesoptions
. . . . . . . . . . . . . . . . . 89
3. Principalesoptions. . . . . . . . . . . . . . . . . . . . . 90
a. ignoreeof. . . . . . . . . . . . . . . . . . . . . . . 90
b. noclobber. . . . . . . . . . . . . . . . . . . . . . . 90
c. emacset vi . . . . . . . . . . . . . . . . . . . . . . 91
d. Xtrace. . . . . . .. . . . . . . . . . . . . . . . . . . 92

Programmationshell sousUnix/Linux
C. Les alias. 92
1. Définirun alias . . . . . . . . . . . . . . . . . . . . . . 92
2. Visualiserla liste des alias. . . . . . . . . . . . . . . . . . 92
a. Visualisertous les alias . . . . . . . . . . . . . . . . . 92
b. Visualiserun alias en particulier. . . . . . . . . . . . . . 93
3. Supprimerun alias . . . . . . . . . . . . . . . . . . . . . 93

D. Historique de commandes . . 93
1. Paramétrerle rappelde commandesen ks . . . . . . . . . . 94
a. Optionvi . . . . . . . . . . . . . . . . . . . . . . . 94
b. Optionemacs . . . . . . . . . . . . . . . . . . . . . 96
2. Paramétrerle rappelde commandesen bash. . . . . . . . . . 99
3. La complétionde nomsde fichiers . . . . . . . . . . . . . . 99
_a. La complétiondu bash. . . . . . . . . . . . . . . . . . 99
b. La complétiondu ksh . . . .V. . . . . . . . . . . . . . 100
c. Tableaurécapitulatif. . . . . . . . . . . . . . . . . . . 102

E. Les fichiers d'environnement . . 102


1. Caractéristiques
desfichiersd'environnement. . . . . . . . . . 102
a. Shellde connexion . . . . . . . . . . . . . . . . . . . 102
b. Fichiersd'environnement
lus par le shell de connexion 103
2. Sessionutilisant un BourneShell . . . . . . . . . . . . . . . 106
3. Sessionutilisant un KornShell . . . . . . . . . . . . . . . . 107
4. Sessionutilisant un BourneAgainShell . . . . . . . . . . . . 109

Les bases de la programmation shell Chapitre4

A. Les variables utilisateur 114


1. Nommerune variable. . . . . . . . . . . . . . . . . . . . 114

sh, ksh, bash


Table des matières
muaunmsæwahm

2. Définirune variable. . . . . . . . . . . . . . . . . . . . . 114


a. Affecterune chaînede caractèresà une variable. . . . . . . 114
Affecterune chaînede caractèrescontenantau moins un espace 115

P-PP
Variableindéfinie . . . . . . . . . . . . . . . . . . . .
Retirerla définitiond'une
e. Isolerle nom d'une
variable . . . . . . . . . . . . .
variable. . . . . . . . . . . . . . . .
115

115
3. Substitutionde variables

Substitution de commandes

Caractères de protection
1. Lessimplesquotes. . .
. . .
. . . . . . . .
. . .
. . . . . . . . . . 116
2. Le caractère\ . . . . . . . . . . . . . . . . . . . . . . .
3. _Lesguillemets. . . . . . . . . . . . . . . . . . . . . . .

Récapitulatif des caractèresspéciaux. . . . .


Interprétation d'une
ligne de commande
117
criture et lancement d'un script shell . . . . . . . . .

PPNFN
119
Définition. . . . . . . . . . . . . . . . . . . . . . . . .
Exécutiond'un
script par un shell enfant.
Exécutiond'un
script par le shell courant.
.
.
.
.
. .
. .
.
.
.
.
.
.
.
.
. .
. .
.
.
120
Commentaires . . . . . . . . . . . . . . . . . . . . . . .

Variables réservées du shell 120


1. Les paramètrespositionnels. . . . . . . . . . . . . . . . .
122
2. La commandeshift . . . . . . . . . . . . . . . . . . . . .
123
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . .
b. Principe. . . . . . . . . . . . . . . . . . . . . . . . 124
3. Codede retourd'une
commande. . . . . . . . . . . . . . .
a. La variables? 124
b. La commandeexit. . . . . . . . . . . . . . . . . . . .
125
Table des matières
maman

4. Autresvariablesspéciales. . . . . . . . . . . . . . . . . . 141
a. PIDdu shell interpréteur
. . . . . . . . . . . . . . . . . 141
b. PIDdu dernierprocessus lancéen arrière-plan. . . . . . . . 142

H.Lacommanderead.................144
1. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . . . 144
2. Lecturesauclavier . . . . . . . . . . . . . . . . . . . . . 144
3. Codede retour. . . . . . . . . . . . . . . . . . . . . . . 146
4. La variableIFS . . . . . . . . . . . . . . . . . . . . . . 147

l. Exécutiondetests.................148
1. La commandetest . . . . . . . . . . . . . . . . . . . . . 148
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 148
b. Testssurlesfichiers. . . . . . . . . . . . . . . . . . . 148
c. Testssurleschaînesde caractères . . . . . . . . . . . . . 151
r d. Testssurlesnombres. . . . . . . . . . . . . . . . . . 153
e. Lesopérateurs. . . . . . . . . . . . . . . . . . . . . 154
f. Exempleconcretd'utilisation. . . . . . . . . . . . . . . 155
2. La commande[[ ]] . . . . . . . . . . . . . . . . . . . . . 156

J. Les opérateurs du shell . . . . . . . . . . . . . . . 160


1. Évaluation
de l'opérateur
&&. . . . . . . . . . . . . . . . . 160
2. Évaluation
de l'opérateur
[| . . . . . . . . . . . . . . . . . 161

K.L'arithmétique...................163
1. La commandeexpr. . . . . . . . . . . . . . . . . . . . . 163
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 163
b. Opérateurs . . . . . . . . . . . . . . . . . . . . . . . 163
2. La commande(( )) . . . . . . . . . . . . . . . . . . . . . 166
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 166
b. Utilisation . . . . . . . . . . . . . . . . . . . . . . . 166
3. La commandelet . . . . . . . . . . . . . . . . . . . . . 169

sh, ksh, bash


Tabledesmatières
nnnnoouunumu maman-summum...-

L. Substitutiond'expressions
arithmétiques. . . . . . . . 170
M. Miseau pointd'unscript.
. . . . . . . . . . . . . . 171
1. Option-x . . . . . . . . . . . . . . . . . . . . . . . . . 171
2. Autresoptions. . . . . . . . . . . . . . . . . . . . . . . 174

N. Les structures de contrôle . . . . . . . . . . . . . . 174


1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
2 Case. . . . . . . . . . . . . . . . . . . . . . . . . . . 178
a Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 179
b. Principe. . . . . . . . . . . . . . . . . . . . . . . . 179
c. Utilisation. . . . . . . . . . . . . . . . . . . . . . . 180
3. Bouclefor. . . . . . . . . . . . . . . . . . . . . . . . . 184
4. Bouclewhile . . . . . . . . . . . . . . . . . . . . . . . 187
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 187
b. Utilisation. . . . . . . . . . . . . . . . . . . . . . . 188
c. Boucleinfinie. . . . . . . . . . . . . . . . . . . . . . 189
5. until. . . . . . . . . . . . . . . . . . . . . . . . . . . 192
a. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . 192
b. Utilisation. . . . . . . . . . . . . . . . . . . . . . . 192
6. breaket continue. . . . . . . . . . . . . . . . . . . . . 196

Aspects avancés
de la programmation shell

A. Comparatifdesvariables5* et S@ . . . . . . . . . . 200
1. Utilisation
de 5* et de SB@. . . . . . . . . . . . . . . . . 200
2. Utilisation
de "R*" . . . . . . . . . . . . . . . . . . . . . 201
3. Utilisation
de "3@ . . . . . . . . . . . . . . . . . . . . . 202

Programmationshellsouslmix/Liux
.ti.ê

B. Substitution de variables . . . . . . . . . . . . . . . 203


1. Longueurde la valeurcontenuedans une variable. . . . . . . . 203
2. Manipulationde chaînesde caractères . . . . . . . . . . . . . 204
a. Retirerle plus petit fragmentà gauche. . . . . . . . . . . 204
b. Retirerle plus grandfragmentà gauche . . . . . . . . . . 204
c. Retirerle plus petit fragmentà droite. . . . . . . . . . . . 205
d. Retirerle plus grandfragmentà droite . . . . . . . . . . . 205

C.Tableaux.....................206
1. Assignerun élément . . . . . . . . . . . . . . . . . . . . 206
2. Référencerun élément . . . . . . . . . . . . . . . . . . . 206
3. Assignementglobald'un tableau . . . . . . . . . . . . . . . 207
4. Référencer tous les élémentsd'untableau . . . . . . . . . . . 208
5. Obtenirle nombred'éléments d'un
tableau . . . . . . . . . . . 208
6. Obtenirla longueurd'un élémentd'un
tableau. . . . . . . . . . 208

D. Initialisation des paramètres positionnels avec set . . . . 209

E.Lesfonctions....................209
1. Définitiond'une
fonction. . . . . . . . . . . . . . . . . . . 209
2. Codede retourd'une fonction . . . . . . . . . . . . . . . . 211
3. Portéedesvariables . . . . . . . . . . . . . . . . . . . . 214
4 Définitionde variableslocales . . . . . . . . . . . . . . . . 214
5. Passaged'arguments . . . . . . . . . . . . . . . . . . . . 216
6. Exploiterl'affichage
d'une
fonction. . . . . . . . . . . . . . . 218
7. Programmecompletde l'exemple . . . . . . . . . . . . . . . 220

F. Commandes d'affichage . . . . . . . . . . . . . . . 222


1. La commandeprint. . . . . . . . . . . . . . . . . . . . . 222
a. Utilisationsimple . . . . . . . . . . . . . . . . . . . . 222
b. Suppression du saut de ligne naturelde print . . . . . . . . 222

sh, ksh,h " A


Tabledes matière
mænæunnmmmæunmrxvnnmuwzsæeæuu
nv

c. Afficherdes argumentscommençantpar le caractère"-" . . . . 222


d. Écriresurundescripteur
particulier. . . . . . . . . . . . 223
2. La commandeprintf . . . . . . . . . . . . . . . . . . . . 223

G. Gestiondes entrées/sortiesd'un
script . . . . . . . . . 225
1. Redirectiondes entrées/sorties standard . . . . . . . . . . . . 225
2. Gestionde fichiers . . . . . . . . . . . . . . . . . . . . . 228
a. Ouverturede fichier . . . . . . . . . . . . . . . . . . . 228
b. Lectureà partir d'un
fichier . . . . . . . . . . . . . . . . 229
c. Écrituredans un fichier . . . . . . . . . . . . . . . . . 229
d. Fermetured'un
fichier . . . . . . . . . . . . . . . . . . 229
3. Traitementd'un
fichier . . . . . . . . . . . . . . . . . . . 230
a. Informationspréalables . . . . . . . . . . . . . . . . . . 230
b. Lesdifférentesfaçonsd'exploiter
un fichier . . . . . . . . . 231
c. Découperune ligneen champs . . . . . . . . . . . . . . 237

H.Lacommandeeval..........
l. Gestiondessignaux.........
1. Principauxsignaux. . . . . . . . . . . . . . . . . . . . . 240
2. Ignorerun signal. . . . . . . . . . . . . . . . . . . . . . 241
3. Modifierle traitementassociéà un signal . . . . . . . . . . . 242
4. Repositionnerle traitementpar défautdu shell vis»à visd'un
signal. 243
5. Utilisertrap à partir d'un
script shell . . . . . . . . . . . . . 244

J. Gestion de menus avec select. . . . . . . . . . . . . 245

K. Analyse des options d'un


script avec getopts . . . . . . 247
L. Gestiond'un
processusen arrière-plan. . . . . . . . . 253
Table des matières

M. Script d'archivage
incrémental et transfert sftp automatique 255
1. Objectif
. . . . . . . . . . . . . . . . . . . . . . . . . . 255
2. LefichieruploadBackup.sh . . . . . . . . . . . . . . . . . 258
3. Lefichierfonctions.inc.sh
. . . . . . . . . . . . . . . . . . 260

Les expressions régulières Chapitre


6

A Introduction . . . . . . . . . . . . . . . . . . . . 266

B. Caractères communs aux ERb et Ere. . . . . . . . . . 266

C. Caractères spécifiques aux ERb . . . . . . . . . . . . 269

D. Caractères spécifiques aux ERe . . . . . . . . . . . . 269

E. Exploitation
desexpressions
régulièrespar lescommandes 271
1. Lacommande vi . . . . . . . . . . . . . . . . . . . . . . 271
2. Lacommande grep. . . . . . . . . . . . . . . . . . . . . 272
3. Lacommande expr. . . . . . . . . . . . . . . . . . . . . 274
4. sedet awk . . . . . . . . . . . . . . . . . . . . . . . . 277

La commande sed Chapitre7

A. Utilisation de la commande sed . . . . . . . . . . . . 280

B. Exemples . . . . . . . . . . . . . . . . . . . . . 282
1. Utilisation
deseden lignedecommande. . . . . . . . . . . 282
a. Lacommande d (delete). . . . . . . . . . . . . . . . . 283
b. Lacommande p (print). . . . . . . . . . . . . . . . . . 283

sh, ksh, bash


Table
smmämades . .

c. La commandew (write) . . . . . . . . . . . . . . . . . 284


commande(!) . .
d. Négationd'une . . . . . . . . . . . . . 284
e. Lacommandes (substitution). . . . . . . . . . . . . . . 285
2. Scriptsed. . . . . . . . . . . . . . . . . . . . . . . . . 287

Le langage de programmation awk Chapitre


8

A.Principe......................290
1. Syntaxe. . . . . . . . . . . . . . . . . . . . . . . . . . 290
2. Variablesspéciales. . . . . . . . . . . . . . . . . . . . . 290
a. Variablesprédéfiniesdès le lancementdeawk . . . . . . . . 290
b. Variablesinitialiséeslors dutraitementd'une
ligne . . . . . . 291
c. Exemplessimples. . . . . . . . . . . . . . . . . . . . 292
3. Critèresde sélection . . . . . . . . . . . . . . . . . . . . 293
a. Expressions régulières. . . . . . . . . . . . . . . . . . 294
b. Testslogiques . . . . . . . . . . . . . . . . . . . . . 295
c. intervallesde lignes . . . . . . . . . . . . . . . . . . . 296
4. Structured'un
script awk . . . . . . . . . . . . . . . . . . 296
a. BEGIN . . . . . . . . . . . . . . . . . . . . . . . . 296
b. Sectionsintermédiaires . . . . . . . . . . . . . . . . . . 296
c. END . . . . . . . . . . . . . . . . . . . . . . . . . 296
d. Commentaires. . . . . . . . . . . . . . . . . . . . . 296
e. Variables . . . . . . . . . . . . . . . . . . . . . . . 296
f. Exemple. . . . . . . . . . . . . . . . . . . . . . . . 297

B.0pérateurs.....................298

C.Lafonctionprintf..............
Table des matières

E. Lecture de la ligne suivante:next. . . . . . . . . . . 303

F. Structuresdecontrôle. . . . . . . . . . . . . . . . 304
1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
2. for . . . . . . . . . . . , . . . . . . . . . . . . . . . . 304
3. While . . . . . . . . . . . . . . . . . . . . . . . . . . 305
4. do-while . . . . . . . . . . . . . . . . . . . . . . . . . 305
5. break . . . . . . . . . . . . . . . . . . . . . . . . . . 305
6. continue . . . . . . . . . . . . . . . . . . . . . . . . . 306

G.Terminerunscript.................306

H.Tableaux.....................307
1. Tableauxindicésparunentier. . . . . . . . . . . . . . . . 307
2. Tableaux associatifs. . . . . . . . . . . . . . . . . . . . 308
a. Définition. . . . . . . . . . . . . . . . . . . . . . . 308
b. Testerl'existence d'un
élément . . . . . . . . . . . . . . 309
c. Supprimerunélément. . . . . . . . . . . . . . . . . . 310

l. Les arguments de la ligne de commande . . . . . . . . 310

J. Fonctionsintégrées. . . . . . . . . . . . . . . . . 312
1. Fonctionstravaillantsurleschaînes. . . . . . . . . . . . . . 312
2. Fonctionsmathématiques. . . . . . . . . . . . . . . . . . 313
3. Autresfonctions . . . . . . . . . . . . . . . . . . . . . . 313
a. La fonctiongetline. . . . . . . . . . . . . . . . . . . . 313
b. La fonctionclose . . . . . . . . . . . . . . . . . . . . 317
c. La fonctionsystem . . . . . . . . . . . . . . . . . . . 318

K. Fonctions utilisateur. . . . . . . . . . . . . . . . . 319

s, ksh,a " '


Table
H väaääwa wu n ..

L. Exemplesdescripts. . . . . . . . . . . . . . 321
1. Analysed'un
fichier de log. . . . . . . . . . . . . . . . . . 321
2. Générationd'un
fichier d'étiquettes
. . . . . . . . . . . . . . 323

Les commandes ltres Chapitre9

A. Introduction . 328

B. Syntaxed'appel
des commandesfiltres . 328
C. Visualisation de données . . . . . . . . . . . . 328
1. Consultationde données,créationde fichier : cat . . . . . . . . 328
2. Valeurdes octetsd'un
flux de données: od. . . . . . . . . . . 330
3. Filtragede lignes: grep . . . . . . . . . . . . . . . . . . . 331
4. Dernièreslignesd'un
flux de données: tail . . . . . . . . . . . 334
5. Premièreslignesd'un
flux de données: head. . . . . . . . . . 335
6. Duplicationde la sortiestandard: tee . . . . . . . . . . . . . 336
7. Numérotationde lignes: nl . . . . . . . . . . . . . . . . . 337
8. Présentationd'un
flux de données: pr . . . . . . . . . . . . . 338

D. Traitement de données. . . . . . . . . . 340


1. Comptagede lignes,de mots et de caractères: wc . . . . . . . 340
2. Extractionde caractères: cut . . . . . . . . . . . . . . . . 342
3. Tri de données: sort . . . . . . . . . . . . . . . . . . . . 343
4. paste. . . . . . . . . . . . . . . . . . . . . . . . . . . 345
5. split . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
6. Transformation de caractères: tr . . . . . . . . . . . . . . . 348
7. Dédoublonnage : uniq. . . . . . . . . . . . . . . . . . . . 349

Programmation shell sous Unix/Linux


b ..,.

E. Compressionsarchivages et conversions. . . . . . . . 351


1. Compressions : gzip, bzip2 . . . . . . . . . . . . . . . . . 351
2. Archivestar . . . . . . . . . . . . . . . . . . . . . . . . 353
3. Archivescpio . . . . . . . . . . . . . . . . . . . . . . . 354
4. Copiephysique,transformations: dd . . . . . . . . . . . . . 356
5. Changement d'encodage
: iconv . . . . . . . . . . . . . . . 358

F. Commandes réseau sécurisées . . . . . . . . . . . . 359


1. Connexionà distance: ssh . . . . . . . . . . . . . . . . . 359
2. Transfertde fichier : sftp . . . . . . . . . . . . . . . . . . 360
a. Commandes de sftp s'exécutant
sur la machinelocale. . . . . 361
b. Commandes s'exécutant
sur la machinedistante . . . . . . . 362
c. Commandesde transfert . . . . . . . . . . . . . . . . . 363
d. Connexionautomatiquesansmot de passe . . . . . . . . . 364

G.Autrescommandes.................366
1. La commandexargs . . . . . . . . . . . . . . . . . . . . 366
2. Comparerdeuxfichiers : cmp . . . . . . . . . . . . . . . . 368
3. Lignescommunesà deuxfichiers : comm . . . . . . . . . . . 369

Annexes

A. Caractères spéciaux du sheli . . . . . . . . . . . . . 372

B. Commandes internes au shell. . . . . . . . . . . . . 373

C. Ordre d'interprétation
d'une
commande. . . . . . . . . 375

Index.......................376

Ë, , bash"
0 Chapitre1 : Introduction
A Définition du shell . . . . . . . . . . . . . . . . . 18

B. Caractéristiquesd'un
interpréteur de commandes . . . . 18

C. Historique du shell . . . . . . . . . . . . . . . . . 18

D. Principaux interpréteurs de commandes . . . . . . . . 19

E. Shells abordés dans cet ouvrage. . . . . . . . . . . . 20


EËÊXEËÆMËM.
. . .__ ..

A. Définition du shell
Le shell est un programmeayant pour fonction d'assurer
l'interface
entre l'utilisa-
teur et le systèmeUnix.C'est
un interpréteurde commandes.
Plusieursshellssontdisponiblessur les plates-formesUnix.

B. Caractéristiques d'un
interpréteur
de commandes
Les interpréteursde commandesdisponiblesen environnementUnix ont en com-
mun les fonctionnalitéssuivantes:
- Ils proposentun jeu de caractèresspéciaux permettant de déclencherdes
actionsparticulières.
- Ils possèdentdes commandesinterneset des mots clés parmi lesquelscertains
sont utiliséspourfaire de la programmation.
- Ils utilisent des fichiers d'initialisation
permettantà un utilisateurde paramétrer
son environnement de travail.
Chaqueshell proposeses proprescaractèresspéciaux,commandesinternes,mots
clés et fichiers de paramétrage.Heureusement,les interpréteursles plus utilisés
actuellementdérivent tous du shell Bourne et ont, par conséquent,un certain
nombrede fonctionnalitésen commun.

C. Historique du shell
Le shell qui est considérécommele plus ancienest le BourneShell (sh). Il a été
écrit dans les années70 par SteveBourneaux laboratoiresAT&T.Outresa capaci-
té à lancerdes commandes,il offre des fonctionnalitésde programmation.
Durant la même période,Bill Joy invente le C-shell (csh), incompatibleavec le
Bourne,mais qui offre des fonctionnalitéssupplémentairestelles que l'historique
des commandes,le contrôlede tâches, ainsi que la possibilitéde créer des alias
de commandes.Ces trois aspectsseront repris plus tard dans le Korn Shell. Le
C-shellest peu utilisé dans le mondeUnix.

Programmation shell sous Unix/Linux


Introduction

En 1983, David Korn reprendle BourneShell et Penrichit.Ce nouvelinterpréteur


prendrale nom de Korn Shell (ksh). Ce derniersera de plus en plus employéet
deviendraun standardde fait. Le ksh 88 (versiondatant de 1988) est, avec le
BourneAgainShell (voir ci dessous)le shell le plus utilisé actuellement.Il a servi
de baseà la normalisationdu shell (IEEEPosix1003.2).
En 1993, une nouvelleversiondu Korn Shell voit le jour. Celle-ciprésenteune
compatibilité arrière avec le ksh 88, à quelquesexceptionsprès. Le ksh 93
(/usr/bin/ksh93)est disponibleen standardsur certainesversionsUNIX récentes:
Solaris11,A|X 6 et 7.
La FreeSoftwareFoundationproposele BourneAgainShell (bash). ll est conforme
à la normePOSlXà laquelleil a ajoutéquelquesextensions.Ce shell est l'interpré-
teur fourni en standardsur les systèmesLinux.

D. Principaux interpréteurs de commandes


/usr/bin/sh
Cet exécutablecorrespondau shell POSIX sur certaines plates-formes(AIX,
HP-UX),au BourneShell sur d'autres
(Solaris).La pagede manuel"sh" de chaque
plate-forme indique la localisation des exécutablescorrespondantaux shells
BOURNEet POSIX.Le shell POSIXpossède,à quelquesexceptionsprès, les
fonctionnalitésdu ksh.

/usr/bin/ksh
Cet exécutablecorrespondau Korn Shell 88. Le programme"ksh" sait interpréter
les scriptsutilisant les fonctionnalitésdesshells Bourne,POSIXet Korn.

A/l
rights
reserved
/usr/bin/ksh93
Cet exécutablecorrespondau ksh 93. ll s'agit
shell n'est
d'un
sur-ensembledu ksh 88. Ce
pasdisponiblesur toutes les plates-formesUnix.

Editions
ENI
-
©

sh, ksh, bash


msr/bm/ b ash
ou/bin/bash
Cet exécutablecorrespondau BourneAgainShell. Le programme"bash"sait inter-
préter les scripts utilisant les fonctionnalitésdes shells Bourne,POSIXet Bourne
Again. Le bash est disponibleau téléchargementpour de nombreusesp|ates-for-
mes UNlXqui ne possèdentpas ce shell en standard.

égglbin/csh
Cet exécutablecorrespondau C-shell.Le C-shellne sait pas interpréterles scripts
utilisant les fonctionnalitésdes shells Bourne, POSIX,Korn et BourneAgain. Il
comprenduniquementla syntaxeC-shell.

Avec_. lfa il ,.
Sur certainesplates formes(par exemplesur Solaris),les scriptsde démarragesont
interprétéspar un BourneShell. Si l'on
souhaitemodifierces scripts ou créer de
nouveauxscripts de démarrage,il faut dans ce cas se restreindreà la syntaxe
BourneShell.
Dans les cas les plus fréquents(scriptsde traitementexécutésen mode de fonc-
tionnementUNIX normal),le développeurchoisirasoit le bash,soit le ksh, selon le
shell à dispositionsur sa plate-forme.Le ksh et le bashayant de très nombreuses
fonctionnalitésen commun,cela ne posedonc aucun problèmed'écrire un script
compatibleavecces deuxshells.

0 Si lesspécificités
du ksh93 sontutilisées,
le scriptneserapascompatible
avecles shellssh, ksh (88), bash.

E. shells abordés dans cet ouvrage


Ce livre détaille les fonctionnalitésdes shells Bourne,Korn et BourneAgain. Les
extensionsdu ksh 93 ne sont pas traitées.Sauf spécificationcontraire,les sujets
abordéssont compatiblesavecces trois shells. Lorsquece n'est
pas le cas, la liste
des shells supportantla fonctionnalitéest indiquéepar un tableau ressemblantà
celui-ci :
ksh bash
Danscet ouvrage,Plnterpréteur
/usr/bin/shfait référenceau BourneShell.

Programmation shell sous Unix/Linux


Û Chapitre2 : Mécanismes
essentiels
du sheII

Commandes internes et externes . . . . . . . . . . . 22

IPFFP
Affichage à l'écran
. . . . . . . . . . . . . . . . . 26

Le caractère (tilde) . . . . . . . . . . . . . . . . 28

La commande interne cd . . . . . . . . . . . . . . . 30

Substitution de noms de fichiers . . . . . . . . . . . 30

Séparateur de commandes . . . . . . . . . . . . . . 36

Redirections . . . . . . . . . . . . . . . . . . . . 37

. Tubes de communication. . . . . . . . . . . . . . . 53

Regroupement de commandes . . . . . . . . . . . . 62

Processusen arrière-plan . . . . . . . . . . . . . . 73
Seller .

A. Commandes internes et externes


Ce chapitreprésenteet expliquede manièredétailléeles fonctionnalitésde basedu
shell courammentutiliséesdans les commandesUnix.
UnecommandeUnix appartientà l'une
des deuxcatégoriessuivantes:

1. Les commandes externes

Une commandeexterneest un fichier localisédans l'arborescence.


Par exemple,
lorsqu'un
utilisateurlance la commande1s, le shell demandeau noyau Unix de
chargeren mémoirele fichierlusr/bin/ls.
Sont considéréscomme commandesexternesles fichiers possédantl'un
des for-
matssuivants:
- Fichiersau format binaireexécutable;
- Fichiersau format texte représentantun script de commandes(qui peut être
écrit en Shell ou dansun autre langagetel que le Perl).
La commandefile donne une indication sur le type de donnéescontenuesdans
un fichier.

Exemples
La commande1s est un fichier au format binaire exécutable.Résultat de la
commandefile .-
S file /usr/bin/ls
/usr/bin/ls: ELF32 bit MSBexecutable SPARCVersion 1,
dynamically linked, stripped
La commandemonscript est un script shell. Résultatde la commandefile :
S file /home/christie/monscript
monscript: ascii text
La commandemonscript. p1 est un script perl. Résultat de la commande
file:
S file /home/christie/monscript.p1
monscript.pl: ascii text

Programmation shell sous Unix/Linux


Mécanismes essentiels du shell
ma:

o L'argument
delacommande
file estunnomde chierexprimé
enrelatif
ou
en absolu.

Les commandesexternessont exécutéespar l'intermédiaire


d'un
shell enfant
(cf. Figure1).
1èreétape:Duplication
dushell

ksh ksh
PI U1 e!» PID 2B5

Sls
forkO

2èmeétape:Lecodedushellenfantestsubstitué
parle codedela commande
"|s"
exec()

ksh I
D1

I5
PID 205

Figure1 : Exécutiond'une
commandeexterne

rights
A/I
Ieserved
2. Les commandes internes

Une commandeinterneest intégréeau processusshell (c'est


le shell qui exécute

Éditions
ENI
l'action).
Elle ne corresponddonc en aucuncas à un fichier sur le disque.

©
Lacommande
interneestexécutée
parleshellcourant(cf.Figure2).
1èreétape:Lancement
dela commande
"cd".Le
shellreconnaît
l'une
desescommandes
internes

Répertoire
courant
fhomefohristie

ksh
PID=2E|1
5 cdftmp (l)

la valeurdeson
2èmeétape:Leshellmodifie
répertoire
courant

Répertoire
courant (2)
ftrnp

ksh
PID=2Ü1

Figure2 .-Exécution
d'une
commande
interne
Lacommande
type indiquesi unecommande
possède
uneimplémentation
interne.

Exemples
Lacommande cd estunecommande
interne.
S type cd
cd is a shell builtin
La commande 1s estunecommande
externe.
S type 1s
ls is /usr/bin/ls
Mécanismes essentiels du shell

D typeprend
enargument
lenomd'une
commande.
Sicette
dernière
n'est
pas
interne,elle est recherchéedans les répertoirescités dans PATH(cf. chapitre
Paramétrage de l'environnement
de travail - Variablesd'environnement).

3. lmplémentation interne et implémentationexterne


Certainescommandes ont une implémentationinterneet une implémentation
externe.
Dansce cas :
- la commandeinterneest lancéeen priorité ;
- l'exécution
d'une
commande interne est plus rapide que l'exécutiond'une
commandeexterne;
- la commandetype indiqueque la commandeest interne,mais ne précisepas
qu'il
existeégalementune implémentationexterne.

Exemple
La commandepwd est une commandeinterne au shel/ :
S type pvd
pwdis a shell builtin
La commandepwd possèdeégalementune implémentationexterne:
S ls -1 /usr/bin/pwd
r xr x: x 1 bin bin 4616Oct 6 1998/usr/bin/pwd
C'est
la commandeinternequi est exécutéeen priorité:
S pwd
/home/christie
Pourforcer l'exécution
de la commandeexterne,il faut indiquerexplicitementl'em-
placementde la commande(en absoluou en relatif) :

rights
réserve-d
AII
S asr/hin/pwd
/home/christie
S cd /usr/bin
S ./pwd
/usr/bin

ENI
Editions
S

sh, ksh, bash


B. Af chage à l'écran
1. La commande echo

La commandeinterneecho permetde réaliserdes affichagesà l'écran.

Exemple
S echoVoici un livre sur la programmationshell!
Voici un livre sur la programmationshell!
5
Certainscaractèresont, lorsqu'ils
sont placésentre quotes(apostrophesou guille-
mets),une significationspéciale.Ce sont des caractèresd'échappement.

6 Lacommande
echodubashdoitêtreutilisée
avecl'option
-e pourquel'inter-
prétationdes caractèresd'échappement
ait lieu.

a. Le caractère"\n"
Il sert à provoquerun saut de ligne.

Exemplesavec un she/l autre que bash


S echo "Voici un saut de ligne\net encore un autre\net le
saut de ligne naturel de la commande echo"
Voici un saut de ligne
et encore un autre
et le saut de ligne naturel de la commande echo
S
Lesquotessont obligatoires:
S echo a\nb
anb
S echo "a\nb"
a
b
S

Proraation shll os Unix/Linux


Mécanismes essentiels du shell

Exemplesavec un bash
S echo "a\nb"
a\nb
S echo -e "a\nb"
a
b
s

b. Le caractère"\c"
ll sert à éliminerle saut de ligne naturelde la commandeecho.

D Lecaractère
"\c"doitsesituer
impérativement
endernière
position
del'arg
ment de echo (justeavant le guillemetfermant).

Exemplesavec un shell autre que bash


S echo "PremiereLigne" ; echo "DeuxiemeLigne"
PremiereLigne
DeuxiemeLigne
S echo "PremiereLigne\c" ; echo "DeuxiemeLigne\c"
PremiereLigneDeuxieme Lignes

Exemplesavecun bash
L'option
e est indispensablepour l'interprétation
de "\c".
S echo -e "PremiereLigne\c" ; echo -e "DeuxiemeLigne\c"
PremiereLigneDeuxieme Lignes
L'option
-n remplace "\c"
S echo n "PremiereLigne" ; echo -n "DeuxiemeLigne"
Premiers LigneDeuxieme Lignes

Ail
rights
reselved
c. Le caractère"\t"
Il permetd'afficher
une tabulation.

Exempleavec un shell autre que bash

Éditions
ENI
- S echo "Voici 2 tabulations\t\tEt Voila ..."
Voici 2 tabulations
S
Et Voila ...

sh, , as
Qälïààmm
Exempleavecunbash
S echo-e "Voici 2 tabu1ations\t\tEt Voila ..."
Voici 2 tabulations Et Voila ...
S

d. Listedescaractères
d'échappement

Caractère
d'échappement Signification
\\ Antislash
\a Sonnerie
\b Effacement ducaractèreprécédent
\c Suppression dusautde ligneenfin de ligne
\f Sautde page
\n Sautde ligne
\r Retourchariot
\t Tabulationhorizontale
\v Tabulationverticale
\Oxxx Valeurd'un
caractèreexprimée
enoctal

2. Les commandes print et printf

Cesdeuxcommandes d'affichage
sontplusrécenteset serontprésentées
ultérieure-
ment(cf.chapitreAspects avancésde la programmation
shell Commandes d'affi-
chage).Leurdisponibilité
dépenddushellutilisé.

C. Le caractère N (tilde)
ksh bashI
Lecaractère
w représente
le répertoire
d'accueil
de l'utilisateur
courant.

Programmationshell sousUnix/Linux
Mécanismes essentiels du maman-man
shell

Exemples
L'utilisateur
courantse nommechristie :
s id
uid=505(christie) gid=505(ociensa)
Le répertoirecourantest /tmp :
S pwd
/tmp
Copiedu fichier /tmp/f1 dansle répertoired'accueil
(/home/christie).-
S cp il »
Copiedu fichier /tmp/f1 sousle répertoire/home/christie/docs
:
S cp E1 »/docs
Si le caractèreN est immédiatementsuivi d'un
mot, ce dernier est considéré
commeun nomd'utilisateur.

Exemples
Recopierle fichier f1 sous le répertoired'accueil
de l'utilisateur
sebastien
(noussupposonsque les permissionsadéquatessontpositionnées):
S cp f1 «sebastien
S 15 /home/sebastien/f1
f1
S
Recopierle fichier f1 sousle répertoirelhome/sebastien/rep
:
S cp f1 «sebastien/rep
S ls /home/sebastien/rep
f1

rights
AI/
reserved
Éditions
ENI
©

sh, ksh, bash


Chapitreba2 lîwb î
Lmvmx

D. La commande interne cd

Nousprésentonsici les syntaxesparticulièresde la commandecd.

Exemples
La commandecd sansargumentpermet à l'utilisateur
de revenirdans son réper-
toire d'accueil
.-
S cd
Mêmechoseen utilisant le caractèrew
ksh bash
S cd
Se déplacerdans le répertoired'accueil
de l'utilisateur
sebastien :
ksh bash
S pwd
/home/christie
S cd «sebastien
S pwd
/home/sebastien
Revenirdans le répertoireprécédentavec cd - :
ksh bash
S cd e
/home/christie

E. Substitution de noms de fichiers

De nombreusescommandesprennentdes noms de fichier en argument.Cesder


niers peuventêtre cités littéralementou être spécifiésde manièreplus générique.
Le shell proposeun certainnombrede caractèresspéciauxqui permettentde fabri-
quer des expressionsutiliséescommemodèlesde nomsde fichier.

Prgrammation
shellsousUnix/Linux
Mécanismesessentielsdu shell

1. Expressionsbasiques
a. Lecaractère*
Il représente
unesuitedecaractères
quelconques.

Exemples
S ls
E12fl.i FICa fiC.c fic.s monscript.plMONSCRIPT.pl
ours.c
Affichertouslesnomsde fichierse terminantpar . c :
S 1s *.c
fic.c ours.c
par la lettref :
Affichertouslesnomsde fichiercommençant
S ls f*
fl2 f1.i fic.C fiC.S

b. Lecaractère?
ll représente
uncaractère
quelconque.

Exemples
Affichertouslesnomsde fichierayantuneextension
composée
d uncaractère:
S 1s *.?
f1.i fic.c fic.s ours.c
Affichertouslesnomsde fichiercomposés :
de quatrecaractères
S le ????
fl.i FICa

reserved
rights
AII
c. Lescaractères
l]
Lescrochetspermettent de spécifierla listedescaractères
que l'on
attendà une
positionbienprécisedansle nomdufichier.Il estégalement possible
d'utiliser
les
notionsd'intervalle
et de négation.

-
EN/
Editlons
©

sh, ksh, bash


Chapitre
2
Exemples
Fichiersdontle nomcommence
par f ou o et se terminepar le caractère"."
suivi d'une
minuscule:
S 1s [fo]*.[a-z]
fl.i fic.c fic.s ours.c
Fichiersdont le nom comporteen deuxièmecaractèreune majusculeou un
chiffre ou la lettre i. Les deux premiers caractèresseront suivis d'une
chaîne
quelconque:
s 1s ?[A-ZO 9i]*
fl2 fl.i FICa fic.c fic.s MONSCRIPT.pl
Il estégalement
possible
d'exprimer
la négation
detouslescaractères
spécifiés
à
l'intérieur
d'une
pairedecrochets.
Cecisefait enplaçantunl enpremière
position
à l'intérieur
de celle-ci.- »

Exemple
Nomsde fichier ne commençantpaspar une minuscule:
S ls [! a-z] *
FICaMONSCRIPT.pl
ll est biensûr possiblede spécifierplusieursexpressions
sur la lignede com-
mande.Celles-cidevrontêtreséparées lesunesdesautresparunespace.
Exemple
Supprimer
touslesfichiersdontle nomseterminepar . c ou .s :
S rm -i *.c *.s
rm: remove fic.c'?
y
rm: remove ours.c'?
y
rm: remove fic.s'?
y
S

2. Expressionscomplexes

ksh bash

PogramatioshelousUnix/inx
Mécanismes essentiels du shell

D Pourutilisercesexpressions
en bash,il faut préalablement
activerl'option
extglob avecla commandeshopt (Shopt -s extglob).

Ces expressionsserventnon seulementà la générationde noms de fichier, mais


égalementdans deux autrescontextesqui serontdétaillésultérieurement(cf. cha-
pitre Les basesde la programmationshell - Exécutionde tests - La commande
[l 1]).Voici le contenudu répertoirequi sera utilisé dans les exemplessuivants:
S ls
fic fic866866.log fic867.log typescript
fic.log fic866866866.log fic868.log
fic866.log fic866868.log readme.txt

a. ?(expression)
L expression
sera présenteO ou 1 fois.

Exemple
Fichiers dont le nom commencepar "fic" suivi de O ou 1 occurrencede "866",
suivi de L/og":
s 1s fic?(866) .log
fic.log fic866.log

b. *(expression)
L'expression
sera présenteentre0 et n fois.

Exemple
Fichiersdont le nom commencepar "fic", suivi de Oà n occurrences)de 866",
suivi de "Jog":
S ls fic*(B66).log

Al/
rights
reserved
fic.log fic866.log fic866866.log fic866866866.log

c. +(expression)

ENI
Editians
-
L'expression
sera présenteentre 1 et n fois.

sh, ksh, bash


Chapitre 2
u.

Exemple
Fichiersdont le nomcommencepar "fic", suivi d'au
moins1 occurrencede "866",
suivi de "Jog":
S ls fic+(866).log
fic866.log fic866866.log fic866866866.log

d. @(expression)
L'expression
seraprésenteexactement1 fois.

Exemple
Fichiersdont le nom commencepar "fic", suivi exactementd'une
occurrencede
"866", suivi de ".log":
s ls fic@(866).1og
fic866.log

e. !(expression)
L'expression
ne serapasprésente.

Exemples
Fichiersdont le nom commencepar "fic", suivi d'une
expressionqui n'est
pas la
chaîne"866", suivi de ".log":
S 15 fic!(866).log
fic.log fic866866866.log fic867.log
fic866866.log fic866868.log fic868.log
S
Fichiersdont le nomne commencepaspar "fic" :
S ls !(fic*)
readme.txt typescript
5

Programmation shell sous Unix/Linux


Mécanismes essentiels du shell

f. Alternatives
Un barre verticale à l'intérieur
d'une
expressioncomplexeprend le sens de "ou
bien".
?(expressionlexpression|...

*(expressionlexpression|...
+(expressionlexpression|...

@(expression|expression|.

!(expressionlexpressionl...
Exemples
Fichiers dont le nom commencepar "fic", suivi de "866" ou de "867", suivi de

Ail
rights
resen/ed
IlllogllI,
S la fic@(866]867).1og
fic866.log fic867.log
S

Éditions
ENI
-
Fichiersdont le nom commencepar "fic", suivi de 1 à n occurrence(s)de - "866"
ou "868" -, suivi de "Jog":
s 1s fic+(866|868) .1og
fic866.log fic866866866.log fic868.log
fic866866.log fic866868.log
S
©
Fichiers dont le nom commencepar "fic", suivi de 1 occurrencede 1 à n fois
"866" ou de 1 à n fois "868" , suivi de "Jog":
Exemple

ksh
PID=2C|1 * l5
f12 f1.i FICafic.cfics manscriptqzl
MONSCRIPTÆÏ ours.c
Sls *.t

(2) *.s (l)

ksh(P[D=2EI1)
Remplace
"*.c:"d'abord,
"*.s"ensuite.

(3) Résultat
delasubstitution
(enmémoire)
ls LC ours.t c.s

îî-îl- IsfÎEJIours.cns
(4) duplication PID=2Ü5
+ remplacement

(5) l5regnit
enargument le
rasultatdela substitution

Figure3 : Traitementdes caractèresde générationde nomsde fichier

F. Séparateur de commandes
Le caractèrespécial; du shell permetd'écrire
plusieurscommandessur une même
ligne. Lescommandessont exécutéesséquentiellement.

Exemple
S pwd
nome/christie
S ls
S mkdir rep ; cd rep ; pwd
/home/christie/rep
Mécms

G. Redirections
Les redirectionssont courammentutiliséesdans les commandesUnix. Elles per-
mettentde récupérerle résultatd'une
ou de plusieurscommandesdans un fichier
ou au contrairede faire lire un fichier à une commande.Cette partie exposede
manièredétaillée les différentessyntaxespossiblesavec leur mécanismeinterne
associe.
Lesredirectionssont misesen placepar le shell.

1. Entrée et sorties standard des processus

Les processusUnix ont, par défaut,leur fichier terminalouverttrois fois, soustrois


descripteursde fichier différents.
a. Entréestandard
Le descripteurde fichier 0 est nomméégalementEntréestandarddu processus.
Les processusqui attendentdes informationsde la part de l'utilisateur
déclenchent
en fait une requêtede lecturesur le descripteurO. Si ce dernierest associéau ter-
minal, ce qui est le cas par défaut, cela se matérialisepour l'utilisateur
par une
demandede saisieau clavier.

0 Lamajorité
descommandes
utilisent
l'entrée
standard
pourdéclencher
une
saisie. Il existecependantdes exceptions.Par exemple,la commandepasswd
ouvrele fichier terminalsous un autredescripteur.

b. Sortiestandard
Le descripteurde fichier 1 est nomméégalementSortie standard du processus.

Ieserved
rights
AII
Par convention,un processusqui souhaiteenvoyerun messagerésultatà l'utilisa-
teur doit le faire transitervia le descripteur1. Si ce dernierest associéau terminal,
ce qui est le cas par défaut,cela se matérialisepour l'utilisateur
par un affichageà
l'écran.

Éditions
ENI
-
©

sh, ksh, bash


c. Sortied'erreur
standard
Le descripteurde fichier 2 est nomméégalementSortie d'erreur standarddu pro-
cessus.Par convention,un processusqui souhaiteenvoyerun messaged'erreur à
l'utilisateur
doit le faire transitervia le descripteur2. Si ce dernierest associéau
terminal, ce qui est le cas par défaut, cela se matérialisepour l'utilisateur
par un
affichageà l'écran.

2. Héritage

Lesdescripteursde fichierssont héritéslors de la duplication(forkO)et du rempla-


cement(execll). La figure 4 montre que le ksh enfant, puis la commandefind
héritentde la table des descripteursde fichiers du shell parent.Cette commande
envoiesur la sortie standardles résultatset sur la sortie d'erreur
standardla liste
des répertoiresque l'utilisateur
n'a
pas le droit d'explorer.
Commeles sorties1 et 2
sont orientéessur le mêmeterminal, les affichagess entrelacent.L'un
des intérêts
des redirectionsest de pouvoir séparer les messagesprovenant de chaque
descripteur.
ksh Î! l ksh 'l
PID=2D1

Ü eldev/Dtsfl Ü 4î/devfpts/1
résuItats
1 - b/devr pts/1 1 - >/dav/pt5; 1
erreurs
2 îP/dev/ptS/l 2 îÿjdewpts/l
l
S ndf marne passwd
find:cannot
readdirflost+fnund:
Permission
denied
fvar/adrnfpasswd
lusr/bin/passwd
find:cannot
readdirfusr/aset:
Permission
denied
fetcfdefault/passwd
letc/passwd
S

Figure4 : Héritagede la table des descripteursde fichiers

Pgamin sll osnix/inùÎÉ"


Mécanismes essentiels du shell

3. Redirection des sorties en écriture

La redirectionen écriturepermetd'envoyerles affichagesliés à un descripteurpar-


ticulier, non plus sur le terminal, maisdans un fichier.

a. Sortiestandard

Simple redirection

Syntaxe
S commande
1> fichier
équivalentà :
S commande > fichier
Le nom du fichier est expriméen relatifou en absolu.
Si le fichier n'existe
pas, il est créé.Si le fichier existedéjà, il est écrasé.

0 L'opération
decréation
oud'écrasement
dufichier
estréalisée
parleshell.
Exemple
Récupérerle résultat de la commandels dans le fichier resu :
S 1s > resu
S cat resu
FIC
erreur
outl
resu
S

AII
rights
reserved
Doubleredirection
Elle permetde concaténerles messagesrésultatd'une
commandeau contenud'un

Éditions
ENI fichier déjà existant.

sh, ksh, bash


Syntaxe
S commande
1>> fichier
équivalentà :
S commande >> fichier
Si le fichier n existepas, il est créé. Si le fichier existedéjà, il est ouverten mode
ajout.

Exemple
Ajouterle résultat de la commandedate à la fin du fichier resucréé précédem-
ment :
S date >> resu
S cat resu
FIC
erreur
outl
resu
Tue Jan 21 18:31:56 WET2003
5

b. Sortied'erreur
standard

âimple redirection

Syntaxe

Scommande
2>fichier
Exemple
Redirectionde la sortie d'erreur
standard.Les messagesd'erreur
partent dans le
fichier erreur,les résultatsrestentà l'écran
.-
S find / namepasswd2> erreur
/var/adm/passwd
/usr/bin/passwd
/etc/default/passwd
/etc/passwd
S cat erreur
Mécanismes essentiels du shell

find: cannot read dir /usr/aset: Permissiondenied

Doubleredirection

Elie permetde concaténerles messagesd'erreur


d'une
commandeau contenud'un
fichier existant.

Syntaxe
S commande
2>> fichier

Exemple
Concaténationdes messagesd'erreur
de ls-z à la fin du fichier erreur:
S la -z
ls: illégal option -- z
usage:ls -1RaAdCxmnlogrtucpFbqisfL [files]
S 15 -2 2>>erreur
S cat erreur
find: cannotread dir /lost+found: Permissiondenied
find: cannotread dir /usr/aset: Permissiondenied
ls: illégal option -- z
usage:ls -lRaAdCxmn1ogrtucpFbqisEL [files]
S

c. Sortiestandardet sortie d'erreur


standard
il est possiblede redirigerplusieursdescripteurssur une même ligne de com-
mande.

A/l
rights
reserved
S commande l> fichier_a 2> fichier_b
OU
S commande
2> fichier_b l> fichier_a

Editions
EN/
- 0 Lesredirections
l'ordre
sonttoujours
d'écriture
traitées
degauche
à droite.
Dans
iecasprésent,
des deux redirectionsn'a
pas d'importance,
ce qui ne sera pas
toujoursle cas (cf. sectionRedirections Redirectionsavancées).
©

sh, ksh, bash


Chapitre2

Exemple
S find / namepasswd1> resu 2> erreur
S cat resu
/var/adm/passwd
/usr/bin/passwd
/etc/default/passwd
/etc/passwd
S cat erreur
find: cannotreaddir /lost+found:Permissiondenied
find: cannotreaddir /usr/aset: Permission
denied
S

d. Éliminer
lesaffichages
Toutesles plates-formesUnixpossèdentun fichierspécialnomméldev/nullqui
permetde fairedisparaître Ce fichierest géré commeun périphé-
lesaffichages.
pas de notionde contenu.On peut doncconsidérer
riqueet n'a qu'il
esttoujours
vide.

Exemple
S find / -namepassvd1> resu 2> /dev/null
S cat resu
/var/adm/passwd
/usr/bin/passwd
/etc/default/passwd
/etc/passwd
S ls -1L /dev/null
crw rw rw l root sys 13, 2 Jan21 17:22 /dev/null
S cat /dev/null
S

Programmation
sellousUnix/Liux
Mécanismes essentiels du sheii

e. Mécanismeinterne

Casde la commandeexterne
C'est
le shell enfantqui s'occupe
des redirections(cf. Figure5 et Figure6).
:5findJ-narnepasswd1>resu2>fdeu/ nai!
1èreétape:Les redirections
sontmisesenplace
parle shellenfant

ksh ksh

p1D=2o1
PID=2D5

Ü î fdevfptsfl
EI
dîfdev/ptsfl
î? fdevfnull

Figure5 : Mécanismeinterne des redirectionsen écriture Premièreétape


2èmeétape:Le shellenfantseremplace
parfindqui

A/I
rights
reserved
héritede|atabledesdescripteurs
defichierdushell

- > r i
ksh

ENI
Editions
- PID=2Ü1
©
Ü {î fdev/pts/l

Îpresu
Casde la commandeinterne
Une commandeinterneest exécutéepar le shell courant.Ce derniergère lui-même
les redirections.Pour cela, il sauvegardeles associationsdescripteur-fichiercou-
rantes,connecteles descripteurssur les fichiers demandés,exécutela commande,
puis restaurel'environnement
descripteur-fichierprécédent.

4. Redirection de l'entrée
standard

La redirectionde l'entrée
standardconcerneles commandesqui utilisentle descrip-
teur O, autrementdit cellesqui déclenchentune saisieau clavier.

Exemple
S mail olive
RVa 13 heures au restaurant (Entrée standard)
Christine (Entrée standard)
"d (Entrée standard)
S
La commandemail lit l'entrée
standardjusqu'à
réceptiond'une
fin de fichier (tou
ches Ad). Lesdonnéessaisiesserontenvoyéesdans la boîteaux lettresde l'utilisa-
teur olive.
Si l'on
souhaitefaire lire à la commandemail, non plus le clavier, mais le conte-
nu d'un
fichier, il suffit de connecterle descripteur0 sur le fichier désiré.

Syntaxe
S commande
0< fichier_message
équivalentà
S Commande < f1chier_message

Exemple
S cat message
RVa 13 heures au restaurant
Christine
S mail olive < message
S

Programmton
shll ss Unix/Linux
Mécanismes essentiels du shell

Les gures 7 et 8 représententle mécanismeinterneassocié.


Smailolive< message
1èreétape:Laredirection
estmiseenplaceparle
shellenfant

ksh ksh

PID=2D1
PID=2Ü5

0 î message
Üqîfdevfptsfl

îh fdevfptsll 1
îÿ fdevfptsfl
vrdevrptsr1 2 b fdevf tsïl

Figure 7 .-Mécanismeinterne de la redirectionen lecture - Premièreétape


2èmeétape:La
commande maildéclenche
une
lecture
dudescripteur
U

reserved
rights
AI/ ksh

Éditions
ENI
» PID=2Ü1

©
Chapitre
iÿläèxz i2
unmowmuwu

Syntaxesincorrectes
S commande
1> fichier 2> fichier
S commande
l> fichier 2>> fichier
Leproblèmeneréside
pasdanslefaitquel&#39;on
ouvre
deux
foislemêmefichier
(ce
quiestparfaitement
légal
auseind&#39;un
même processus),
maisqu&#39;il
y a unoffset
(position
courante
danslefichier)
associéà chaque
ouverture.
Quelles
sontles
conséquences
?
Laséquence
desrésultats
danslefichier
neserapasforcément
représentative
de l&#39;ordre
dans lequelse sont déroulésles évènements.
- Lesrésultats
émisà traverslesdescripteurs
1 et 2 risquent
desechevaucher.
Lesfigures
9 et 10présentent
lemécanisme
interne
associé
à lacommande
sui-
vante :
S find / namepasswd1> resu 2> resu

Première
étape(cf. Figure9)
Traitementde la redirection1> resu :
Leshellouvrelefichierresu(lefichierestcrééavecunetailleégale
à 0) et l&#39;as-
socieaudescripteur
1 (1, 2, 3, 4, 5). Lorsqu&#39;un
processus
ouvreunfichier,il y a
toujours
unenregistrement
alloué
danslatabledesfichiers
ouverts
dunoyau(2)
(celle-ci
regroupe
toutes
lesouvertures
defichierdusystèmeà uninstant
donné).
L&#39;enregistrement
contient le moded&#39;ouverture
du fichier(ici écriture),
ainsique
l&#39;emplacement
courantdanslefichier(ici,l&#39;écriture
surledescripteur 1 commence-
raendébutdefichier).
Leposte1 (1)dela tabledesdescripteurs defichiers
du
processus
contient
unpointeur
(p2)versl&#39;enregistrement
delatabledesfichiers
ouverts.
Traitementde la redirection2> resu :
Leshellouvrede nouveau
le fichierresuen écriture(6, 7, 3, 4, 5) (le fichierest
écrasé,
cequin&#39;est
pasgrave
puisque
latailleétaità 0) et l&#39;associe
audescrip-
teur 2. Un nouvelenregistrement
est créé dans la table des fichiersouverts
(p3)(7).Lesopérations
d&#39;écriture
ultérieures
surledescripteur
2 seferont
à partir
du débutde fichier.

Programmation
shellsousUnix/Linux
Mécanismes essentiels du shell

0 Danslecasdu2>> resu,lefichierauraitétéouvert
enmode
ajout: position-
nementen fin de fichier (donc O octet). Les écrituresultérieuressur le descrip-
teur 2 garantissentl&#39;écriture
en fin de fichier. Cette solution peut produireun
résultatconvenabledans certainscas, mais reste néanmoinsincorrecte(2 off-
setsdifférents).
5findr -namepasswd
1> resu2>resu
1èreétape:Traitement
desredirections
parle shell
enfant
ESPMïE NOYAU
ksh

PID=2Ü5

mode:écriture
offset:CI (7)
Shellenfant
PluP2;I335
pointeurs
sur
"enregistrement
de Tabledesfichiersouverts
latabledesfichiers
Ouverts (tousprocessus)

Ail
rights
reserved
correspondant
fichierspécial
p5 inDdedufichier jdeV/ptsjl
> fdevfptsfl .

ENI
Editions
- a
À
D5 &#39; &#39;
&#39;"°"°,ïïj&#39;îÿÿ"
_. raziezazäï:
F(5)
&#39; F h&#39;

© Tabledesinodes
Blocsdedonnées
Figure9 : Gestiondes offsetsdans les redirections Premièreétape
a . ,.
Qæeuxième
étape(cf.Figure
10)
Le shellse remplace
par la commande
find qui héritede la tabledesdescrip-
teurs de fichiers.Simulationdu fonctionnementde la commandefind :
- find envoiesur le descripteur1 un messagerésultatde 20 octets(1, 2, 3...) ;
- ces 20 octets sont écrits à partir de l&#39;offset
0 (2). Puis, l&#39;offset
prend la
valeur 20 (3) qui sera utilisée lors de la prochaineécriture sur la sortie
standard;
le fichier grossitde 20 octets(4) ;
- find envoiesur le descripteur2 un messaged&#39;erreur
de 10 octets(5) ;
- ceux-ciserontécrits en début de fichier (l&#39;offset
du descripteur2 vaut 0 (7)), et
vont donc écraser le messageécrit précédemment(8). L&#39;offset de la sortie
d&#39;erreur
passeraensuiteà 10 (7).
Conclusion: le fichier est inexploitablepuisqueles messagesd&#39;erreur
et de résultat
se chevauchent.

Programmation
shell sousUnix/Linux
Mécanismes essentiels du shell

2ème
étape:
Exécution
defind
ESPACE
NOYAU

20octets(l)

(2)
2 D5
(5) p2 V
1l]octets

(6) mode:
écriture
p6
D3 offset:,3 1D(7)
Shellenfant

Table
desfichiers
ouverts
(tousprocessus)

fichier
spécial
D5 innde
du chier fdevfptsfl
Kdev/ptsfl Î!-
ps V A_ 2l]octetsderésultat
s4)
> Inude
dufichier
/ p6 resu

A/I
reserved
rights Table
desinodes

10nctetsd&#39;erreurs
(8)

Editions
ENI
- Ü
BYFSLI
rerre
1a 2o
fichierresu
Bluesdedonnées
©
Figure10 : Gestiondes offsetsdans les redirections- Deuxièmeétape
QÊLËQÊËEÊ
....
Syntaxescorrectes
Pourobtenirun résultatcorrect,il faut utiliser l&#39;une
des deuxsyntaxessuivantes:
S commande l> fichier 2>&1
OU
S commande
2> fichier l>&2
Lafigure11 représente
le mécanisme
interneengendré
parla première
syntaxe
:
Traitementde la redirectionl> resu :
Mêmemécanismeque précédemment : créationdu fichier resu, allocationd&#39;un
en-
registrementdans la table desfichiersouverts,offsetà 0 (1).
Traitementde la redirection2>&1 :
Pour traduire cette expressionen français, on peut dire que le descripteur2 est
redirigésur le descripteur
1 (représenté
par 841).La choseimportante
à com-
prendreest que le shell, grâceà cette syntaxe,duplique(2) simplementl&#39;adresse
du descripteur1 dans le descripteur2. Les deux descripteurspointentalors (p2)
sur le même enregistrementde la table des fichiers ouverts,et par conséquent,
partagentle mêmeoffset. ll n&#39;y
a pas d&#39;allocation
d&#39;un
nouvelenregistrementdans
la table des fichiersouvertsdu noyau.Lesécrituresultérieures,qu&#39;elles
soientémi-
ses par la sortieou la sortied&#39;erreur
standard,se servirontdu mêmeoffset.

Programmationshell sousUnix/Linux
Mécanismes essentiels du shell

Sfindf marnepasswd
1> resu2>&1
ESPACE NOYAU

Shellenfant Tabledesfichiersnuverts
(tousprocessus)

fichierspécial
p3 inodedufichier fdev/ptsil
ÿ fdev/pts/l Îÿ

p4 inode
dufichier fichierresu
_ __ b taille=üoctet

reserved
rights
AII
Tabledesinodes Blocsdedonnées
(buffercache)

Figure11 : Redirectionde deuxdescripteursdansle mêmefichier

Éditions
ENI
- La syntaxe1> resu 2>&1 n&#39;est
cas, la sortied&#39;erreur
pas équivalenteà 2>&1 1>resu. Dansle second
standardest redirigéevers la sortiestandard,c&#39;est-à-dire
vers
le terminal. Puis la sortie standardest associéeau fichier resu. Conclusion: les
messagesd&#39;erreur
sont dirigés vers le terminal et les messagesrésultat dans le
© fichier resu.

sh, ksh, bash


FR &#39;
t ..
b. La doubleredirectionen lecture
Elle est principalementutilisée dans les scripts shell. Elle permet de connecter
l&#39;entrée
standardd&#39;une
commandesur une portiondu script.

E iämîère
sætaxe
commande<<ETIQUETTE
données
données
données
ETIQUETTE

Deuxièmesyntaxe
commande
<< ETIQUETTE

données

données

données

ETIQUETTE
Le symboleplacéà la suite des caractères< est une déclarationd&#39;étiquette.
Cette
dernièresera utilisée pour marquerla fin des donnéesà lire. Les lignes insérées
entre les deux mots ETIQUETTEseront envoyéessur l&#39;entrée standard de la
commande.

Exemple
S mail olive <<FIN
Mécanismes essentiels du shell

c. Fermetured&#39;un
descripteur

Descripteurfermé Conséquence
O commande<&- L&#39;entrée
standardde la commandeest
fermée, cette dernièrene pourra donc
pas s&#39;en
servir pour recevoirdes don-
nées.
1 commande>& La sortiestandardde la commandeest
fermée, cette dernièrene pourra donc
pas s&#39;en
servir.Aucunmessagerésultat
ne pourras&#39;afficher
à l&#39;écran.
2 commande2>&- La sortie d&#39;erreur
standardde la com-
mande est fermée, cette dernière ne
pourra donc pas s&#39;enservir. Aucun
messaged&#39;erreur
ne pourras&#39;afficher
à
l&#39;écran.

H.Tubes de communication
Un tube (pipe en anglais)permetde faire communiquerdeux processus.Le tube
est représentépar une barreverticale(touches[Alt Gr] 6 sur un clavierAZERTY)
situéeentredeuxcommandesUnix. Le résultatde la commandede gaucheva par-
tir dans le tube, tandis que la commandede droite va en extraireles donnéesafin
de les traiter.

reserved
A/I
rights
Editions
ENI
-
©

sh, ksh, bash


Cha itre 2

Lesfigures12 et 13 représententle mécanismeinterneassociéau tube de com-


munication.
Swho| mailolive
1èreétape:
Mise enplace
dutubeentreles2 shells
enfant

fork

(1)

ksh ksh
PID=2Ü5 (2) PID=2Ü6

n o
1 (3)
2 (4) 2
1

1ershell 2èmeshell
enfant enfant

Figure12 .-Mécanismeinternedu tubede communication Premièreétape


2èmeétape:
Chaque
shellseremplace
avecsa
commande

Figure13 : Mécanismeinternedu tubede communication- Deuxièmeétape


Quellesque soient les commandesprésentesde chaquecôté du tube, le shell de
travail détectele caractère| sur la ligne de commandeet va engendrerun shell
Mécanismes essentiels du shell

Lesshellsenfantsn&#39;ont
rien d&#39;autre
à faire et chacunva se remplaceravecsa com-
mande (5a et 5b). Chaquecommandecommencealors à s&#39;exécuter. Lorsquela
commandewho écrit sur sa sortie standard, les messagespartent dans le
tube (6a). Parallèlement,la commandemail lit son entréestandard(Gb), ce qui
provoquel&#39;extraction
des donnéescontenuesdans le tube.

Quelquesremarquesimportantes

- La sortied&#39;erreur
standardde la commandede gauchene part pas dansle tube.
- Pour que l&#39;utilisation
d&#39;un
tube ait un sens, il faut que la commandeplacéeà
gauchedu tube envoiedes donnéessur sa sortie standardet que la commande
placéeà droite lise son entréestandard.

1. Commandes ne lisant pas leur entrée standard

Un certain nombrede commandesUnix n&#39;ont aucun intérêt à être placéesderrière


un tube, car elles n&#39;exploitent
pas leur entréestandard.C&#39;est
le cas par exemple
des commandessuivantes: Is, who, find, chmod, cp, mv, rm, in, mkdir, rmdir,
date, kill, file, type, echo...

2. Commandes lisant leur entrée standard

Les commandesqui lisent leur entréestandard sont facilement identifiablescar


ellesdemandentune saisieau clavier.

a. Exemplestriviaux
S mail olive
saisie clavier

Al/
rights
reserved
saisie clavier
"d
S
S write olive
saisie clavier

ENI
Editions
- saisie clavier
"d
S

©
s, h, bah
Cesdeuxcommandespeuventdonc être placéesderrièreun tube :
S who I mail olive
S echo "RVpour dejeuner a 13 heures" I write olive

b. Casdes filtres
Sous Unix, un certain nombrede commandessont regroupées sous le nom de fil-
tres. Les pius communessont : grep, cat, sort, cut, wc, ip, sed, awk... Cescom-
mandespeuventfonctionnerde deuxmanières:

Premièremanière
La commandereçoitau moinsun nom de fichier en argument.

Exemple
S wc -1 /etc/passwd
46 /etc/passwd
Ici, cette commandene lit pas son entrée standard.Elle n&#39;a
aucun besoinde le
faire puisqu&#39;elle
a reçu un nom de fichier en argument,c&#39;est
donc le contenude
ce dernier qu&#39;elle
va traiter. Placer cette commandederrière un tube n&#39;est
pas
impossible
maisest inutilecarla commande
n&#39;extraira
jamaislesdonnées
conte-
nuesdans celui-ci.

Exemple
S who [ wc -1 /etc/passwd
46 /etc/passwd
5
La commande who écrit dans le tube. Son résultat n&#39;apparaîtra donc pas à
l&#39;écran.
Par contre la commandewc se moque éperdumentde son entrée stan-
dard (puisqu&#39;elle
reçoit un fichier en paramètre),donc par extensiondu contenu
du tube. Elle ouvrele fichier letc/passwden lecture, comptele nombrede lignes
du fichier et affiche le résultatsur sa sortie standard.

Deuxièmemanière
nuaæamæmmnx
La commandene reçoit aucun nom de fichier en argument.Dansce cas, la com-
mandeva traiter les donnéesqui arriventsur son entréestandard.

Programmationsheli sous Unix/Linux


Mécanismes essentiels du shell

Exemle
La commandewc comptele nombrede lignes qui arriventsur son entrée stan-
dardet affiche le résultatsur la sortiestandard.-
S wc-1
saisie clavier (Entrée standard)
saisie clavier (Entrée standard)
saisie clavier (Entrée standard)
Ad (Entrée standard)
3 (Sortie standard)
S
Il est doncpossiblede placercette commandederrièreun tube :
S who I wc -1
4
S
Commentsavoirsi une commandelit sonentréestandard&#39;.&#39;
Voici deux méthodesqui permettentde savoir si une commandelit son entrée
standard:
- Linformationest contenuedansie manuelde la commande.

Exemple
Voiciun extrait de la pagede manuelde la commandewc On constateque l&#39;ar-
gument [ file . . . ] est facultatif, ce qui est unepremièreindication.
S manwc
SYNOPSIS

All
rights
reserved
wc[-ci-mi-C] [-lw] [file...]

Un peu plus, loin, se trouve l&#39;explication


de l&#39;argument
file ; si le nom de
fichier est omis, la commandelit sonentréestandard.

ENl
Éditions
- file A path nameof an input file. If no file operands
are specified, the standard input will be used.

sh, ksh, bash


ÇhaBitre
mg n

- Uneautrepossibilité
consisteà testerla commande
sansdonnerde nomde
fichier en argument:

Premierexemple
Voiciunecommande
qui traiteun fichier.Ellene déclenche
pasde lecturede
l&#39;entrée
standard:
S cut -d :&#39;
-f1,3 letc/passwd
root:0 (Sortie standard)
biml (Sortie standard)
daemomZ (Sortie standard)
admz3 (Sortie standard)
S
Il est doncinutile de placercette commandederrièreun tube :
S echo "1:2:3:4" | cut -d&#39;:&#39;
-f1,3 letc/passwd
root:0 (Sortie standard)
bin:1 (Sortie standard)
daemon:2 (Sortie standard)
admz3 (Sortie standard)

Voici la même commandesans le nom du fichier. La commandeattend une


saisieau clavier:
S cut -d&#39;:
-f1,3
l:2:3:4 (Entrée standard)
1:3 (Sortie standard)
10:20:30:40 (Entrée standard)
10:30 (Sortie standard)
lO0:200:300:4OO (Entrée standard)
lOO:30O (Sortie standard)
d (Entrée standard)
S

Programmationsheli sousUnix/Linux
Mécanismes essentiels du sheii

Cettecommandepeut doncêtre placéederrièreun tube :


5 echo "1:2:3:4" lcut -fl,3
-d&#39;:&#39;
1:3
S

Deuxièmeexemple
Voiciune autre commandequi traite un fichier. Elle ne déclenchepas de lecture
de l&#39;entrée
standard:
S file /etc/passwd
/etc/passwd: ASCII text
La mêmecommandesansle nom du fichier génèreun messaged erreur.Le nom
du fichier est doncobligatoire:
5 file
Usage:
file [*bciknvzL] [-f namefile] [emmagicfiles] file...
Usage:
file -C [-m magic]
Placéederrièreun tube, elle affiche le mêmemessaged erreur.Il est donc inu-
tile d&#39;insister,
cette commandene lit passon entréestandard:
S cat /etc/passwd | file
Usage:file [-bciknvzL] [-f namefile] [-m magicfiles] file...
Usage:file C [-m magic]
S

r/ghts
A/I
reserved
Casparticulierde certainescommandes
La majoritédescommandesne se soucientpasde savoirsi eliessont placéesder-
rière un tube ou non. Pour une commandedonnée, l&#39;action
sera toujours la
même:

Edltlons
ENI
-Exemple
c:

-1litson
wc entrée
standard
dans
les
deux
cas
:
ChaBitre2
Quelquescommandesfont exceptionà la règle.Ellestestentsi leur entréestandard
est connectéesur la sortied&#39;un
tube ou sur un terminal.
C&#39;est
le cas de la commandemore :

Exemples
La commandemore reçoit un nom de fichier en argumentet pagineson contenu
à l&#39;écran.
E/le ne lit pas son entréestandard:
S more /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/
adm:x:3:4:adm:/Var/adm:/sbin/nol
--Encore--(43%)
Sans le nom du fichier, la commandeaffiche un messaged&#39;erreur (l&#39;argument
[filename] est pourtant facultatif !). Ici, more ne lit pas son entréestandard.-
5 more
Usage:more [-cdflrsuw] [ lines] [+linenumber][+/pattern] [filename ...].
Le nom du fichier peut être omis lorsque more est placée à droite d&#39;un
tube,
Dansce cas, elle lit son entréestandardet pagine les lignesqu&#39;elle
y extrait :
S cat /etc/passwd | more
root:x:0:0:root:/root:/bin/bash
binzxz1:lzbin:/bin:/sbin/nologin
daemon :x12:2 zdaemon :/sbin :/Sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
Encore--(43%)
S
Mécanismes essentiels du shell

Exem le
Afficher le nombrede connexionsde l&#39;utilisateur
christie .-
S who | grep christie | wc -1
3

b. Dupliquerles sorties
La commandetee permet de visualiserun résultatà l&#39;écran
et de le conserver
égalementdansun fichier.

Exemples
La commandetee affiche sur sa sortie standardles lignes extraitesdu tube et
les écrit égalementdans le fichier Iistefic. Si Iistefic existedéjà, il est écrasé:
S ls l tee listefic
Desktop
FIC
fichier
S cat listefic
Desktop
FIC
fichier
S
Le résultat de la commandedate est affiche à l e&#39;cran
et concaténe(ajout) au
fichier Iistefic existant.-
S date | tee -a listefic
lun jan 27 17:54:21 CET2003
S cat listefic

All
reserved
rights
Desktop
FIC
fichier
lun jan 27 17:54:21 CET2003

Éditions
EN/
S

sh, ksh,bas
Chapitre2
c. Envoyer
lasortie
standard
etlasortie
d&#39;erreur
standarddansletube

Exemples
Lacommande
suivanteafficheunmessage
d&#39;erreur
et unelignede résultat:
S ls -1 f* Z*
ls: Z*: Aucunfichier ou répertoire de ce type
rw rw r - 1 christie cours 110 jan 22 14:21 fichier
S
Seulela sortiestandardpassedansle tube:
S ls -1 5* z* | tee listefic
ls: Z*: Aucunfichier ou répertoire de ce type (affiché par ls)
rw rw r -1 christie cours110 jan 22 14:21 fichier (affiché par tee)
S cat listefic
-rw-rw-r-- 1 christie cours 110 jan 22 14:21 fichier
S
- Redirections
En utilisantla duplicationde descripteur(cf. Redirections avan-
cées),la sortie2 estredirigéesurla sortie1 (terminal):
S ls -l f* z* 2>&1 I tee listefic
ls: Z*: Aucunfichier ou répertoire de ce type (affiche par tee)
-rw rw-r- 1 christie cours110 jan 22 14:21 fichier (affiché par tee)

S cat listefic
ls: Z*: Aucunfichier ou répertoire de ce type
vrw-rw r 1 christie cours 110 jan 22 14:21 fichier
S

I. Regroupementde commandes
Leregroupement
decommandes
peutêtreutilisépour:
- rediriger
ia sortieécrandeplusieurs
commandes
versunmêmefichierouvers
untube;
faireexécuter
plusieurs
commandes
dansle mêmeenvironnement.

Programmation
shelisousUnix/Linux
Mécanismes
essentiels
du shell
Exemple
Seule la sortie standardde la deuxièmecommandeest redirigéedans le fichier
resultat.
S date ; ls > resultat
mar jan 28 05:16:30 CET2003
S cat resultat
FIC
fichier
S
Les parenthèses( ) et les accoladesi } permettentde regrouperles comman-
des. Dansle premiercas, les commandessont exécutéesà partir d&#39;un
shell enfant,
dans le deuxièmecas à partir du shell courant.

1. Les parenthèses

Syntaxe
(cmdel ; cmde2; cmde3)
Avecles parenthèses, un shell enfantest systématiquement
créé et c&#39;est
ce dernier
qui traite la lignede commande(avecduplicationsultérieuressi nécessaire).

Premierexemple
Ici, l&#39;utilisateur
se sert des parenthèsespour redirigerla sortie standardde deux
commandes:
S (date ; ls) > resultat

All
rights
reserved
S cat resultat
mar jan 28 05:21:36 CET2003
FIC
fichier
S

Éditions
ENI
- Lesfigures 14, 15 et 16 représententle mécanismeinterneassocié.Le shell cou-
rant (P|D=201) se duplique(1). Le shell enfant (P|D=205) s&#39;occupe
redirection(2), se duplique ensuite pour l&#39;exécution
d&#39;abord
de la
de la commandeexterne
date (5). Lorsquecette dernièreest terminée (7), se duplique à nouveaupour
© exécuterls (8).

sh,h, bash
Chagitre2
Grâceau mécanismed&#39;héritage,les deux commandesutilisent le mêmeoffset (3).
Doncles écrituresdans le fichier se succèdent.
S( date; ls) > resuitat

ksh

PID=2Ü1

1 pdevlpîs/l
2
fnrk
1èreétape:Création
d&#39;un
shellenfant
(1)

ksh

fichier
resultat
(4)

Figure14 .-Premierexemple
de regroupement
avecparenthèses
- Première
étape
Mécanismes essentiels du shell

2èmeétape:Exécution
dela commande
date

ksh

P1D=2Ü5

Tabledes
fichiers

ouverts
u (noyau)
1 e» Essai;
me 2 (3) (4)

Figure15 : Premierexemplede regroupementavecparenthèses-


Deuxièmeétape

rlghts
AII
resen/ed
Edltiona
ENI
-
Cha itre 2

3èmeétape:Exécution
delacommande
Is

Tabledes
fichiers
Ü
ouverts
A2 (noyau)
(ml;
1 m * Ïïlîtër
(3) (4)

Figure16 : Premierexemplede regroupementavecparenthèses


Troisièmeétape

Deuxièmeexemple
Lescommandespwd et ls ont pour répertoirecourant/tmp .-
5 pwd
/home/christie
S (cd Nm? i pwd r 1s) > listefic
S cat listefic
/tmp (résultat de pwd)
dCopNYSrKn (liste des fichiers de /tmp
listetmp
Mécanismes essentiels du shell

Lorsquel&#39;exécution
des trois commandesest terminée,le shell de premierniveau
reprendla main. Sonrépertoirecourantest toujours/home/christie.
S pwd
/home/christie
S
Lesfigures17 et 18 représententle mécanismeinterneassocié.Le shell de travail
a pourrépertoirecourant/home/christie(1). Commedans l&#39;exemple
ci-dessus,il y
a créationd&#39;un
shell enfant (2). Ce dernierva exécuterlui-mêmela commande
internecd (3) (le répertoirecourantdu shell enfant change(4)), puis la com-
mandeinternepwd (5) (qui affiche/tmp), puis se duplique(6) pour l&#39;exécution
de
la commandeexterne1s qui héritedu répertoire/tmp (7).
Lorsquetoutes les commandessont exécutées(8), le shell de premier niveau
reprendle contrôle.Sonrépertoirecourantest toujours/home/christie.

1s(cd.ftmp;pwd;is)
1èreétape:Création
d&#39;un
shellenfant
Exécutiondescommandes ccletpwd

fhomefchri
stie( 1)

ksh

PID=2Ü5

A/I
rights
reserved
3S
cdltmp (3)
SinwdR)
Lÿ ftrnp

ENI
Editians
- Figure17 : Deuxièmeexemplede regroupementavecparenthèses-
Premièreétape

©
2èmeétape:Exécutiondela commandei5

IUTID(7)

ksh a
PID=2Ü5

4l
(B)

Figure18 : Deuxièmeexemplede regroupementavecparenthèses-


Deuxièmeétape

2. Les accolades

Syntaxe
( cmdel; cmde2; cmde3; }
Les accoladesouvrante et fermante doivent être respectivementsuivies et
précédéespar un espace.
- La dernièrecommandedoit êtresuivied&#39;un
;.
La lignede commandeest traitéepar le shell courant(avecduplicationsultérieures
si nécessaire).

Premierexemple
Lesdeuxcommandessuivantesproduisentle mêmerésultat,mais la versionavec
accoladesest plus rapide:
S ( date ; ls) > resultat
S i date r 1s ; ) > resultat

Programmation shell sous Unix/Linux


Mécanismes essentiels du shell

Lesfigures19, 20, 21 et 22 représententle mécanismeinterneassociéaux acco-


lades. Le shell de travail sauvegardeses associationsdescripteur-fichiercouran-
tes (1), traite lui-mêmela redirectiondemandée(2), se duplique pour l&#39;exécution
de la commandeexternedate (5), puis lorsquecette dernièreest terminée(7), se
dupliqueà nouveaupour exécuter1s (8). Lorsqueles commandessont terminées,
le shell de premier niveau reprendla main (10) et restaureson environnement
descripteur-fichier(11).
{ date,&#39;
Is g} > resultat
1èreétape:Sauvegarde
du descripteur
1

ksh
PID=
2U1
l

Ü
1 et» [devfpts/
1
2
L&#39;association
descripteur1

AII
rights
reserved
"fdev/ptsjl" est sauvegardée (1)

Figure19 : Premierexemplede regroupementavecaccolades- Premièreétape

Editians
ENI
-
©
Cha itre 2

2èmeétape:Lancement
dela commande
date

ksh

flChlBFS
ouverts
I] (noyau)
2 . .
1 J a» üääaiat
2 (a) (4)
furk+e>oec

(5)

Table
des
fichiers

ouverts
o (noyau)
1 a ïtzaazt
2
g (3) (4)
Figure20 : Premierexemplede regroupementavecaccolades- Deuxièmeétape
Mécanismes essentiels du shell

3èmeétape:Exécution
dela commande
Is

ksh &#39;
PID=2Ü1

Tabledes
fichiers
ouverts
(noyau)

a fichier
Ü (3)
resuitat
(4)
1
A 2
(1oJi__

Ail
rights
reserved
Figure21 .-Premierexemplede regroupementavecaccolades- Troisièmeétape

4èmeétape:Restauration
dudescripteur
1

Editioris
ENI
- ksh
PID 2B1
i
Restauration
de l&#39;association
descripteur
1 "fdev/ptsfl"(11)

© Ü
EËLËRÊÆLÊ
Deuxièmeexemple
Ici, Penvironnement
du shelldepremierniveauvaêtremodifié,ce qui n&#39;est
pas
forcémenttrès intéressant:

S pwd
xome/christie
S
S ( cd ltmp ; pwd ; 1s ; ) > listefic
S
S cat listefic
/tmp
dcopNYSrKn
listetmp
5 pwd
/tmp
S
Lesfigures23 et 24 représentent
le mécanisme interneassocié.Leshelldetravail
sauvegardesesassociationsdescripteur-fichier
courantes,traitelui-mêmela redi-
rectiondemandée.Il exécuteensuitela commandeinternecd (1) (son répertoire
courantchange(2)), puisla commande internepwd(3) (quiaffichedonc/tmp),
puisse duplique(4) pourl&#39;exécution
de la commande externels qui héritedu
répertoire
/tmp(5). Lorsque 1s estterminée, le shelldetravailreprendla mainet
restaureson environnementdescripteur-fichier.Par contre,son répertoirecourant
reste/tmp. La commandepwd le confirme(6).
{ cdltmp,&#39;
pwd5ls,-} > listefic
1èreétape:Exécution
descommandescdetpwd

Scdftmratl)
Mécanismes essentiels du shell

2ème
étape:
Exécution
de
lacommande
ls
s
Fork+exec

Spwd(6)

Figure24 : Deuxièmeexemplede regroupementavecaccolades


Deuxièmeétape

3. Conclusion

Lesparenthèses sont plus utiliséesque lesaccoladespourles deuxraisonssuivantes:


- leur syntaxeest plus simpleà utiliser ;
- quel que soit le jeu de commandes, on est toujours sûr de retrouver
l&#39;environnement
de travail initial.
L&#39;utilisation
des accoladesse justifieradans le cas d&#39;une
recherchede performance.

All
rights
reserved
J. Processus en arrière-plan
Les notionsd&#39;arrière
et plan
d&#39;avant-plan
sont géréespar le shell.

Éditions
ENI
- Par défaut, les commandessont lancéesen avant-plan.Dans ce mode, le shell
parents&#39;endort
en attendantla fin de la commande.Il reprendla main uniquement
lorsquela commandeest terminée.
Le caractères est un caractèrespécialdu shell qui permetde lancerla commande
© en arrière-plan.Le shell lance la commandeet réafiiche immédiatementson
prompt en attente d&#39;une
nouvellecommande.Comme le shell et la commande
s&#39;exécutent
en parallèle et qu&#39;ils
sont tous deux liés au même terminal, il est
ChaEitre2

Exemple
Le shell affiche le P/D de la commande(8247), ainsi que sonindex ([1]) dansla
liste des tâchesen arrière-planlancéesà partir de ce shell :
S find / -size +20001>/1&#39;.\np/resu
2 >/dev/nu1l&
[l] 8247
S

Programmation
she||sousUnix/Linx
9 Chapitre
3 : Paramétrage
de l&#39;environnement
de travail
Variables
d&#39;environnement
. . . . . . . . . . . . . . 76

F9997?
dushell. . . . . . . . . . . . . . . . .
Lesoptions 89
Lesalias. . . . . . . . . . . . . . . . . . . . . . 92
Historique . . . . . . . . . . . . . .
decommandes 93
Lesfichiersd&#39;environnement
. . . . . . . . . . . . . 102
gitan"? 3 V.

A. Variables d&#39;environnement

à l&#39;utilisateur
Lesthèmesabordésdansce chapitrepermettront de paramétrer
son
environnement
detravailentenantcomptedushellutilisé.
Un certainnombrede variablessontdéfiniesdansl&#39;environnement
du shell.Elles
contiennent
desinformationsnécessaires
au fonctionnement
de Pinterpréteur
et/ou
descommandes lancéesà partirdecelui-ci.

1. Liste des variables


Lacommande
set donnela listedesvariables
définiesdansle shellcourant.

Exemple
S set

HOME:/home/christie

LOGNAME=christie

PATH=/usr/bin:/bin

&#39;
Ps1=&#39;s
PS2=> &#39;
&#39;
TERM=Vt1OO
Paramétrage
del&#39;environnement
detravail
Exemple
S variable=valeur
S echo Svariable
valeur
S
Si la valeurcontientdes caractèresspéciauxdu shell (S, >, espace...) il faut em-
pêcherle shell d&#39;interpréter
ceux-cien entourantla valeuravecdes simplesquotes.

0 Utiliser
dessimples
quotes
estl&#39;une
destroismanières
demasquer
descarac-
tèresen shell. Ce point seradétailléultérieurement.

Exemple
Le symbole">" (redirection)doit être masqué,l&#39;espace
(séparateurde mots sur la
ligne de commande)également:
S variab1e= motl mot2 =>&#39;
S echo Svariable
motl mot2 =>
5

0 ll nefautpasmettre
d&#39;espace
autour
dusigne
=. Leshell
necomprendrait
pas
qu&#39;il
s&#39;agit
d&#39;une
affectation.

4. Principales variables

Les variablesprésentéesci dessouspossèdentune valeur au niveau du shell de


connexion.D&#39;autres
variablespeuventêtre définiesultérieurement.

A/l
rights
reserved
a. HOME
Cettevariablecontient la valeur du répertoired&#39;accueil
pas être modifiée.
de l&#39;utilisateur.
Elle ne doit

Editians
EN/
- b. PATH
La variable PATHcontient une liste de répertoiresqui sont exploréspar le shell
lorsqu&#39;une
commandeexterneest lancée.
©

sh, ksh, bash


0 Enaucuncas,unecommande
n&#39;est
recherchée
dansle répertoire
courant
si
celui-cinefigurepasdansla variablePATH.

S echo SPATH
/usr/bin:/bin

5
La commandedate est trouvée:
S date
Tue Jan 28 l7:5l:23 MET2003
S
Eneffet, elle se situe dansle répertoire/usr/bin :
S find / namedate 2> /dev/null
/usr/bin/date
S
La commandeping n&#39;est
pas trouvée:
S ping localhost
ksh: ping: not found
S
La commandeest située dans le répertoire/usr/sbin qui n&#39;est
pas cité dans la
variablePATH:
S find / nameping 2> /dev/null
/usr/sbin/ping

S
Le répertoirecourantn&#39;est
pas explorés&#39;il
n&#39;est
pas cité dansPATH.-
S cd /us:/sbin
Paramétrage
de l&#39;environnement
de travail
Modifier le contenude la variablePATH:
s PATH=SPATH : /usr/shin
S echo SPATH
/usr/bin:/bin:/usr/sbin
S

La commandeping est trouvée.-


S ping localhost
localhost is alive
S

Rechercher
,.
unecommande
dansle répertoire
courant
Pour
qu&#39;une
commande
soitrecherchée
danslerépertoire
courant,
il faut ajouter
enfindevariable
PATH
lachaîne
":."ousimplement
lecaractère
":".
Exemple
PATH=/usr/bin:/usr/local/bin:/home/christie/bin:.
Équivalentà :
PATH=/usr/bin:/usr/local/bin:/home/christie/bin:
c. PWD

ksh bash
Cette
variable
contient
lavaleur
durépertoire
courant.
Elleestmise
àjourparle
shelldèsquel&#39;utilisateur
changederépertoire.
Cettevariable
peutêtreutilisée
en
kshpourfaireapparaître
lavaleur
durépertoire
courant
dansleprompt.
d. PS1

AII
rights
reserved
Cette
variable
Exemple
contient
lachaîne
decaractères
représentant
leprompt
principal.

Éditions
ENI
-
S echo SPS1
s
S PS1=&#39;Entrez
une commande =>
Entrez une Commande => date
Thu Jan 3o 17:27:51 MET2003
Entrez une commande =>
©

sh, ksh, bash


Avecle ksh et le bash, il est possiblede paramétrerson promptde telie façonqu&#3
contienneen permanencela valeurdu répertoirecourant.

Faire apparaîtrela valeur du répertoirecourantdans le prompt en ksh


Il faut se servirde la variablePWD.

Exemple
Ici, le prompt est composede deuxcaractères: le symbole"î" suivi d&#39;un
espace
(cf. Figure1) :

VariableValeur Exportation?

Figure1 : Initialisationde PS1 avec le répertoirecourant(l)


S
S echo -SPS1-
-5 _
S
Le répertoirecourantest lhome/christie.-

Spwd
Ünome/christie
S
Paramétra e de l&#39;environnement
de travail

Initialisationde PS1 avec la chaînede caractèresREPWDS...


; il faut empêcher
le shell de substituer RPWDpar sa valeurau momentde l&#39;affectation,
donc il
faut protégerl&#39;expression
avecdesquotes(cf. Figure2) :

s
SPs1=&#39;SPWDS&#39; -&#39;

Khome/ christie

Figure2 : Initialisationde PS1avecle répertoirecourant(2)


Le shell doit maintenantréafficherson prompt. Il va chercherla valeurde PS1
RPWDÆH}.La variablePWD est évaluéeet remplacéepar sa valeur (actuelle-
ment/home/chris tie).
ïome/christies
Changementde répertoire:
mome/cnristies cd ltmp

All
reserved
Ilghts
ENI
Edilions
-
©
EËÆEÀEEG
..
Le shell met immédiatementà jour la variablePWD qui vaut maintenant"/tmp".
Puisil doitréafficher
sonprompt.Il retourne
chercher
la valeurdePS1(SPWDS-a)
et Pévalue.PS1a doncpour valeur"/tmp"(cf. Figure3) :

Figure3 : Initialisation
dePS1avecle répertoire
courant(3)
/tmp S pwd
/ tmp
/tmp S

Faireapparaître
l5valeur
durépertoire
courant
dansleprompt
enbash
Il estpossible
d&#39;employer
la mêmetechnique queci-dessus.ll existecependanten
bashdesséquences d&#39;échappement
possédantunesignification
particulière
qu&#39;il
est
pratiqued&#39;utiliser
pourinitialiserPS1.Letableausuivantprésente lesprincipales l
séquences:

Séquence
d&#39;échappement Valeur
\u Nom
del&#39;utilisateur
\h Nom
delamachine
\w Répertoire
courant
\W Partieterminaledu répertoirecourant

0 Lesséquences
d&#39;échappement
doivent
toujours
êtreplacées
entrequotes
(sim-
plesou doubles).

Programmation
shellsousUnix/Linu)?
Paramétrage
de l&#39;environnement
de travail
Exemple
Promptdu bash .-
S
Modificationdu prompt de telle sorte qu&#39;apparaisse
le nom de la machine suivi
du répertoirecourant:
s Ps1=&#39;\h@\wS
&#39;
rumba@"S pwd
/home/christie
rumba@*S ls -1
drwxr-xr x 2 christie christie 4096déc 1 16:22 C
drwxr xr x 2 christie christie 4096oct 23 2001Desktop
rumba@"S cd C
rumba@"/C5 cd /tm
rumba@/tmps

0 Lecaractère
«-représente
enbash
etenkshlerépertoire
d&#39;accueil
del&#39;utilis
teur.

e. PS2
Cettevariablecontient la chaînede caractèresreprésentantle prompt secondaire.
Celui-ciapparaîtlorsqueles élémentsde syntaxeshell sont incomplets.
Premierexemple
Tant que le shell ne trouvepas la quote fermante,il attend la suite de la com-
mande:

AI/
righis
reserved
S echo Affichage du caractere *
> je
> dois
> fermer maquote (Fin de la commande)
Affichage du caractere * &#39;
(Résultat de l&#39;exécution)

ENI
E
©
- ditions
je
dois
fermer maquote
S

sh, ksh, bash


SËERÀELÊL
..
Deuxièmeexemple
Tantque le shell ne rencontrepas / étiquette%, il attend la suite du message:
mail christie <<%

{DVVVU}
Salut
Comment vas tu ?
% (Fin de la commande

f. TMOUT
Cettevariablecontientun délai expriméen secondes.Si aucuneinteractionavecle
claviern&#39;a
eu lieu pendantce délai, le shell se termine. Lorsquela valeurest O, le
timeoutest désactivé.

g. TERM
Cettevariableest en principecorrectementinitialisée.Elle contient le type de ter-
minal de l&#39;utilisateur.
Les valeurs les plus courantessont : ansi, vt100, VÏZZÛ,
dtterm, xterm. Cesvaleursrenvoientà un fichier de paramétragedu système(base
de donnéesterminfo).

Exemple
S echo STERM
Vt100
S find / namevt100 2> /dev/null (Recherchedu fichier vt100
/usr/share/terminfo/V/vt100
S

h. LOGNAME
Cettevariablecontientde nom de l&#39;utilisateur
connecté.
S echo SLOGNAME
christie
S

Progratinsell sousUnix/Linux
i. Processus
et variablesd&#39;environnement
Lesvariablesd&#39;environnement
ne sontpastoutesutiliséespar lesmêmesproces-
sus.Onpeutdistinguer troiscatégories
devariables:
cellesquisontutilisées
uniquement parle shell(ex: PS1,PS2);
- cellesquisontutiliséesparde nombreuses commandes et éventuellement
parle
shell(ex: PATH,TERM);
- cellesquisontutilisées
parunecommande bienprécise(ex: EXINITpourvi).

5. Exportation des variables

Lesvariablesdéfiniesau niveaudu shellne sontpastransmises auxcommandes


lancéesà partirde celui-ci.Pourqu&#39;elles
le soient,il fautdemander au shellde les
exporter.Un certainnombredevariablessontexportées pardéfaut.
a. Listedesvariablesexportées
Lacommande
interneenv affichelesvariables
exportées
dushellcourant.

Exemple
Les
variables
PS1
etPS2
ont
été
redéflnies
dans
leshell :
courant
S set

HOME=/home/Christie
rights
A/l
reserved
LOGNAME=christie
-
Editions
EN/
©

PATH=/usr/bin:/bin
g gpître3
b. Variablesdevantêtre exportées
Lesvariablesutiliséespar des processusautresque le shell doiventobligatoirement
être exportéespour être transmises.

Variable Utiliséeuniquementpar le shell &#39;.&#39;


Exportationobligatoire?
PATH non oui
PS1 oui non
PS2 oui non
PWD oui oui
HOME non oui
LOGNAME non oui
TERM non oui
TMOUT oui non

c. Exporterune variable
Une variable exportéeau niveaud&#39;un shell sera transmiseà tous les processus
issusde la mêmefiliation, quel que soit le niveaude descendance.

Syntaxe
Exporterune variabledéjà définie:
S expert MAVARIABLE
Définiret exporterunevariable:
S MAVARIAELE=valeur
S expert MAVARIABLE
0U

ksh bash
S expert MAVARIABLE=valeur

Premierexemple
La variableutilisée pour la démonstrationest EXlNlT.Ce|le ciest consultéepar la
commandevi et contientla liste des optionsà positionnerdans l&#39;éditeur.

Progammation
seil sousUnix/Linu
,,Prétrae e "evîot d il
La figure 4 montrequ&#39;une
variablenon exportéen&#39;est
pas transmiseaux processus
descendantdu shell :
la variableEXINITest initialiséemais non exportée(1) ;
- la commandevi est lancée.Elle ne reçoit pas la variableEXINIT.Les numéros
de ligne ne serontdonc pas positionnés(2).
Conclusion: sansexportation,la définitionde la variableEXlNlTest inutile.
Définition
delavariable
E><INIT

(l) SEXINIT=&#39;set
number ksh
s vi progx
PID=2ü1

VariableVal
eur Exportation?
moma/diristie
EKINIT setnumber

(2) Leprocessus
vinereçnit
paslavariable
EXINIT

1*prog.c
"f >
alfinclude
<stdio.h
main{

A/l
Iights
reserved
pvintf("hnnjour\n");

}
ENI
E
©ditians Variable
Valeur Exportation?
HOME fhpm /drristie
nui

Figure4 : Définition de variable


Cha itre 3

Deuxièmeexemple
La figure 5 montre qu&#39;une
variableexportéeest transmiseaux processusdescen-
dantsdu shell :
- la variableest définiepuis exportée(1) ;
- elle est donc reçue par le processus vi qui positionne les options
demandées(2).
Dé nition
etexportation
delavariable
EXINIT
nurnber
SEXINIT=&#39;set
EXINIT
Sexport
SviDFDQL ksh
PID=2Ü1
(1)
VariableValeur
HOMElhome/ctlnstie
È
EXINIT
sel:
number
E

Leprocessus
vireçoit
lavariable
EXINIT
1f prnga:
"Y
k5 2 indude
<stdinh>
PID2B1 3rnain(){
4
gprintf("bunjnur\ru"),&#39;
7}

Exportäzinn?
__
fhome/christie (2)
setnumher

Figure5 : Définition et exportationd&#39;une


variable
Paramétrage
de l&#39;environnement
de travail

B. Les options du shell


ksh bash
r
Le shell proposedes optionspermettantde paramétrerun certainnombrede fonc-
tionnalités.

1. Activer et désactiver une option du shell

Les options -o et +0 de la commandeinterne set permettentrespectivement


d&#39;activer
et de désactiverune option du shell.

Syntaxe
set -o option
set +0 option

2. Visualiser la liste des options

La commandeset avec l&#39;option -o affiche la liste des options du shell en indi-


quant si ellessont actuellementactivéesou non.
S set -o
Current option settings
allexport off
bgnice on
emacs on
errexit off
gmacs off

AII
reserved
rights
ignoreeof off
interactive on
keyword off
markdirs off
monitor on

ENI
Editions
-
noexec off
noclobber off
noglob off
nolog off
nounset off
© privileged off

sh, ksh, bash


E
restricted off
trackall off
verbose off
vi off
viraw off
xtrace off
notify off
S

3. Principales options
a. ignoreeof
Pourquitter un shell, il existedeuxméthodes:
- la commandeexit ;
- la séquencede touchesAd.
Si l&#39;option
ignoreeof est activée,il devientimpossiblede quitter le shell en ap-
puyantsur d.
L&#39;option
est désactivéepar défaut.

Exemple
S set -o ignoreeof
S Ad (Saisie Ad)
Use exit&#39;
to terminate this shell

b. noclobber
Lorsqu&#39;uneredirectionest faite vers un fichier déjà existant,celui»ciest écrasésans
sommation (sous réservedes permissions).Pour être averti de l&#39;existence du
fichier, il faut activerl&#39;option
noclobber.

Exemple
L&#39;option
noclobber est désactivée:
S set -o | grep noclobber
noclobber off
S echo Bonjour > resu
S ls -1 resu

rgrammationsell us nix/Linux
Paramétrage
de l&#39;environnement
detravail
rw-r r 1 christie christie 8 jan 31 17:04 resu
S cat resu
Bonjour
S

Le fichier resu vaêtre écrasé:


S echoAu revoir > resu
S cat resu
Au revoir
S

Activationde l&#39;option
noclobber :
S set -o noclobber

Impossibled&#39;écraser
resu:
S echoMerci noclohber > resu
ksh: resu: file already exists
5 cat resu
Au revoir
S

Pour
forcer
l&#39;écrasement,
il faututiliser
laredirection
>| .-
3 echoMerci noclohber >| resu
S cat resu
Merci noclobber
S

L&#39;option
noclobber estdésactivée
pardéfaut.

All
rights
reserved
c. emacset vi
Ces
options
permettent
deparamétrer
lerappel
decommandes
(cf.Historique
de
commandesdansce chapitre):

É
ENl
- ditions
©
- enksh,cesdeuxoptions
sontdésactivées
pardéfaut
;
- enbash,l&#39;option
emacsestactivéepardéfaut.

Sh, ksh, bash "


Chapitre3
d. Xtrace
Cetteoption est utiliséeen programmationsheil pour déboguerles scripts (cf. cha-
pitre Les basesde la programmationshell Miseau point d&#39;un
script). Cetteoption
est désactivéepar défaut.

C. Les alias

ksh bash

Le shell proposeune commandeinternealias qui permetde créerdes raccourcis


sur des commandes.Un certainnombred&#39;a|ias
existentpar défaut.

1. Définir un alias

Exemple
Créationde trois alias : 1, c, et m qui serontrespectivement
les équivalentsde
ls -1, clear et rm i :
S alias l=&#39;1s
-1
S1
total 30
-rw-r--r-- 1 christie cours 11428Jan 28 06:19 out
rw r r - 1 christie cours 22 Jan 31 17:08 out2
rwxr r - 1 christie cours 18 Nov 15 20:08 premier
rw r r - 1 christie cours 51 Jan 28 06:22 resu
S alias c=&#39;c1ear&#39;
S alias rm= rm-i
S rm out
rm: removeout (y/n)? n
S

2. Visualiser la liste des alias

a. Visualisertous les alias


S alias
autoload=&#39;typeset
-fu&#39;

Pogramaionhil sus Unix/Linux


Paramétrage
de l&#39;environnement
de travail

c=clear
functions=&#39;typeset
-f
history=&#39;fc
l&#39;
integer=&#39;typeset
-i&#39;
l=&#39;ls
1&#39;
local=typeset
r=&#39;fc
-e e
rm=&#39;rm
-i&#39;

b. Visualiserun alias en particulier


S alias 1
l=&#39;ls
-1
S

3. Supprimer un alias
S unalias 1
S1
ksh: l: not found
S

D. Historique de commandes
ksh bash

AII
r/ghts
reserved
Le shell stockeles commandeslancéesdans un fichier texte localisédans le réper-
toire d&#39;accueil
utilisé.
de l&#39;utilisateur.
Le nom de ce fichier diffère en fonction du shell

ENI
Edlt/ons
(D
-ksh
bash
Shell Fichier historique
.sh history
.bash history
Pour rappeler les commandesstockéesdans ce fichier, le shell proposedeux
options: emacs et vi.
Chapitre
3
Ces deux options sont mutuellementexclusives: l&#39;activation
de l&#39;une
désactive
l&#39;autre.
En ksh, elles sont toutes deux désactivéespar défaut. En bash, l&#39;option
emacs est activéepar défaut.
Paramétragepar défaut en ksh :
S set o
Current option settings
emacs off
vi off
S
Paramétragepar défaut en bash .-
S set -0
Current option settings
emacs on
Vi off
S

1. Paramétrerle rappel de commandesen ksh


a. Optionvi
Le shell proposed&#39;utiliser
des commandesidentiquesà cellesde l&#39;éditeur
vi pour
rappeler et éventuellementmodifier les commandesstockées dans le fichier
/.sh_history.ll faut pour cela activerl&#39;option
:
S set -o vi

0 Lecaractère
représente
enbash
etenkshlerépertoire
d&#39;accueil
del&#39;utilisa
teur.

À partirde maintenant,
il fauts&#39;imaginer
dansl&#39;éditeur
vi. Certaines
actionss&#39;effec-
tuent en modecommande,d&#39;autres
en modeinsertion.Le tableausuivant regroupe
les principalescommandesqui permettentde gérerl&#39;historique.

éProgmation shellus Uix/Linux


_ Paramétrae
del&#39;environnement
detravail
Actionsen modeinsertion
C&#39;est
le modepardéfaut.Lemodeinsertion
permetdesaisirou modifierunecom-
mande.

Action Commande
Saisiruncaractère Caractère
désiré
Lancerla commande Return
Passeren modecommande ESC
Retirerla signification
spécialeducaractère
suivant "v
Retirerla signification
spécialedescaractères
"ki|l"(Au) \
et "erase"("h ou "?)

Actions
en
mode
commande

Action Comma
Remonter l&#39;historique k
Descendre l&#39;historique j
Sedéplacerà droitesurla commande l
sélectionnée

rfghts
A/l
reseNed
Sedéplacerà gauchesurla commandesélectionnée h
Supprimer le caractère
courant x
Supprimer le caractère
précédent paramètre"erase"
de
stty(" h ou A?)

-
Editions
ENI
Supprimerla lignecourante dd
Passeren modeinsertion (sansdéplacement
ducurseur)
Passeren modeinsertion (déplacement
ducurseur
endébutde ligne)
©
Passeren modeinsertion (déplacement
ducurseur
d&#39;une
position à droite)
Passeren modeinsertion (déplacement
ducurseur
0 h représente
latouche
[Retour
arrière]
(backspace)
eto?représente
latouche
[Suppr](ou [Del]).

b. Optionemacs
Le shell proposed&#39;utiliser
des commandesidentiquesà celles de l&#39;éditeur
emacs
pour rappeleret éventuellementmodifier les commandesstockéesdans le fichier
/.sh_history.ll faut pour cela activerl&#39;option
:
S set -o emacs

0 Lefaitd&#39;avoir
l&#39;éditeur
emacs installé
ounonsurlesystème
n&#39;a
strictement
aucuneincidencesur le fonctionnementde l&#39;option
emacs, celui-ci étant géré
par le shell.

Le tableau suivant regroupeles principalescommandesqui permettentde gérer

l&#39;historique.

Action Command
Remonterl&#39;historique
(previous) " p
Descendrel&#39;historique
(next) "n
Sedéplacer
à droitesurlacommande "f
sélectionnée(forward)
Se déplacerà gauchesur la commandesélectionnée " b
(backward)
Supprimerle caractèrecourant d
Supprimerle caractèreprécédent paramètreerasede
stty ("h ou A?)
Supprimerla ligne courante paramètrekill de
stty l" u)
Saisirun caractère Caractèredésiré
Lancerla commande Return
Afficherla versiondu shell "x"v
Retirerla significationspécialedu caractèresuivant \
un»: M Paramétrage
de l&#39;environnement
de travail
"3
Pourun utilisateurpeu familier avec les éditeursvi et emacs,toutes ces comman-
des peuventparaîtrecompliquées.
Dansce cas, il est recommandéd&#39;utiliser
le modeemacscar avec un paramétrage
supplémentaire,les flèches du clavier peuvent être utilisées pour parcourir
l&#39;historique.
Représentationdes flèches:

Symbolereprésentantles flèchesen modeemacs Flèchecorrespondante


_ _A [Flècheen haut]
_ _B [Flècheen bas]
_ _C [Flècheà droite]
_ _D [Flècheà gauche]
La commandealias permetde faire correspondreles flèchesdu clavieravecdes
commandesdu modeemacs.
Voici la manièredont il faut s&#39;y
prendre:
Si l&#39;option
emacs n&#39;est
pas déjà positionnée,il faut l&#39;activer
:
S set -o emacs
L&#39;exemple
qui suit met en correspondancela flèche haute avec la commande
emacs qui remontel&#39;historique
: "p.
Unechoseimportanteà savoir:
À droitedu symbole
d&#39;affectation,
il faut insérerle codede la touche"p en main-

AI/
rights
reserved
tenant la touche [Ctrl] enfoncéepuis en appuyantsur p. Etant donnéque le mode
emacs est positionné,le fait d&#39;appuyer
sur "p n&#39;affiche
pas "p, mais remonte
l&#39;historique
(c&#39;est
normall), Il faut donc masquerla significationspécialede "p en
le faisantprécéderdu caractère\ (caractèrede protectiondu modeemacs).

EN/
Editians
- Voici ce qui doit apparaîtreà l&#39;écran
S alias _A="P
:

h, ksh,bh
Chapitre3
Voici les caractèresqu&#39;il
faut saisir pour obtenirla ligne précédente:
S alias __A=\[Ctrl]p
En procédantde la mêmemanière,voici les trois autresalias à créer:
S alias __B=*N
S alias C= F
S alias =B

D Sicesalias
sontsaisis
dans
unfichier
deparamétage
enutilisant
l&#39;éditeur
vi,il
faut utiliser "v et non pas \ pour retirer la significationspécialedu caractère
suivant.

Affichagedes alias :
L&#39;affichage
de la liste des alias à l&#39;écran
envoieles caractères"P, "N,"F,"B
sur le terminalet perturbecelui-ci. La figure 6 représentel&#39;effet
obtenu.

_r&#39;
&#39;+.=-
l-="s-&#39;sl-
- -

Figure6 : Affichagedes alias sur les flèches


Pour éviter ce phénomène,il faut envoyerla sortie de la commandealias vers
l&#39;entrée
de la commandecat v.

Exemple
L&#39;option
-v permet d&#39;afficher
de manièrevisible les caractèresnon affichables:
S alias | cat -v
__A="P
_B="N
Paramétrage
de l&#39;environnement
de travail
_C="F
_D=*B
autoload=&#39;typeset
fu&#39;
è..

2. Paramétrerle rappel de commandesen bash


Enbash,la gestionde l&#39;historique
est beaucoupplussimple.Commeen ksh,les
optionsemacset vi sontdisponibles,
l&#39;option
emacsétantactivéepardéfaut.La
correspondance
commandes emacs49flèchesclavierestautomatique.
L&#39;utilisateur
quipréfère l&#39;option
vi pourra
activer
cettedernière
enlançant
la com-
mandesuivante:
S set -o vi
Lescommandes
sontstockées
dansle fichierw/.bash_history.

3. La complétion de noms de fichiers


Lacomplétion
estunefonctionnalité
proposée
parle kshet le bash.Enappuyant
sur lestouchesde clavieradéquates,
le shellpeutcompléter
automatiquement
un
nomde fichierou proposerla liste desfichiersdisponibles
dansun répertoire
donné.

a. La complétiondu bash

A/I
rights
reserved
Exemple
Editians
ENI
Voici
laliste
des
fichiers
du
répertoire
courant
:
© S ls
fl fic2.txt fic3.txt fic.txt prog.c
En tapant la première lettre d&#39;un
nom de fichier suivi du caractère tabu/ation
gnllapitre3
Lorsqu&#39;il
y a plusieurspossibilités,le shell ne complètepas :
S ls fic ? Le bash ne fait rien z S ls fic
Si l&#39;utilisateur
saisit deux tabulationsà la suite, le shell affiche les différentes
possibilités:
S 1s fic < i>°°
fic2.txt fic3.txt fic.txt
L&#39;utilisateur
complète le nom du fichier avec une suite de caractèresdiscrimi-
nants,suivisd&#39;une
tabulation:
S ls fic2°° complétion du bash : S 1s fic2.txt
Lorsquele fichier complétéest un répertoire,le shell ajoute un "/" en bout de
chaîne:
S mkdir repl
S touch repl/fLc rep1/f2.c
S cd f Complétiondu bash : S cd repl/
Cequi permetéventuellementd&#39;enchaîner
sur uneautredemandede complétion:
S 1s r ? complétion du bash : S ls repl/
S ls rep1/f°°°*
fl.c f2.c

b. La complétiondu ksh
Modevi

Les exemplesci-aprèsprésententles touchesclavier qui permettentde gérer la


complétiondes noms de fichiers lorsquel&#39;utilisateur
travailleavec ksh paramétré
en modevi (set-o vi).

Exemple
Voicila liste desfichiers du répertoirecourant:

31s
f1 fic2.txtfic3.txtfic.txt prog.c
Praétr . e l v t de travail

En tapant la premièrelettre d&#39;un


nom de fichier suivi des touches[Echap] l, le
ksh complèteautomatiquementla saisiepar le nom du fichier du répertoirecou-
rant qui commencepar la lettre "p", à conditionque le répertoiren&#39;en
contienne
qu&#39;un
seul, ce qui est le casici :
S 1s p[Echap]\ Complétiondu ksh : S ls prog.c
Lorsqu&#39;il
y a plusieurspossibilités,la touche[Echap]= permetde lister les diffé-
rentespossibilités:
S ls f[Echap]= Liste les différentes possibilités
1) fl
2) fic2.txt
3) fic3.txt
4) fic.txt

Modeemacs

Lesexemplesci-dessousprésententles touchesclavierqui permettentde gérerla


complétiondes nomsde fichiers lorsquel&#39;utilisateur
travailleavec ksh paramétré
en modeemacs(set-0 emacs).

Exemple
Voicila liste des fichiersdu répertoirecourant:
S ls
fl fic2.txt fic3.txt fic.txt prog.c
En tapant la premièrelettre d&#39;un
nom de fichier suivi de deux occurencesde la
touche[Echap],le ksh complèteautomatiquementla saisiepar le nom du fichier
du répertoirecourantqui commencepar la lettre "p", à condition que le réper-

rights
AII
reserved
toire n&#39;en
contiennequ&#39;un
seul, ce qui est le cas ici :
S ls p[Echap][Echap]Complétiondu ksh : S ls prog.c

EN/
Editions
-
Lorsqu&#39;il
y a plusieurspossibilités,la touche[Echap]= permetde lister les diffé-
rentespossibilités:
S ls f[Echap][Echap] Aucuneréaction du ksh
S ls f[Echap]= Liste les différentes possibilités
1) E1
©
Chapitre3
2) fic2.t:xt
3) fic3.txt
4) fic.txt

c. Tableaurécapitulatif

bash ksh kshmode


vi
modeemacs
Complétion simpled&#39;un
"mot" 4* (tabulation)[EchapHEchap]
[Echap]\
Afficherla listedesfichierscom t44* [Echap]= [Echap]=
mençantpar"mot"

E. Les fichiers d&#39;environnement

1. Caractéristiques des fichiers d&#39;environnement

serventà stockerde manièrepermanente


Lesfichiersd&#39;environnement lesdéfini-
tionsliéesau paramétrage
de l&#39;environnement
utilisateur. a
lls contiennent
descommandes Unixet sonttoujoursinterprétés
par un shell.Ce
sontdesscriptsshelld&#39;environnement.
Certainsscriptsd&#39;environnement
sont exécutésuniquementpar le shell de
connexion; Il est donc importantde savoirfaire la distinctionentre un shell
deconnexionet unshellordinaire.

a. shellde connexion

Environnement
texte
En environnement texte, le shellde connexion
est lancéimmédiatement après
l&#39;identification
de l&#39;utilisateur
parsonnomde loginet sonmotde passe.Ce proces-
susestl&#39;ancêtre
communde touteslescommandes quiserontlancéespendantla
session.
Toutshelllancéultérieurement n&#39;aura
pasle statutdeshelldeconnexion.

Programmationhell
sousnixinu
.Praëtrar.e leinneedt
Environnement
graphique

Enenvironnement
graphique,
leshell
deconnexion
estlancé
entre
labannière
de
connexion
etl&#39;affichage
dubureau.
Cen&#39;est
doncpas
unshell
interactif.
Lebureau
ettoute
application
lancée à partir
ultérieurement des icônes
sont
desprocessus
descendant
dushell
deconnexion.
Danslamajorité
des cas,
unterminal à
ouvert
partir
del&#39;environnement
graphique
n&#39;est
pas
associé
àunshell
deconnexion.
Cependant,
certaines
plates-formes
permettent àpartir
delancer dubureau
soit
un
shell
deconnexion
(ex: icône
Console
sousSolaris),
soitunshell
ordinaire
(ex
: icône
Terminal/MyHost
sous
Solaris).
Lesfichiers
d&#39;environneme
misenjeu
neserontpaslesmêmesdanschaquecas.

b. Fichiers
d&#39;environnement
lusparleshell
deconnexion
Leshell
deconnexion
litunscript
shell
système
quisenomme
/etc/profile.
Ce
fichier
estgéré
parl&#39;administrateur
dusystème
etcontient
des
paramétrages
com-
munsà touslesutilisateurs.
llrecherche
ensuite
dans
lerépertoire
d&#39;accueil
del&#39;utilisateur
unscript
d&#39;envi
nement
dontlenom
dépend
dushell
utilisé
(cf.tableau
suivant).
Shell Nom
dufichier
d&#39;environnement
lupar
leshell
de connexion
sh(Bourneet POSIX)- ksh .profile
bash L&#39;un
destroisfichiers
suivants
citésdansl&#39;ordre
de
recherche.
- .bash_profi|e
- .bash_login
- .profile

A/I
rights
reserved
Quemettre
dans
Cefichier
lefichier
contient
.profile
(.bash
:
principalement
profile)
?

-
Éditions
ENI
- Ladéfinition
suivie
del&#39;exportation
d&#39;une
ouplusieurs
variables
: celles-ci
seront
àtous
transmises lesprocessus à partir
lancés dushell
deconnexion.
Lesvaria-
bles
définies
mais
nonexportées
resteront à cedernier.
locales
- Laredéfinition
deparamètres
système
tels
que
umask,
caractéristiques
dutermi-
© nal...quiresteront
valables
pendant
toute
ladurée
delasession.

sh,, bas
giapitre 3
Exemplede fichier .profile
S cat .profile
PATH=SPATH:/usr/local/bin:SHOME:SHOME/bin:.
PSl=
&#39;
SPWDS
&#39;
ENV=SHOME/.kshrc
EXINIT= setnumberautoindent&#39;
export PATHPS1ENVEXINIT
umaskO77
S

0 Lavaleur
duparamètre
umask
estunevaleur
exprimée
enoctalinfluençant
les
permissionspositionnéessur les fichiers et répertoiresau moment de leur
création.

Ü Lavariable
ENVesttraitée,
dans
cechapitre
section
Lesfichiers
d&#39;environn
ment- Sessionutilisant un KornShell,

Cequ&#39;il
nefaut pasmettredansle fichier.profile(.bashprofilg
Il ne faut pas définir dans ce fichier les entités qui ne se transmettentpas entre
processus,c&#39;est-à-dire
:
- les optionsdu shell ;
les définitionsd&#39;alias.

0 EnKornShell,
unaliasdéfiniavecl&#39;option
x peutêtrehérité
parunscript
shell, mais pas par un shell interactif. g

Les définitionsdes alias et des optionsdoiventêtre reluespar chaqueshell lancé,


que celui-cisoit de connexionou non. Il existe,en ksh et en bash, un fichier d&#39;en-
vironnementqui est prévu pour jouer ce rôle (en BourneShell, la questionne se
pose pas car il n&#39;y
a ni option, ni alias). Le fonctionnementdu ksh et du bash
n&#39;étant
pastout à fait identiquesur ce point, chacunde ces shellsfera l&#39;objet
d&#39;une
étudeséparée.
i.
Paraéaf. e "Îmnemt
Fairerelireunscriptd&#39;environnement
Lefichier.profileestlu uniquement
au momentde la connexion,
et ce, parle shell
deconnexion lui-même.
Si l&#39;utilisateur à sonfichier.profile,ce dernierdoitêtre
apporteune modification
reluparleshell.Pourcela,il existedeuxméthodes :
Se déconnecter puisse reconnecter,
ce qui a poureffetde relancerunshellde
connexion.
- Demanderau shellcourant(qui n&#39;est
pasforcémentle shellde connexion) de
relirele scriptd&#39;environnement.
Pourcela,il faut utiliserla commandeinterne.
. esttraitéeauchapitre
( lacommande Lesbases
de la programmation
shell
Ecriture
et lancement
d&#39;un
scriptshell).

Exemple
Contenudu fichier.profilequia été lu parle shellde connexion
:
S cat .profi1e
PATH=/usr/bin:/bin

S
Affichagede la valeurdes variableset du paramètreumaskavantmodification
du fichier.profile.-
S echoSPATH
/usr/bin:/bin

reserved
rights
Ail Secho
S
SPS1
S echoSEXINIT
(Valeurpar défaut de PS1)

ENI
-
Editions
S echoSENV
S umask
O22
(Videpar défaut)
(Videpar défaut)
(Valeurinitialisés en amontdu .profile)
©
Modification
dufichier.profile:
S vi .prof:i.1e
Chapitre3
EXINIT= setnumberautoindent&#39;
export PATHPS1ENVEXINIT
umask077
S
Demanderau shell courantde relire le fichier .profile :
S .SHOME/.profile
Affichagede la valeurdes variableset du paramètreumask :
/home/christies echo SPATH
/usr/bin:/bin:/usr/local/bin:/home/christie:/home/christ
/home/christies
echoSPS1
SPWDS
/home/christies echo SEXINIT
set numberautoindent
/home/christies echo SENV

/home/christie/.kshrc
/home/christies
umask
077
5

2. Session utilisant un Bourne Shell

La gure 7 représentele déroulementd&#39;une sessionde travail utilisant le Bourne


Sheli :
- Lancementd&#39;un
BourneShellde connexion(1) ;
- Lecture du script shell système/etc/profile, puis du script shell utilisateur
SHOME/profile si celui-ci est présent : le shell de connexion prend
connaissance de la définitiondes variables(exportéesou non) et des paramètres
système(2) ;
- Tous les descendantsdu shell de connexion vont recevoir la valeur des
paramètressystèmeet des variablesexportées(3).
Paramétra e de l&#39;environnement
de travail

login:

passwd:
4(1) (2)
f&#39;|
Bourne
shell
deconn n jäïïîm
Dmla&#39;
e
-P - Variables
exportées
- Variables
nonexportées
- Paramètres
système
(umasku.)
Processus
HERITAGE: (3)
enfant Variables
exportées
- Paramètressystème
(umask..,)

HERITAGE:

I - Variables
exportées
(3)
Processus - Paramètres
système
(umask...)
enfant

Figure 7 .-Sessionutilisant un BoumeShel/

reserved
Iighfs
AII
3. Session utilisant un Korn Shell

Les définitionsde variableset paramètresutilisateurdoivent être faites dans le

ENI
Éditions
-
fichier » /.profi|e, les options et alias seront stockés dans un autre script dont
le nom est laisséau choix de l&#39;utilisateur
(par convention /.kshrc).
La figure 8 représentele déroulementd&#39;une
sessionde travail utilisant le Korn
Shell.
© gomportement
d&#39;un
KornShellde connexion
- Il est lancéjuste aprèsla phased&#39;identification
(1).
Chapitre3

0 Lavariable
ENVn&#39;est
pasdéfinie
pardéfaut.
Le ksh afficheensuiteson prompt (sauf en environnement graphiqueoù le bureau
est immédiatementlancé). Les variablesd&#39;environnement,
paramètres,options et
alias sont mis en placeau niveaudu shell de connexion(5).

Comportementd&#39;un
Korn Shell ordinaire(non connexion)
Un ksh lancéultérieurement(6) :
- Recevraautomatiquementla valeur des paramètressystèmeet des variables
exportées(7).
- Si la variableENVa été reçue(pour cela il faut qu&#39;elle ait été exportéeau niveau
du fichier .profi|e), le ksh va lire le fichier dont le nom y est contenu,ici .kshrc
(8).
Le ksh affiche ensuiteson prompt. Les variablesd&#39;environnement
exportées,para-
mètres,optionset alias sont mis en placeau niveaude ce nouveaushell (9).

0 Unshell
ordinaire
(denonconnexion)
nelitJAMAIS
lefichier
.profile.

Iogin:

passwd:

du
fichier
.profi|e
à(Ü (2)Contenu
[etc/profile
Kornshell m prg le ENv=sHoMELkshrc
deconnexion I export
ENV

(3)
ENV estdéfinie: Contenu
dufichier
.kshrc
Lecture
dufichier
.kshrc

set»oemacs (4)
art d |&#39;eniront de travail

Processus
enfant

(6)
l AHERITE DE:(7)
kshenfant Variables
exportées
(dontENV)
non - Paramètres
système(urnask ...)
canneon
(B)
ENUestdéfinie: Contenudufichier.l<shrc
Lecture
dufichier.l<shro

(9)

CE
KSH
AHERITE
DE:
ALadéfinition
desvariables
exportées
(dontENV)
- Lanouvellevaleur
desparamètres
système (umask...)
CEKSHÂINTEGRE:
- Ladéfinition
desoptions
etdesalias
(dontleparamétrage
del&#39;historique
descommandes)

Figure8 : Sessionutilisant un Korn Shell

4. Session utilisant un Bourne Again Shell

rights
AII
reserved
Les définitionsde variableset paramètresutilisateur doivent être faites dans le
fichier - /.bash_profile,les optionset alias serontstockésdans un autre script que
l&#39;utilisateur
nommera«Lbashrc.

EN/
Éditions
-
- Le bash de connexionlit automatiquementle fichier .bash_profile,mais pas le
fichier .bashrc.
- Un bash ordinaire(non connexion)et interactif lit automatiquementle fichier
/.bashrc.
© Un bash ordinaireet non interactif (bash qui va exécuterun script shell) lit le
fichier dont le nom est cité dans la variable BASH_ENV(qui doit être définie
dans le fichier .bash_profile). Cela permet d&#39;initialiser des variables
d&#39;environnement
uniquementpour le contexted&#39;exécution
du script shell. Ce cas
La figure 9 représentela manièredont l&#39;environnement
doit être configurépour que
les variables,paramètres,optionset alias soient pris en comptedanstous les bash
interactifs.

Comportementdu Bashde connexion

Il est lancéjuste aprèsla phased&#39;identification(1).


- ll lit le script systèmeletc/profile, puis ouvre le script utilisateur- /.bash_profile
si celui-ciest présent(2).
- La commande . -/.bashrc (3) a été ajoutée pour demanderau bash de
connexionde lire le fichier .bashrcafin d&#39;intégrer la définition des alias et des
options.
- Un fois le fichier .bashrc lu, le bash de connexion lit la suite du fichier
.bash_profile(4).
Le bash affiche ensuite son prompt. Les variablesd&#39;environnement, paramètres,
optionset alias sont mis en placeau niveaudu bashde connexion(5).

Comportementd&#39;un
Bash interactif ordinaire
Un bash lancé ultérieurementrecevraautomatiquementla valeur des paramètres
système et des variables exportées (6) et va lire automatiquement le
fichier - /.bashrc si celui-ci existe (7). Le bash affiche ensuiteson prompt. Les
variables d&#39;environnement,
paramètres,options et alias sont mis en place au
niveaude ce nouveaushell (6, 8).

Programationshell
sousUnix/Linux
Paramétra
e de l&#39;environnement
de traÆÆ

login:
passwd:

Contenu
dufichier Contenu
dufichier
(2) .bash_profile
Ætcfprofile &#39;
(3) 3355H
N/ bashrc alÎôS
?
i=&#39;i5
V
rujlbash_profile
PS1 (4) lsletnoolubber

(5)
Lebashdeconnexion a intégré:
- ladéfinition
desvariablesnonexportées
- ladéfinition
desvariablesexportées
- lanouvellevaleur
desparamètressystème
(umask
...)
- ladéfinition
desoptionsetdesalias

(6)
hash enfant ARERIÆE
interactif DE:
aria es n.ees
expo
nonconnexion- Parametres
systeme
(urnask
...)

AI/
righis
Ieserved (7)
Lecture
dufichierbashrc
Contenu dufichier
bashrc
aliasl=nis_|-

Editions
ENI -Ladéfinitienæleïtions
(3)
Ceshella intégré:
etdes
alias
set-o noclobber

©
Figure9 : Sessionutilisant un bash
Chagitre3

Programmation shell sous Unix/Linux


4 : Lesbases
0 Chapitre
de la programmation shell
Les variables utilisateur . . . . . . . . . . . . . . . 114

ËËPT
Substitution de commandes . . . . . . . . . . . . . 119

Caractères de protection . . . . . . . . . . . . . . . 120

Récapitulatif des caractères spéciaux. . . . . . . . . . 124

ligne de commande . . . . . . . .
Interprétation d&#39;une 124

Écriture
et lancement scriptshell. . . . . . . . . 125
d&#39;un
Variables réservéesdu shell . . . . . . . . . . . . . 135

La commande read . . . . . . . . . . . . . . . . . 144

Exécution de tests . . . . . . . . . . . . . . . . . 148

Les opérateurs du shell . . . . . . . . . . . . . . . 160

F5753
. . . . . . . . . . . . . . . . . . .
L&#39;arithmétique 163

arithmétiques . . . . . . . .
Substitution d&#39;expressions 170

script. . . . . . . . . . . . . . .
. Mise au point d&#39;un 171

Les structures de contrôle . . . . . . . . . . . . . . 174


A. Les variables utilisateur

Ce chapitreprésenteles fonctionnalitésqui composentles basesde la programma-


tion shell.
Le shell permetde définir ou redéfinirdes variablesqui conditionnentl&#39;environne-
ment de travail de l&#39;utilisateur.
Il est égalementpossiblede définir d&#39;autres
varia-
bles, dites variablesutilisateur, qui vont permettrede stockerdes informationsqui
serontnécessaires durant l&#39;exécution
d&#39;un
script.

1. Nommer une variable

Voici les règlesà utiliserpour attribuerun nom à une variable:


- le premiercaractèrefait partiede l&#39;ensemble
[a-zA-Z_];
- les caractèressuivantssont pris dans l&#39;ensemble
[a-zA-ZO-9_].

2. Définir une variable

Une variable est définie dès qu&#39;elle


est initialisée. Le contenud&#39;une
variable est
considérépar le shell commeune suite de caractères.
a. Affecter une chaînede caractèresà une variable

Exemples
S varlqnotl
S echo Svarl
motl
S

Ü ll nefautpasmettre
d&#39;espace
autour
dusymbole
d&#39;affectation
: dans
l&#39;exemp
suivant, le shell interprètevarl comme la commandeà lancer, = et motl
comme les deux argumentsde la commandevarl. Autrementdit, il n&#39;inter-
prètepas le signe= commesymboled&#39;affectation.
Svarl = motl
ksh: varl: not found

rogramaio shll sou Unix/Linux


Lesbasesde la programmation
shell
b. Affecter une chaînede caractèrescontenantau moins un espace
L&#39;espace
doit être protégécar c&#39;est
un caractèrespécial du shell (séparateurde
motssur la lignede commande).

Exemples
S var2=&#39;mot1
mnt2mot3&#39;
ËCORRECT
S echo Svar2
motl mot2mot3
S var2=mot1mot2mot3 #INCORRECT
ksh: mot2: not found
S

c. Variableindéfinie
Unevariablequi n&#39;a
jamaisété initialiséeestvide.

0 L&#39;utilisation
d&#39;une
variable
viden&#39;est
pasconsidérée
comme
uneerreur
enshell.
Exemple
S echoSvide
S

d. Retirerla définition d&#39;une


variable
La commandeinterneunset permetde retirerla définitiond&#39;une
variable.
Exem le

AI/
reserved
rights
Définition d&#39;une
variablevar:
S var=12
S echo Svar
12

Editians
EN/
- Elle apparaîtdans la liste des variablesdéfinies au niveaudu shell :
S set | grep var
var=12
©

sh, ksh, bash


Chap
La définition de la variableest retirée:
S unset var
La variableest indéfinie .-
S echo Svar
S set I grep var
S

e. isolerle nomd&#39;une
variable
Il faut faire attentionen concaténantle contenud&#39;une
variableet d&#39;une
chaînede
caractèresà ce que le shell interprètecorrectementle nomde la variable.

Exemple
Pourle shell, le caractère_ fait partie du nomde la premièrevariable.-
5 fic=resu
S datejour=20110117
S newfic=Sfic_Sdatejour
S echo Snewfic
20110117
Pourle shell, la premièrevariablese nommefic_ (puisquele caractèresouligné
est autoriséà l&#39;intérieur
d&#39;un
nomde variablel). Celle-ciest doncsubstituéepar sa
valeur(doncvide l), puisconcaténéeavecle contenude la variabledatejour.
Pourfaire comprendreau shell quelssont les caractèresqui font partiedu nomde
la variable,il faut entourerle nomde cettedernièreavecdes (}.

Exemple
5 fic=resu
S datejour=20110117
S newfic=S{fic}_Sdatejour
S echo Snewfic
resu_20110l17

Programmion
shellsous/Linux
Lesbasese la
3. Substitution de variables

Leshelloffrela possibilité
d&#39;attribuer
unevaleurpardéfautauxvariables
noninitia-
lisées,ou au contraire,initialisées.

Expression
Sjvariablm-valeurl;
- Si la variable
n&#39;est
pasvide,l&#39;expression
est substituée
par le contenu
de
celle ci.
- Si la variableestvide,l&#39;expression
estsubstituée
parvaleur.
Exemple
S fic=/tmp/christie.log
S echo "Le fichier traite sera: Sfficz-/tmp/default.log}"
Le fichier traite sera: /tmp/christie.log
S unset fic
S echo "Le fichier traite sera: Sffic:-/tmp/default.1og}"
Le fichier traite sera: /tmp/default.log
S echo Sfic
S

Expression
Sjvariablesvaleur
- Si la variablen&#39;est
pasvide,l&#39;expression
estsubstituée
parsvariable.
- Si la variable
estvide,variable estaffectée
avecvaleur et l&#39;expression
est
substituéepar valeur.

Exemple

AII
Iights
reserved
S fic:/tmp/christie.log
S echo "Le fichier traite sera: 5{fic:=/tmp/default.log}"
Le fichier traite sera: /tmp/christie.log

Editions
ENI
-
S echo Sfic
/tmp/christie.log
S unset fic
S echo "Le fichier traite sera: S(fic:=/tmp/default.log}"
Le fichier traite sera: /tmp/default.log
S echo Sfic
©

sh, ksh, bash


Chapitre4

/tmp/default.log
S

Expression5{variable:+vaIeur}

- Si la variablen&#39;est
pasvide, l&#39;expression
est substituéepar valeur.
- Si la variableest vide, l&#39;expression
est substituéepar svariable, doncvide.

Exemple
S a=1
S echo "Expression : S{a:+99}"
Expression : 99
S unset a
S echo "Expression : S{a:+99)"
Expression :
S

s{variable:?message}

- Si la variablen&#39;est
pasvide, l&#39;expression
est substituéepar svariable.
- Si la variableest vide, le shell affiche le nom de la variablesuivie de la chaîne
de caractèresmessage.

0 Silavariable
estvideetquecette
commande
estplacée
dans
unscript
shell,
celui-ciaffichele messageet se termineimmédiatement.

Exemple
La
variable
varest
vide
:
S echo Svar
S echo S{var:?"var non definie"}
bash: var: var non definie
Messagepar défaut :
S echo S{var:?}
Les basesde la Qrogrammation
she

Définition de la variablevar:
S var=definie
S echo S{var:?"var non definie")
definie
S

B. Substitution de commandes
Les caractèresde substitutionpermettentde remplacerune commandepar l&#39;affi-
chagerésultantde son exécution.Ce mécanismeest utilisé pour insérerdans une
lignede commandeUnix le résultatd&#39;une
autre commande.

Syntaxeavec les guotesinversées(anti-guotes)


commandeargumentl comande . argumentn

Syntaxeéguivalente

ksh bash
commande
argumentl S(commande) argumentn

Exemg/es
Comment faire pour provoquer l&#39;exécution
des commandes uname -n et
logname ?

Al/
rights
reserved
S echo Vous etes actuellement connectesur la machineuname-n et
vous etes logname
Vous étés actuellement connectesur la machineuname-n et
vous etes logname

EN!
Éditions
-
S

sh,ksh,bah
Chapitre4
Il faut entourer les commandesavec les caractèresde substitution de com-
mande,-
S echoVous etes actuellement connectesur la machine uname-n et
vous etes logname
Vousetes actuellement connectesur la machine
rumbaet vous etes christie
S
S echo Vousetes actuellement connectesur la machineS(uname-n) et
vous etes s(logname)
Vous etes actuellement connectesur la machinerumbaet
vous etes christie
S
Initialisationd&#39;une
variablemonuid avecl&#39;uid
de l&#39;utilisateur
christie :
S grep christie /etc/passwd
christie:x:2OZ5:2000::/home/christie:/bin/bash

S
S grep christie /etc/passwd | eut d: -f3
2025
S
S monuid=S(grepchristie /etc/passvd I cut d: -f3)
S
S echo Smonuid
2025
S

C. Caractères de protection
Les caractèresde protectionserventà faire perdre la significationdes caractères
spéciauxdu shell. ll existetrois jeux de caractèresayantchacunleur fonctionnalité
propre.

1. Les simples quotes

Les simplesquotes(ou apostrophes)retirent la significationde tous les caractères


spéciauxdu shell. Les quotes doivent être en nombre pair sur une ligne de
commande.
Le baes e larorammation sll
0 Lessimples
quotes
neseprotègent
paselles-mêmes.
Exemples
La variablesHoMEest substituéepar sa valeur.-
5 echo SHOME
/home/christie
Le caractère5 perd sa significationspéciale.-
5 echo &#39;SHOME&#39;
SHOME
Le caractère* est substituépar les nomsde fichier du répertoirecourant:
S echo *
fl f2 f3
Le caractère* perd sa significationspéciale:
S echo &#39;*&#39;
*

Leshell s&#39;attend
à trouverun nomde fichier derrièreuneredirection:
S echo >
bash: syntax error near unexpectedtoken >&#39;
Le caractère> perd sa significationspéciale:
5 echo &#39;>&#39;
>

rights
AII
resen/ed
Leshell exécutela commandelogname et la remplacepar son résultat:
S echoBonjour S(logname)
Bonjour christie

Éditions
ENI
-
©

sh,h, bash
La séquencede caractèresW ) perd sa significationspéciale:
S echo &#39;Bonjour
S(logname)&#39;
Bonjour S(logname)
S
Protectionde plusieurscaractèresspéciaux.-
5 echo &#39;*
? > < >> << | SEOMES(lognama)5&#39;
* ? >< >> << | SHOME S(logname)&
S
La quotene se protègepas elle-même.Pourle shell, la commanden&#39;est
pas ter-
minée. ll affichera le prompt secondaire(PS2) tant que les quotes seront en
nombreimpair :
S echo la quote n&#39;est
pas protegee&#39;
>

2. Le caractère \

L&#39;antis|ash
retirela significationspécialedu caractèrequi le suit.

Exemples
L&#39;étoile
est substituéepar les nomsde fichier du répertoirecourant,SHOMEest
substituéepar sa valeur:
S echoVoici une * et une variable SHOME.
Voici une fl f2 f3 et une variable /home/christie.
S
L&#39;étoile
et le dollar redeviennentdes caractèresordinaires.-
S echoVoici une \* et une variable \sHoMR.
Voici une * et une variable SHOME.
L&#39;antislash
seprotègede lui-même:
S echo \\
\
S

Programmaion
shellsousn/iu
Lesbasesdela Brogrammatlon
shell
Uantislashretire la significationspécialede la quote:
S echoL\&#39;anti s1ash
protege la quote
L&#39;antivslash
protege la quote
S
Lepremierantis/ashprotègele deuxième,le troisièmeantislashprotègele dollar:
s echo \\\SHOME
\SHOME
S

3. Les guillemets
Lesguillemetsretirentla significationde tous les caractèresspéciauxdu shell sauf
8, et 50, \et lui-même.

Exemple
Lescaractères>, |, et &#39;
sont protégéspar les guillemets.Les5E,30 et l conser-
ventIeur rôle. L&#39;avant-dernier
guillemetest protégépar l&#39;antislash
:
S echo "> et | sont proteges, SHOME est substituee, S(1ogname)
est executee, l&#39;anti5lash
protège le caractere suivant, ce qui
meperet d&#39;afficher
un \"."
> et l sont proteges, /home/christie est substituee, christie
est executee, l&#39;antislash
protege le caractere suivant, ce qui me
permetd&#39;afficher
un ".
S

0 Enpratique,
il estfréquent
d&#39;encadrer
lesarguments
delacommande
echo

All
rights
resen/ed
avecdesguillemets.

Editions
ENI
-
©

Ëñ,_ksh,
ba
D. Récapitulatif des caractères spéciaux
Cetableauregroupe
lescaractères
spéciaux
dushellvusprécédemment
:

Caractères Signification
espace- tabulation - sautde Séparateurs
de motssurla lignede commande
ligne
& Arrière plan
| << < > >> Tubeet redirections
(l et {} Regroupement decommandes
, Séparateurdecommandes
* ? [ ] ?() +() *() !() @() Caractères
degénérationde nomsdefichier
35et 1H } Valeurd&#39;une
variable
5B0 Substitution
decommandes
&#39;
&#39;
" "\ Caractères
de protection

E. Interprétation d&#39;une
ligne de commande
Lescaractères
spéciaux dansunordreprécis:
dushellsontinterprétés

Séquenced&#39;interprétationcommande
internecommande
externe
1. Isolement desmotsséparésparles Effectuéparleshel courant
caractères, espace,tabulation,
sautde
ligne
2. Traitement descaractèresde protec-
on (rr I uu
3. Substitution desvariables(SE)
4. Substitution decommandes i 5B0)
5. Substitution descaractèresde généra-
tionde nomsdefichiers(*, ?, [l etc.)
6. Traitement destubeset redirections shellcourant shellenfant
7. Lancement de la commande

Progmtion ell nix/Li


Lesbasesde la programmation
shell

Exemple
echo
ur-e: 511mm > resu
et.g a: sua-piano)
I!
caractères
deprotection
&et
echu #39;
smnm
eng et.summum)
> resu
W
variables
echn
ï et fhame/chriacie > resu
et g m:sanguine)
Ü
substitution
deCommande:
echna et:lhnme/Ehriscie
et 3 et christlc> resu
Ü
caractères degénération
denoms defichiers
erzho
" et lhume/christae
et f1 f2 f3 et chriscie
> resu
Ü
redirectiunset.tubes

assuciatinnsortiestandard - fichierresu
et:t1 f2 f3 et.chrisnie
chu" et fhcnnefchriscie
Ü
lancement
dela commande echu
echo
reçoit9 arguments: et. I1 I2 f3 e: chrlsnie
î et. lbmnejchriscie

F. Écritureet lancementd&#39;un
scriptshell

AII
resen/ed
rights
1 . Définition

Un scriptshellest un fichiertextecontenantdes commandes


Unixinternesou
externes
ainsiquedesmotsclésdu shell.

-
ENI
Éditions
Il n&#39;y
a pasde convention

interprété
parunexécutable
imposéepourle nomd unscriptshell.Le nomd&#39;un
fichierscriptshelipeutavoiruneextension,

nommé"sh").
maisce n&#39;est
pasobligatoire.Néan-
".sh" (mêmesi le scriptn&#39;est
moins,il estassezfréquentde choisirl&#39;extension pas

sh, ksh, bash


Exemple
Voici le script premier.sh:

Snl premier.sh

1pwd
2 cd /tmp
3 pwd
4 ls
S
Exécutiondu script :
S ksh premier.sh
/home/christie __ \_
/tmp
fl f2 Î3
S
Lescommandessont exécutéesséquentiellement.

2. Exécutiond&#39;un
scriptpar un shellenfant
Danslamajorité
descas,lesscripts
doivent
êtreexécutés
parl&#39;intermédiaire
d&#39;un
shellenfant.
Cecia pouravantagedenepasmodi er
l&#39;environnement
dushell
courant.
Pourlancerun scriptshell,il existetroisméthodes
qui produiront
un
résultatéquivalent.
Premièreméthode
S ksh premier.sh
C&#39;est
laméthode
utilisée
précédemment.
Onappelle
lacommande kshenluide-
mandant
d&#39;interpréter
lescriptpremiensh.
Danscecas,la permission
delecture
est suffisantesur le fichier premier.sh:
S ls -1 premier.sh
rw r r 1 christie cours 19 nov 15 19:16 premier.sh

Deuxièmeméthode
S ksh < premier.sh
e bses d&#39;3
3.! ram°he"
Le ksh est un programmequi lit sur son entréestandard,il est donc possiblede
connectercelle-cisur le fichier premier.sh.Là encore,la permissionde lectureest
suffisante.Cettesyntaxeest peu utilisée.
Troisièmeméthode
S chmndu+x premier.sh
S ls -1 premier.sh
rwxr--r-- l christie cours 19 nov 15 19:16 premier.sh
S premier.sh
C&#39;est
la méthodela plus utilisée. Dans ce cas, le script est considérécomme la
commande,et donc, comme pour toute commandeexterne,il est nécessairede
posséderles droits d&#39;exécution
sur le fichier.

(si
lescript
est
lancé
àpartir
d&#39;un
Korn
shell,
ilzeïaa
interprété
par
est lancéà partir d&#39;un
_s&#39;il
unKorn
shell,
Par défaut, le script sera interprétépar un shell enf nt identiqueau shell courant

Bourneshell, il sera i terprétépar un Bourneshell).

Choixde Pinterpréteur
Sur la premièreligne du fichier, la directive#! permetd&#39;imposer
l&#39;interpréteur
du
script. Le cheminde celui-cidevraêtre expriméen absolu.
Exem le
Ici, le script sera interprétépar le processus/usr/bin/ksh.

Snl premier.sh
l #1/usr/bin/ksh

A/I
rights
reserved
mascara
pwd
cd /tmp
pwd

Éditions
ENI
©
-
ls
S

0 Lescaractères
#! sontécrits
respectivement
encolonne
1 et2. L&#39;espace
entre
le ! et le chemin absolude Pinterpréteur
est facultatif. Les shells les plus utili-
sés sont localiséssous/usr/binou /bin.
Chapitre4
Voici trois cas d&#39;erreur
se produisantfréquemmentau lancementd&#39;un
script :

Premiermessaged&#39;erreur
classique
S premier.sh
ksh: premier: not found
Visiblement,
le ksh ne trouvepas la commande
premier.sh. Lescommandes
étant recherchées
dans les répertoiresénumérésdans la variablePATH,il est pos-
siblequele répertoire
contenant
le scriptnesoitpasréférencé
danscelle-ci. i
Sil&#39;on
nesouhaite
pasmodifier
savariable
PATH,
lescript
peut
êtreexécuté
eri
exprimant
sonemplacement
de manière
explicite(enabsoluou en relatif).

Exemple
L&#39;emplacement
du script est désignéen absolu:

S /home/christie/premier.sh
S
L&#39;emplacement
du script est désignéen relatif :

S pwd
/home/Christie
S ls
premier.sh
S./premier.sh
S
L&#39;autre
alternativeest de modifierla définitionde la variablePATHdans le fichier
.profile(voirla sectionExécution
d&#39;un
scriptparle shellcourantdecechapitre).

Deuxièmemessaged&#39;erreur
classique

S premier.sh
ksh: premier.sh: cannot execute - Permission denied
S ls -1 premier.sh
rw r 1 christie cours 3 nov 16 17:33 premier.sh
L&#39;utilisateur
a oubliéde positionnerle droit d&#39;exécution.
Lesbasesde la programmation
sheli

Troisièmemessage
d&#39;erreur
classigue
S vi premier.sh
#! bin/ksh

S
Spremier.sh
ksh: premier.sh:Nosuch file or directory
Lecheminde |&#39;interpréteur
estincorrect.
ici, le/ a étéoubliédevantbin.

Mécanisme
internecommunauxtroissyntaxes
Regardons
de plusprèsl&#39;exécution
decescript :
5 pwd
/home/christie /
S premier.sh
/home/christie
/tmp
fl f2 Î3

S pwd
/home/christie

AI/
resen/ed
rights
du script estterminée,la valeurdu répertoire
Lorsquel&#39;exécution courantn&#39;a
pas
changé.Eneffet,unscriptsheliétantunecommande externe,il estexécutéparun
shellenfant.Lesfigures1, 2 et 3 représentent le détailde l&#39;exécution
du script
premier.sh.

-
ENI
Éditions
©
Chapitre4
Répertoire
courant
fhpmefchristie

ksh

PID=2Ü1 Répertoire
courant
fhornelchristie
:5pwd (l)
fhomefchristie
ksh
sptenüersh(2) _.{p PID=2Û5

ê !fbinfksh
_ _(3)
(1) fhprnefchnstie
-4 pwd

cdJtmp
pwd /
(2) s /
Figure1 : Mécanismeinterne mis en Suvre
(3) lors du lancementd&#39;un
script shell - Premièrepartie
Avant de lancerle script, l&#39;utilisateur
fait afficherla valeurdu répertoirecou-
rant. La commandepwd étant une commandeinterne,elle est exécutéepar
le shell courant (PlD=201). Le résultat de la commande est donc
/home/christie.
Lancementdu script premier. Un script shell étant une commandeexterne,
le shell courantse duplique. Le script sera donc interprétépar le shell en-
fant (PlD=205). Le shell enfanthéritedu répertoirecourantde son parent.
Le shell enfant(P|D=205) exécutela commandeinternepwd. Le résultatde
la commandeest donc/home/christie.
Lesbas e ladu _

Répertoire
courant
ftmp (4)

ksh Shell
enfant

î»

PID=2Ü5
(4)

(5) . Rrt&#39;
t
pwd
cd/trnp p(4)
(6) Dwd
l5 Findu î!
./tmn (5)
(s)
- -v ksh
44 33°i&#39;::"°"
reserved
rights(3)
Ail
- (7)
ENI (7)
Éditions
©
Figure2 : Mécanismeinternemis en Suvre
lorsdu lancementd&#39;un
script shell - Deuxièmepartie
Leshell enfant(PlD=205) exécutela commandeinternecd. Leshell réalise
donclui même
le changement
derépertoire.
Lerépertoire
courantdel&#39;enfant
Chapitre4

Répertoirecourant
fhome/christie

ksh S pwd __
Ihomelchrnstie
PID=2Ü1
S premier
fhorne/christie

( trnp
f1 f2 f3

t nwd . (9)
lhomefchnstie

Figure3 .-Mécanismeinternemis en Suvre


lors du lancementd&#39;un
script shell Troisièmepartie
(9) L&#39;environnement
du shell 201 n&#39;a
pas été modifié, le résultatde la com-
mandepwd est donc/home/christie.

3. Exécution d&#39;un
script par le shell courant

Cette méthodes&#39;utilise
essentiellementdans le cas des scripts d&#39;environnement
(.profile,.kshrc),et de manièreplus généralelorsquel&#39;onsouhaitemodifierl&#39;envi-
ronnementdu shell courant.Pourfaire exécuterun script par le shell courant,il
faut utiliserla commandeinterne".". Il est inutilede positionnerle droit d&#39;exécution
sur le script passéen argument.

Exemple
Affichagede la valeuractuellede la variableEXINIT:
S env | grep EXINIT
EXINIT=&#39;set
numbershowmode

0 Lavariable
EXINITestutilisée
parvi etcontient
lalistedesoptions
à posi-
tionnerou dépositionner.Cettevariabledoit obligatoirement
êtreexportée.
Lesbasesde la programmationshell

L&#39;utilisateur
modifie EXINIT danssonfichier .profile .-
S vi .profile
EXINIT=&#39;set
numbershowmode
autoindent showmatch&#39;
expert EXINIT
:wq
Tant que le shell courant n&#39;aura
pas relu le fichier .profile, la modificationne
serapasprise en compte:
S echo SEXINIT
set numbershowmode
Fairerelire (exécuter)le fichier .profileau shell courant:
S . .profile
La modificationa bien été prise en compte.-
S env | grep EXINIT
EXINIT=&#39;set
numbershowmode
autoindent showmatch&#39;

0 L&#39;argument
delacommande
. nepeutêtrequ&#39;un
script
shell.
Messaged&#39;erreur
classique:
S. .profile
ksh: .profile: not found
S echo SPATH
/usr/bin:/bin
Le ksh ne trouvepasle fichier .profile ; pourtant,ce dernierest bienà sa placeet
son nomest correct.Le problèmevient tout simplementdu fait que l&#39;argument de

Ail
rights
reserved
la commande.(ici le fichier .profile)est recherchédansles répertoirescitésdansla
variablePATH.Le répertoired&#39;accueilde l&#39;utilisateur
(emplacementdu fichier .pro-
file) doit doncy être référencépourpouvoirutilisercettesyntaxe.
Sansmodifierla variablePATH,il est possiblede faire relire le fichier .profileen

ENI
Editians
-
exprimantsonemplacementde manièreexplicite(enabsoluou en relatif).

©
Exemple
S pwd
dome/christie
S
L&#39;emplacement
du script est désignéen absolu:
S . SBOME/.profile
L&#39;emplacement
du script est désignéen relatif .-
S . ./.profi1e

8 Nepasconfondre
tousles. l Lepremier
. représente
lacommande
interne
du
shellet est obligatoirementsuivi d&#39;un
espace../ .profi1e représenteun nom
de fichierexpriméen relatif; le premier. signifierépertoirecourant,le
deuxièmefait partiedu nomdu fichier.

4. Commentaires
Un commentairecommencepar le caractère# et se termineà la fin de la ligne.
Uneexceptionà cette règle: si la premièreligne u fichier commencepar #!, le
shell s&#39;attend
à trouverle nomde l&#39;interpréteur
du sc ptjuste derrière.
Leslignesblanches
ainsiquelesindentations
(espaces,
tabulations)
sontignorées.
Exemple
S nl premier.sh
l #1 /bin/ksh
2 # Voici monpremier script
3 # comportantdes commentaires
4 pwd # Afficher le repertoire courant
5 cd /tmp # Changement de repertoire
6 pwd
7 l5 # Liste des fichiers du repertoire courant
S

ProgrammationshellsousUnix/Linux
.5 ass dl 99.. shell

G.VariabIes réservées du shell


Dansun script, un certain nombrede variablesréservéessont accessiblesen lec-
ture. Ces variablessont initialiséespar le shell et véhiculentdes informationsde
naturediverse.

1. Les paramètrespositionnels
Les scripts shell sont capablesde récupérerles argumentspasséssur la ligne de
commandeà l&#39;aidede variablesspéciales,nomméesparamètrespositionnels.
- S# représentele nombred&#39;arguments reçuspar le script ;
- S0 représentele nom du script ;
- 51 représentela valeur du premierargument,52 la valeur du deuxièmeet ceci
jusqu&#39;à
S9 qui représentela valeur du neuvièmeargument.Le ksh et le bash
permettentd&#39;utiliser
les variablesspécialesS{10}, H11}, etc. Les accolades
sont obligatoireslorsquele nom de la variablecontientplus d&#39;un
chiffre ;
- 5* et S@ représententla liste de tous les arguments(la différenceentre 5* et
S@ est présentéeau chapitre Aspectsavancésde la programmationshell -
Comparatifdes variables8* et îî>@).
Exemple a
/&#39;
Voici un script qui affiche la valeurde chaqueparamètre ositionnel.-
S vi monscript.sh
echo "Ce script a recu S# arguments"
echo "Le nomdu script est : S0
echo "Monler argumentest : S1"
echo "Mon2emeargumentest 2 S2"

Al/
reserved
Iights
echo "Mon3emeargumentest : S3"
echo "Voici la liste de tous mesarguments: 5*"
5 chmodu+x mnnscript.sh

ENI
Éditions
-
Appel de monscripLshavecsix arguments(cf. Figure4) :
S monscript.sh E1 f2 f3 f4 /tmp/fic.txt 123
Ce script a recu 6 arguments
Le nomdu script est : monscript.sh
Monler argumentest : fl
©

sh, ksh, bash


Chagitre
4
Mon2emeargumentest : f2
Mon3emeargumentest : f3
Voici la liste de tous mesarguments: fl f2 f3 f4 /tmp/fiC.txt 123

S monscript- ah
f1 f2 f3 f4 ftrnofficixt 123

l L1H1 l
sa s1 s2 s3 s4 s5 S6
|____î___J

l
sîk
5# vautô

Figure4 : Passage
desixarguments
surla lignedecommande
Appeldemonscriptsh
avectroisarguments
(cf.Figure5) .-
S monscript.sh 12 + 24
Ce script a recu 3 arguments
Le nomdu script est : monscript.sh
Monler argumentest : 12
Mon2emeargumentest : +
Mon3emeargumentest : 24
Voici la liste de tous mesarguments: 12 + 24
E manscripnsh 12 + 24

Figure
5 : Passage
detroisarguments
surlalignedecommande

Programmation
shl ousUn/Linx
Lesbasesde la Erogrammation
shell
0 Lesarguments
dela lignedecommande
doivent
êtreséparés
lesunsdes
autrespar (au moins)un espaceou une tabulation.

2. La commande shift

La commande
shift perde décalerla listedesarguments
d&#39;une
ou de plu-
sieurspositionsvers la gauche.

a. Syntaxe
shift [n]
où n représentela valeurdu décalage(n vaut 1 par défaut).

b. Principe
La figure 6 représentela valeur des paramètrespositionnelsdu shell avant (1) et
après(3) l&#39;exécution
de la commandeshift (2). Les valeurssortantessont per-
dues ; elles devrontdonc être sauvegardéesavant l&#39;opération
de décalagesi cela
s&#39;avère
nécessaire.L&#39;exécution
de la commandeshift remet à jour les variables
3S1,3S2 S9, H10} ..., R#, 3* et SB@.
(l) Sdecaldh itmp f1 f2 f3 f4

ËÜ S1 S2 S3 S4 S5
Sävaut 5
5* vaut ftmpf1 f2f3 f4
(2) shift
(3)sdecaLsI-ÏW
f1 f2 f3 f4

righis
AII
reserved P F

Editions
ENI
-
SU S1 S2 S3 S4 S5

5&1vaut 4
5* vaut f1f2 f3 f4

© Figure6 : La commandeshift

sh, ksh, bash


Chagitre4

Exemple
Le script suivantreçoit en premierargumentle nom d&#39;un
répertoir puis, à partir
du deuxièmeargument un nombre quelconquede noms de Ichiers. Dans le
contextede ce programme,le premier argumentne subirapas le même traite
ment que les suivants.Le nom du répertoireest sauvegardédans une variable
(ligne 11), puis la commandeshift fait sortir le nom du répertoire(ligne 13).
Ceci permet de récupérerdans la variable5* uniquementla liste des fichiers,
qui pourraêtre traitée ultérieurementdansune bouclefor (ligne25).
S nl deca1.sh
#1 /bin/bash
# Affichage des variables avant decalage
echo "Avant shift"
N
Hecho ler argument\S1: S1"
echo "2emeargument\S2: S2"
m
w
e echo "3emeargument\S3: S3"
echo "4emeargument\S4: SA"
echo "Tousles arguments\S*: 3*"
4
S
m
H echo e "Nombred&#39;arguments
\S#: 5#\n"
# Sauvegardedu ler argumentdansla variable rep
rep=S1
0 # Decalaged&#39;1
mshift cran a gauche

H echo
# Affichage des variables apres decalage
-e "Apres shift\n"
echo "ler argument\S1: S1"
echo "Zemeargument\S2: S2"
Nl-l

H
echo "3emeargument\S3: S3"
echo "4emeargument\S4: S4"

w
q
m
h
w

H
S
a

______ Lesbasesde la grogrammatlgim


shell
Positionnementdu droit d&#39;exécution
:
S chmodu+x deca1.sh
Lancementdu script :

ler
2eme
3eme
4eme
Tous

1er
Zeme

Ail
righls
reserved
3eme
4eme
ENI
-

E
©ditions
Tous

Sauvegarde
LChapitre
4

Exemple
Lacommande
grep retournevrailorsquela chaînerecherchée
esttrouve{aux
dansle cas contraire:
S grep christie /etc/passwd
christie:x:500:500:christine Deffaix-Remy:/home/christie:/bin/bash
echo S?

H-(DROR
grep oliver /etc/passwd
echo S?

A l&#39;intérieur
d&#39;un
scriptsheli,le testdu codede retourd&#39;une
commande
permet
d&#39;orienter
le flux d&#39;exécution.
De nombreuxexemplesserontprésentésdansla suite
de cet ouvrage.
b. La commandeexit
Un scriptsheliest unecommande,il doit donclui aussiretourner
un code.La
commande exit permetdeterminerunscripttoutenrenvoyant uncoded&#39;erreur.

Exemple
Voici,sousformede pseudo-code,
un scriptqui renvoieO ou 1 enfonctiondu
nombred&#39;arguments
reçus:
Si S#est diffèrent de 2
alors
Afficher " Nombred&#39;arguments
incorrect "
exit 1 # Terminaisondu script avec renvoi du code l (échec)
finsi
# Le script a recu 2 arguments,il peut effectuer le traitement
Traitement des arguments
exit 0 # Terminaisondu script avec renvoi du code 0 (succès)

0 Le codede retourd&#39;un
scriptqui n&#39;appelle
pasexplicitement
exit a pour
valeurle codede la dernièrecommandeexécutéeà l&#39;intérieur
du script.

ProgrammationshelisousUnix/Linux
Les bases de la rogrammation
shell
4. Autres variables spéciales \\\\\

a. PID du shell interpréteur


5s représentele PID du shell qui interprètele script(cf. Figure7). Cettevariable
gardeune valeurconstantependanttoute la duréed exécutiondu script.
ksh o ksh
PID=2U1 p1
Smonscript.sh
if! Ibinfksh
echoS5 *** * 2Ü5

Figure7 .-La variable38

Exemple
Le script trouve.shcrée un fichier résultat qui porte un nom différent à chaque
fois que le script est lancé :

Snl trouve.sh
1 ficresu=/tmp/atrouve.SS
2 find "S1" -name"S2" 2> /dev/null 1> Sficresu
3 echo "Contenudu fichier Sficresu: "

A/i
reserved
rights
4 more Sficresu
S
Ce script prenddeuxarguments: un nom de répertoireet un nom de fichier.

ENI
Editions
-
- Ligne 1 : la variableficresu est initialiséeavec un nom de fichier contenant
le PID du shell interpréteur.
- Ligne 2 : la commandefind rechercheles fichiers de nom 52 à partir du
répertoireS1 et stockeles résultatsdans le fichier Sficresu.
© - Ligne3 : affichaged&#39;un
messageà l&#39;écran.
- Ligne4 : le contenudu fichier Sficresuest affichéà l&#39;écran.
Si
Premierexempled&#39;exécution
du script :
S trouve.sh / passwd
Contenudu fichier /tmp/atrouve.2343:
/etc/passwd
/usr/bin/passwd
/etc/pam.d/passwd
/usr/share/doc/nss_ldap 185/pam.d/passwd

/usr/share/doc/pam_krb5-1.55/krb5afs-pam.d/pa
/usr/share/doc/pam_krb5 l.55/pam.d/passwd
Deuxièmeexempled&#39;exécution
du script :
S trouve.sh /bin "g*"
Contenudu fichier /tmp/atrouve.2346:
/bin/gäwk-3.1.0
/bin/gawk
/bin/grep
/bin/gzip
/bin/gunzip
/bin/gtar
S
Chaquenouvelleexécution
du scriptgénèredoncun fichierrésultatportantun
nom unique:
S ls -1 /tmp/atrouve*
-rw rw-r 1 christie christie 68 avr ll 17:44 /tmp/atrouve.2343
rw rw r 1 christie christie 179avr 11 17:44 /tmp/atrouve.2346
S

b. PID du dernierprocessuslancéen arrière-plan


|| esttout à fait possiblede lancerunecommande en arrière-plan
à partird&#39;un
script.LePIDdecettecommande estalorsstockédanslavariablespéciale
s !.

Exemple
Lancementd&#39;une
commandeen arrière-planà partir d&#39;un
script shell :

S nl arriereplan.5h
1 #1 /usr/bin/ksh
2 find / name51 1> /tmp/res 2> /dev/null 5
Ls aes de la ro ammaon shell
3 date
4 echo &#39;| kùkùÿcâ kwi***-k k-ki<***kÿzk*******ll
5 echo "Resultat de la commande ps : "
6 ps
7 echo "**********-k* k k* k*t*ÿc****** k**"
8 echo "PID de find : S!"
9 exit 0
S
S arriereplan.sh passvd
dim nov 17 11:18:56 CET2002
* k** k* k* k k******** k k k***ÿrikîct
Resultat de la commande ps :
PID TTY TIMECMD
1299pts/0 00:00:00 bash
1344pts/0 00:00:00 ksh
2240pts/0 00:00:00 arrierep1an.sh
2241pts/0 00:00:00 find
2243pts/0 00:00:00 ps
**************w**************
PID de find : 2241
S
- Ligne2 : la commandefind est lancéeen arrière-plan.Le shell n&#39;attend pas
qu&#39;elle
se termine, il passeà la commandesuivante.La variables! est initiali-
séeavecle PlD du processusfind (ici 2241).
- Ligne3 à 5 : lancementdes commandesdate et echo en avant-plan.
Ligne6 : lancementde la commandeps en avant-plan.Le processusfind, qui
n estpas encoreterminé,est identifiépar le PID 2241.
- Ligne8 : affichagede la variablesl. Elle contienteffectivementla valeur2241.
Un exempled&#39;exploitation
de cette variable sera vu ultérieurement(cf. chapitre
Aspects avancés de la programmationshell - Gestion d&#39;un processus en

Ieserved
rights
AII
arrière-plan).

ENI
Éditions
-
©

Ëîî,ksh,h
H. La commande read

1 . Syntaxe

Premièresyntaxe
read varl
read varl var2 ...

Deuxième
syntaxe

ksh
readvar?"Message
d&#39;inVite"

2. Lectures au clavier

La commande read lit sonentréestandardet affectelesmotssaisisdansla ou


lesvariable(s)dontle nomestpasséen argument.La listedescaractères sépara-
teursde motsutilisésparread sontstockésdansla variabled&#39;environnementIFS
(ellecontientpardéfautlescaractères
espace,tabulation(\t) et sautde ligne(\n)).

Exemg/es

Le
mot
saisi
est
stocke
dans
lavariable
varl
.-
S read varl
bonjour

Secho
svarl
bonjour
Touslesmotssaisissontstockésdansla variablevarl :
S read varl
Lesbasesde la grorammation shell

Lepremiermot est stockédans varl, le deuxièmedans var2 :


S read varl var2
Au revoir
S echo Svarl
Au
S echo Svarz
revoir
Lepremiermot est stockédans varl et tout le restede la ligne dansvar2 .-
S read varl var2
Au revoir tout le monde
S echo Svarl
Au
S echo Svar2
revoir tout le monde
Le mot est stockédans varl et var2 est vide :
S read varl var2
Merci
S echo Svarl
Merci
S echo Svar2
S
Cette versionde read permet de spécifier un messaged&#39;invite
(en ksh seule-
ment) :
S read var1?"Entrez une valeur:
Entrez une valeur: Hello

rights
A/l
Ieserved
S echo svarl
Hello

ENI
Editians
-
©

sh, ksh, bash


3. Code de retour

La commanderead renvoieun code vrai si elle ne reçoit pas l&#39;information


fin de
fichier (matérialiséepar d au clavier).

Exemples
Une valeura été saisie, read renvoieun code vrai :
S read var
Voici masaisie
S echo S?
0
S echo Svar
Voici masaisie
Si l&#39;utilisateur
tape immédiatementsur la touche [Entrée], il a saisi la chaîne
vide. La variableest vide mais le code est vrai.
S read var
[Entrée]
S echo S?
0
S echo Svar
S
Si l&#39;utilisateur
appuiesur les touches d, il envoiel&#39;information
Fin de chier à la
commande.La variableest vide et le codeest faux.
S read var
d
S echo S?
l
S echo Svar
S

D Lavariable
necontiendra
jamais"d. Seulletestducodepeutdiresi l&#39;utilisa-
teur a saisi [Entrée]ou d.

Programmtion
shellso Unx/inux
Lesbasesde la Erogrammationsllgll

4. La variable IFS

Cettevariablecontientpar défaut les caractèressuivants: espace,tabulation(\t)


et sautde ligne(\n).

Exemple
La commandeod permetde voir la valeurde chaqueoctet contenudans IFS (le
caractère \c permet de ne pas récupérerdans le tube le saut de ligne de la
commandeecho) :
S echo "SIFS\c" I od -c
0000000 \t \n
0000003
S
Lecontenude la variableIFSpeutêtre modifié.

Exemple
Sauvegarde
de la valeuractuellede IFSpour restaurationultérieure:
S OLDIFS="5IFS"
Modificationde IFS.-
5 IFS=":"
Le caractère"espace"redevientun caractèrenormal, tandis que le caractère":"
devientle séparateurde mots .-

rights
A/I
reserved
S read varl var2 var3
mot1:mot2mot3:mot4
S echo Svarl
motl

ENI
Éditions
-
S echo svar2
mot2mot3
S echo Svar3
mot4

©
mmmuumwuwmmwwmmnm**mummuuwuuSmmmmmmmmmmmmmmnu
sh, ksh, bash
SËEPÀWÆ
4
Restaurationde la valeurinitiale de IFS:
S IFS="SOLDIFS
"

O Lesexpressions
SIFSetEBOLDIFS
doivent
obligatoirement
êtreplacées
entre
guillemetspour que les caractèresinternesne soient pas interprétéspar le
shell.

I. Exécution de tests

1. La commande test

Cettecommandepermetde faire destestssur desfichiers,deschaînesde caractè-


reset desnombres.Ellerenvoiele code0 ou 1 (vraiou faux)que l&#39;utilisateur
peut
consulteren faisantafficherla valeurde 25?.La commandetest proposedeuxsyn-
taxeséquivalentes.

a. Syntaxe

Premièresyntaxe
test expression

Deuxièmesyntaxe: commandetest
[ expression ]
La pairede crochetsreprésentela commandetest. Lescrochetsouvrantet fer-
mant sont respectivement
suivis et précédésd&#39;un
espace.Cettesyntaxeest plus
agréableà utiliser.
b. Testssur les fichiers

Expression Optionimplémentée Codede retour


en Bourneshell .7
Testssur l&#39;existence
et la taille du fichier
anomfic enomfic non Vrai si le fichierexiste

Programmation shell sous Unix/Linux


Lesbases
delaprogrammation
shell

Expression Optionimplémentée Codede retour


en Bourneshe||7
snomfic oui Vraisi lefichiern&#39;est
pasvide
Testssurletypedufichier
fnomfic oui Vrai
silefichier
estdetype
ordinaire
i

l
-d nomfic oui Vraisi lefichierestdetyperépertoire|
-h nomfic oui Vraisi lefichierestdetypeliensym-
bo que
-L nomfic non Vraisi lefichierestdetypeliensym-
bolique
bnomfic oui Vraisi lefichierestdetypespécial
bloc
cnomfic oui Vraisi lefichierestdetypespécial
caractère
-p nomfic oui Vraisi lefichierestdetypetubenom-

-S nomfic non Vraisi lefichierestdetypesocket
Testssurlespermissions
dufichier
-r nomfic oui Vraisi lefichierestaccessible en lec-
ture
wnomfic oui Vraisi lefichierestaccessibleenécri-
ture

reserved
rights
All
-x nomfic oui Vraisi lefichierpossèdeledroitd&#39;exé-
cution
-u nomfic oui Vraisi lefichierpossède le setuid-bit
gnomfic oui Vraisi lefichierpossède lesetgidbit

-
ENI
Éditions
-k nomfic
Divers
nomficl-nt nomfic2
oui

non
Vraisi lefichierpossède le sticky bit

Vraisi lefichiernomficl estplus


© récentquelefichiernomfic2
nomficl-ot nomfic2 non Vraisi lefichiernomficl estplus
ancienquelefichiernomfic2
a. _

Expression Optionimplémentée Codede retour


en Bourneshell?
nomficl efnomficz non Vraisi lesfichiersnomficl et nom-
ficz référencent ia mêmeinode
(liensphysiques)
-0 nomfic non Vraisi l&#39;utilisateur
estpropriétaire
du
fichier
-G nomfic non Vraisi l&#39;utilisateur
appartient
augrou-
pe propriétaire
dufichier
t [ desc] oui Vraisi le descripteur
(1 pardéfaut)
estassociéà unterminal

Exemples
/etc/passwd
est unfichierordinaire.-
S test -f /etc/passwd
S echoS?
0
Mêmetest,maisavecl&#39;autre
syntaxe:
S [ -f /etc/passwd ]
S echoS?
0

Testd&#39;un
fichierquin&#39;existe
pas:
5 1s
essai out out2 premier resu
S [ -E out3 ]
S echoS?
1

/tmp estunrépertoire:
S I d /tmP 1
S echoS?
O

Programationsheil
ss Uixi
Lesbasesde la programmationshell

Initialisationd&#39;une
variable.-
S fi1e1=/etc/passwd
Le fichier contenudans filel (ietc/passwd)n&#39;est
pas un répertoire:
S test d Sfilel
S echo S?
1
L&#39;utilisateur
n&#39;a
pas le droit d&#39;écriture
sur /etc/passwd:
S test -w Sfilel
S echo S?
1
S

c. Testssur les chaînesde caractères


Unechaînepeutêtre composéede n&#39;importe
quellesuite de caractères(y compris
deschiffres).

Expression Codede retour


-2 chl Vraisi la chaîneest de longueur0 ( z:zero)
nchl Vraisi la chaînen&#39;est
pasde longueurO (-n:nonzero)
chl = ch2 Vraisi lesdeuxchaînessont égales
chl != ch2 Vraisi lesdeuxchaînessont différentes
chl Vraisi la chaînen&#39;est
pasvide

0 li estrecommandé
demettre
lenomdesvariables
entreguillemets.
Eneffet,si

rights
AII
reserved
une variableest vide, les guillemetspermettentde transformerl&#39;expression
en
chaînede longueur0 (voir exemplesci-dessous).Si une variablevide n&#39;est
pas
entouréede guillemets,sa substitutiondonnedu vide (c&#39;est
commes&#39;il
n&#39;y
avait
pas eu de nom de variable).Dansce cas, la commandetest afficheraune

ENI
Editions
-
erreurde syntaxe.

sh,kÿh ÿbash
Exemples
Initialisationde deuxchaînes:
S ch1=root
S ch2=christie
Lesdeuxchaînesne sontpas égales:
S[ nschln = uschzu1
S echo S?
l
ch1 n&#39;est
pas vide, le test est donc vrai :
S test -n "schl"
S echo S?
O
S
ch1 n&#39;est
pas vide, le test est doncfaux :
S test -z "schl"
S echoS?
1

Lesguillemetspermettentde transformerdu videen "chaînevide":


S test -n "Sch3" # test -n "
S echo S?
1

Sansles guillemets,la variableest substituéepar du vide, ce qui provoqueune


erreurde syntaxe(il manquel&#39;argument
de l&#39;option
n) :
S test -n Sch3 # test -n
test: argumentexpected
Sans option, la commandetest se comportede la même manière vis-à-vis
d&#39;une
"chaînevide"ou du vide:
s test "sans" tlrtest
S echo S?

Poraation shelus Uix/Linu


es ses _, V rram
l
S test Sch3 # test
S echoS?
1
S

d. Testssurlesnombres

Expression Codede retour


nb1-eqnb2 Vraisi nb1 estégalà nb2
nb1 nenb2 Vraisinb1 estdifférentdenb2
nb1-It nb2 Vraisi nb1 eststrictement à nb2
inférieur
nb1-le nb2 ouégal à nb2
Vraisi nb1 estinférieur
nb1-gt nb2 Vraisi nb1 eststrictement
supérieurà nb2
nb1-genb2 Vraisi nb1 estsupérieurouégalà nb2

Exemples
Saisiede deuxnombres
au clavier:
5 read nb1
12

Sread
nb2
-3

reserved
rights
A/I
Secho
snhl
l2
S echoSnhZ
3

-
ENI
Editions desdeuxnombres:
Comparaisons
S[ Snbl -lt 511112
S echos?
]

© l
S[ Snbl ne Snb2]
S echos?
O
0 ll n&#39;est
pasindispensable
demettre
desguillemets
autour
desvariables
conte-
nant des chiffrescar un nombrene peut être de longueurnulle (contrairement
à une chaîne).

e. Les opérateurs

Opérateurde la commandetest Signification


l (parordredepriorité
décroissante)
! Négation
-a ET
-o OU
L&#39;ordre
d&#39;évaluation
des opérateurspeut être imposégrâceaux caractèresde regrou-
pement: \( \).

Exemples
La commandetest renvoievrai si Sfichier n&#39;est
pas un répertoire:
S fichier=/etc/passwd
5 [ Ë -d. Sfichier ]
S echc S?
0
S
La commandetest renvoievrai si srep est un répertoireet si l&#39;utilisateur
a le
droit de le traverser:
S rep=/tmp
S echo Srep
/tmp
S [ -d Srep -a -x Srep ]
S echo S?
0
S
Il est possiblede modi er la priorité des opérateursen utilisant desparenthèses:
S [ w Sficl -a \( -e Srepl -0 e Srep2 \) ]

Promai el sousnix/Linuç
9 Lesparenthèses
nedoivent
pasêtreinterprétées
parleshell(regroupement
de
commandes),mais par la commandetest. Ellesdoiventdonc être protégées.

0 Il doity avoirunespace
autour
desopérateurs
!, -a et -o.
f. Exempleconcretd&#39;utilisation
La commandetest est utilisée avec les structuresde contrôle. La structurede
contrôleif est présentéeici dans le but d&#39;illustrer
la commande.

La structurede contrôleif
if commandel
then
commande2
commande3

else
commande4
fi ...
0U
if commandel
commande2
AII
reserved
Iights
commande3 ; then

Editians
ENI
- else
© commande4
fi
Chapitre4

Exemple
Un script shell qui teste le nombred argumentsreçus :

Snl testarg.sh
1 #1/usr/bin/ksh
2 if [ Sir -ne 2 1
3 then
4 echo "Usage: S0 argl arg2"
5 exit 1 /
6 fi
7 echo "Le nombred&#39;argumentsest correct"
8 exit 0
S testarg.sh fiel fic2
Le nombred&#39;arguments
est correct
S echo S? # Statut de retour du script (exit Q
O
S testarg.sh fiel
Usage:testarg.sh argl arg2
S echo S? # Statut de retour du script (exit 1)
1
S

2. La commande [[1]

ksh bash

La commande[[ ]] est une versionenrichiede la commandetest. Lesopéra-


teurs présentésprécédemment (cf. sectionLa commandetest de ce chapitre)sont
toujoursvalables(sauf -a et o).

D Lesopérateurs
logiques
-a et o ontétéremplacés
par&&et | |.
&#39;° &#39;5
3&#39;
&#39;P°
. cmma" est
Testssur les chaînes
Lesguillemetsautourdes nomsde variablesne sont plus obligatoires.
Lesbasesdela Brogrammation
shell

Exemples
syntaxescorrectespour testersi une chaîneest vide :
vS echo Svide

test -z "Svide"

ommo
echo S?
[ -z "Svide" 1
echo S?

[[ -z Svide ]] z"
echo s? i

[l -z "Svide" l]
echo S?
[[ Svide = "" 1]
echo 5?

- Denouveauxopérateursont été ajoutés.

Opérateurssupplémentaires Codede retour


chaine= modele Vraisi chaine correspondau modèle
chaine!= modele Vraisi chaine ne correspondpasau modèle
chainel < chaine2 Vraisi chainel est iexicographiquement
avant
chaine2

rights
AII
reserved
chainel > chaine2 Vraisi chainel est lexicographiquement
après
chaineZ

ENI

Éditions
©

sh, ksh, bash


Sllè
En utilisant les expressionsvues au chapitre Mécanismesessentielsdu shell
Substitutionde noms de fichiers, il est possiblede comparerdes chaînespar rap-
port à un modèle.Le tableauci-dessousrappelleles caractèresspéciauxutilisables
dans les modèlesde chaînesde caractères.

*
7
Caractèresspéciauxpour modèles
de chaînesde caractères
Caractères
spéciauxvalablesdanstous les shells :
0 à n caractères
Signification

1 caractèrequelconque
[abc] 1 caractèreparmiceuxcités entre
les crochets
[!abc] 1 caractèrene faisantpas partie
des caractèrescités entre les crochety
Caractères
spéciauxnon validesen BourneShell (en bashactiverl&#39;option
Ç
extglob: shopt -s extglob).

?(expression) 0 ou 1 fois l&#39;expression


*(expression) 0 à n fois l&#39;expression
+(expression) 1 à n fois l&#39;expression
?(expression1|expression2|...)
@(expression) 1 fois l&#39;expression
llexpression) O fois l&#39;expression
Alternatives
*(expression1
|expression2
|...)
+(expression1|expression2|...)
@(expression1|expression2
| ...)
!(expression1|expression2|...)

Exemple
Le script test_nbre.shtestesi la valeursaisieest un nombre.-

Snl test_nbre.sh
Les basesde la programmationshell

3 read nombre
4 # On teste si le nombreest composed&#39;une
suite de chiffres
5 # eventuellementprecedeed&#39;un
signe + ou
6 if [[ Snombre= ?([+-])+([0-9]) ]]
7 then
8 echo "Snombreest un nombre"
9 exit 0
10 fi
ll echo "Snombren&#39;est
pas un nombre"
12 exit 1
S
Stest_phre.sh
Entrez un nombre:456
456 est un nombre
S test_nbre.sh
Entrez un nombre:+456
+456est un nombre \
S test_nbre.sh
Entrez un nombre:-456
-456 est un nombre
S test_pbre.sh
Entrez un nombre:78*
78*
S n&#39;est
pas un nombre
S test_nbre.sh
Entrez un nombre:az78
az78 n&#39;est
pas un nombre

AII
rights
reserved
TestsIogigues
Lesopérateurs-a et -o sont remplacéspar sa et | | ;
- Lesparenthèsesn&#39;ont
ENI
-
pas besoind&#39;être
protégées.

Commandetest ( [l ) Commande[[1] Signification

Editians
\( \)
© !
( )
!
Regroupement
Négation
d&#39;expressions

-a && ET logique
-0 || OU logique
ghagitre4
Exemple
Avecla commandetest :
if [ w Sficl -a \( -e Srepl o e Srep2 \) ]
then

Avecla commande[[ J] .-
if [[ -w Sficl &&( -e Srepl Il -e Srep2 ) ]]
then

J. Les opérateurs du shell


Cesopérateurspermettentd&#39;exécuter
ou non une commandeen fonction du code,
de retourd&#39;une
autre commande.L&#39;évaluation
est faite de gaucheà droite.

Opérateur Signification
&& ET logique
|| OU logique

1. Évaluationde l&#39;opérateur
&&

Syntaxe
commandel
&&commande2
- La deuxièmecommandeest exécutéeuniquementsi la premièrecommande
renvoieun codevrai.
- L&#39;expression
globaleest vraie si les deuxcommandesrenvoientvrai.

Programmation shell sous Unix/Linux


Lesbasesde la Brogrammationshell

Exemples
Le répertoireltmp/svgn&#39;existe
pas, la commandecd n&#39;est
doncpas exécutée:
S 1s d /tmp/svg
/tmp/svg: No such file or directory
S pwd
/expert/home/christie
s [t -d Amp/svq l] sa cd ltmp/svg
S echo S? # Codede la commande
[[ ]]
1
Spwd
/expert/home/christie
Le répertoireltmp/svgexiste,la commandecd est doncexécutée.-
s mkdir ltmp/svg
S [l -d ltmp/svq l] u cd Itmp/svg
S pwd
/tmp/svg
S
Cesactionspeuventégalementêtreimplémentées
avecla structurede contrôleif.

S pwd
/expert/home/christie
S ls -d /tmp/svg
/tmp/svg

Ali
r/ghts
reaorvod
5 if [[ d /tmp/SV91]
then # PromptPS2du shell

-{/)\<U7\/VV
cd /tmp/svg
fi # Fermeturedu if: lancementde la commande
pwd
tmp/svg

ENI
Edillons
- 2. Évaluationde l&#39;opérateur
||
0
Syntaxe
commandel
il commandez
- La deuxièmecommandeest exécutéeuniquementsi la premièrecommande
renvoieun codefaux.
- L&#39;expression
globale est vraie si au moins l&#39;une
des deux commandesrenvoie
vrai.

Exemple
Le répertoireltmp/svgn&#39;existe
pas, la commandeecho est donc exécutée:
S ls -d /tmp/svg
/tmp/svg: No such file or directory
S pwd
/expert/home/christie
3 [[ -d /tmp/svg ]] || echo "Le repertoire /tmp/svg n&#39;existe
pas" /
Le repertoire /tmp/svg n&#39;existe
pas
Le répertoireltmp/svgexiste,la commandeecho n&#39;est
doncpas exécutée.
S mkdir /tmp/svg
S [[ -d /tmp/svg ]] || echo "Le repertoire /tmp/svg n&#39;existe
pas"
S
Ces actions peuvent également être implémentéesavec la structure de con-
trôle if.
S ls -d /tmp/svg
/tmp/svg: No such file or directory
S if [I ! -d /tmp/svg ]]
> then
> echo "Le repertoire /tmp/svg n&#39;existe
pas"
> fi
Le repertoire /tmp/svg n&#39;existe
pas
S

0 Nepasconfondre
lesopérateurs
dushell( &&et l | ) quieffectuent
uneopéra-
tion logique entre deux commandesavec les opérateursde la commande
[[ 1] (&& et [l ) qui sont internesà celle-ci.

Programmaon
shellous iLinux
es ase la rmto l

K. L&#39;arithmétique
1. La commande expr

a. Syntaxe
expr nbl opérateur nb2
expr chaîne : expression_régu1ière

b. Opérateurs
Le tableausuivant présenteles opérateursde la commandeexpr. Certainsopéra-
teurs sont fabriquésavec des caractèresayant une significationspécialepour le
shell. Il faut donc impérativementempêcherce dernierde les interpréter; c&#39;est
la
raison pour laquellecertainssymbolesdoivent impérativementêtre précédésd&#39;un
antislash.

Opérateurs Signification
Opérateursarithmétiques
nbl + nb2 Addition
nbl - nb2 Soustraction
nbl \* nb2 Multiplication
nbl / nb2 Division
nbl % nb2 Modulo
Opérateursde comparaison
nbl \> nb2 Vrai si nbl est strictementsupérieurà nb2
nbl \>= nb2 Vrai si nbl est supérieurou égal à nb2

Iights
AII
reselved
nbl \< nb2 Vrai si nbl est strictementinférieurà nb2
nbl \<= nb2 Vrai si nbl est inférieurou égal à nb2
nbl = nb2 Vrai si nbl est égalà nb2

Éditions
ENI
-
nbl l= nb2 Vrai si nbl est différentde nb2
Opérateurslogiques
chainel \& chaine2 Vrai si les deuxchaînessont vraies(valeurdifféren-
te de chaînenulle et O)
©

sh, ksh, bash


332E? 4

Opérateurs Signification
chainel\] chaine2 Vraisi l&#39;une
deschaînesestvraie(valeurdifférente
dechaînenulleet 0)
Opérateurs
divers
-nbl Opposéde nbl
\( expression
\) Regroupement
Comparela chaîneavecl&#39;expression
chaine: expression_réguiière régulière
(des
exemplesserontdonnésauchapitreLesexpressions
régulières).

0 Les
arguments
delacommande
expr
doivent
être
séparés
par
(aumoins)
un i
espaceou unetabulation. \

Exemples
Addition: t
S x=1
S expr Sx + 2
3
Mauvaisesyntaxe: la commande
reçoitunseulargumentqui est vucommeune
chaînede caractères:

S expr Sx+2
1+2

S
Le caractère"*"est interprétépar le shell(remplacépar la listedesfichiersdu
répertoire
courant)avantexécution de la commande expr .-
S expr sx * 2
expr: syntaxerror
Lesbasesdela Erogrammation
shell
Le caractère"*" doit impérativementêtreprotégé:
S expr Sx \* 2
2
S
Récupérerle résultatde la commandedansune variable:
S expr Sx - -6
7
S res= expr Sx -6\
S echo Sres
7

Regroupement
d&#39;expressions
:

y=2 /*\
res= axpr
Sy\* 3+1

(nùJ-Uÿl xlü
# Equivalent à res= expr \( Sy \* 3 \) + 1
echo Sres
res= expr sy \* \( 3 + 1 \)
echo Sres

0 Lesexemples
présentés
cî-dessous
montrent
qu&#39;il
nefautpasconfondre
l&#39;affi-

rights
AII
reserved
chagede la commandeet soncodede retour!

La valeuraffichéepar une comparaisonne représentepas la valeurde vérité du


test :

Editions
ENI
- S x=1
S expr sx \>= O
1
S echo S?
# Affichage

© 0 # Codede retour
Danscet exemple,l&#39;affichage
de la commandeexpr n&#39;est
pas exploité,donc la
sortiestandardest dirigéevers/dev/null :
Chapitre4

2 # Test du nombred&#39;arguments
3 if [[ 5# -ne 2 ]] ; then
4 echo "Mauvaisnombred&#39;arguments"
5 echo "Usage: S0 nbl nb2"
6 exit 1
7 fi
8
9 # Coparer nbl et nh2 avec expr
10 if expr S1 \> S2 > /dav/null
ll then
12 echo "expr: S1 est plus grand que S2"
13 fi
14 # Le test peut egalementetre fait avec [[ ]] (ou [ ])
15 if [[ S1 -gt S2 1]
16 then
l7 echo "[[ ]]: S1 est plus grand que S2"
18 fi
S
5 plusgrandque4 2
expr: 4 est plus grand que 2
[[ ]]: 4 est plus grand que 2
S

2. La commande (( ))
ksh bash

a. Syntaxe
((expression_arithmétique))
b. Utilisation
Cettecommande
présente
desavantages
suria commande
expr :
Elie disposede nombreuxopérateurs;
Lesargumentsn&#39;ont
pasbesoind&#39;être
séparéspardesespaces
;
Lesvariables
n&#39;ont
pasbesoind&#39;être
préfixées
parS ;
- Lescaractères
spéciaux
dushelln&#39;ont
pasbesoin
d&#39;être
protégés
;
Lesaffectationsse font dans la commande;

Progammation
shelisouUi/Linux
Le basesde la n; t ."

- Sonexécutionest plus rapide.


Elle reprendune grandepartiedes opérateursdu langageC.

Opérateurs Signification
Opérateursarithmétiques
nb1 + nb2 Addition
nb1 - nb2 Soustraction
nbl * nb2 Multiplication
nb1 / nb2 Division
nb1 % nb2 Modulo
Opérateurstravaillantsur les bits
Nnbl Complémentà 1
nb1 >> nb2 Décalagesur nb1 de nb2 bits à droite
nb1 << nb2 Décalagesur nb1 de nb2 bits à gauche
nb1 & nb2 ET bit à bit
nbl | nb2 OU bit à bit
nb1 " nb2 OU exclusifbit à bit
Opérateursde comparaison
nb1 > nb2 Vrai si nbl est strictementsupérieurà nb2
nb1 >= nb2 Vrai si nb1 est supérieurou égalà nb2
nbl < nb2 Vrai si nb1 est strictementinférieurà nb2
nb1 <= nb2 Vrai si nb1 est inférieurou égalà nb2
nb1 == nb2 Vrai si nb1 est égal à nb2

AII
reserved
rights
nb1 != nb2 Vrai si nb1 est différentde nb2
Opérateurslogiques
lnbl Inversela valeurde véritéde nb1

ENI
Edit/
- &&
llans
Opérateursdivers
ET
0U

-nbl Opposéde nb1


©

sh, ksh, bash


Chapitre4

Opérateurs Signification
nbl = expression Assignement
(expression) Regroupement
nbl binop: nb2 binopreprésente
l&#39;un
desopérateurs
suivants:
+, , *, /, %, >>, <<, &, |, ". Cetteécri-
ture est équivalenteà : nbl = nbl binop nb2

Exemples
Ajouter 10 à la variablex :
S x=10
S (( x = Sx + 1D ))
S echo Sx
20
Lesespacesne sont pas obligatoires.-
S x=10
S ((x=Sx+10))
S echo Sx
20
Le symboles peut être omis .-
S x=10
S ((x=x+10))
S echo Sx
20
S
Encoreune autre écriture:
S x=10
S ((x+=10)) # Equivalent ä ((x=x+10))
S echo sx
20
S

rogamation shellsousUnix/Linux
Lesbasesde la Erorammationshell

Le script egaLshindiquesi deuxnombressont égaux:

Snlegal.sh

1 #3/usr/bin/ksh

N
w
m
n # ComparerS1et S2 avec (( ))
if (( S1== S2 )) ; then
echo "S1 et S2 ÿont egaux"
else
4
mfi echo "S1 et S2 sont differents"
sh 3 2
egal.
sont differents
sh 3 3
et2 sont egaux

M
w
m egal.
et 3
Regroupements
et testslogiques:
S if (( ( x > 0 ) G5 (y > x) ))
>> then
>> ...

rights
AI/
reserved
3. La commande let

ksh bash

Editions
ENI
-
La commandelet expression est équivalenteà ( (expression) ) .

Exemple
Cesdeuxcommandessont équivalentes:
© S let "x = x * 10"
S ((8 = X * 1°))
L. Substitutiond&#39;expressions
arithmétiques
ksh bash

Lescaractères
de substitution
de commandes
ont été présentés
dansla section
Substitution
decommandes Il existe
decechapitre. également
descaractères
spé-
ciauxdu shellpermettant
de substituer
uneexpressionarithmétique
parson
résultat.

Syntaxe
CommandeargumentlS((expression-arithmétique)) . argumentn

Exemple
Rappelsurla substitution
de commandes
:
S echo"Nombre connectes: who| wc l "
d&#39;utilisateurs
Nombred&#39;utilisateurs
connectes: 5

:
Écritureéquivalente
S echo"Nombre
d&#39;utilisateurs
connectes: S(who| wc1)"
Nombred&#39;utilisateurs
connectes: 5
Lacommande( ( )) n&#39;affiche
rien:
S x=2
S ((x+1)) vaut: 3
# L&#39;expression
S ((x=x+1)) vaut 3
# x est affecté avec3 et l&#39;expression
S echoSx
3
Doncla commande( ( ) ) estsubstituée
pardu vide:
S echo"Apresincrementation,x vaut : ((x=x+1)) "
Apresincrementation,x vaut :
Poursubstituer
l&#39;expression
parsavaleur,il faututiliser
lescaractères
spéciaux
dushells(( )).

Prograto sellousUni/Lx
Les basesde la rogrammation shell

S x=2
S echo "Apres incrementation, x vaut : 5((X=X+1))"
Apres incrementation, X vaut : 3
S echo Sx

0 Nepasconfondre
(( )) ets(( )). (( )) estunecommande
interne
au
shell et s (( )) sont des caractèresspéciauxdu shell au mêmetitre que
ouSU.

M.Mise au point d&#39;un


script
Le shell proposequelquesoptionspermettantde mettreau point desscriptsshell.

1. Option -x
L&#39;option
-x permet de visualiser les commandestelles qu&#39;elles
sont exécutées,
(fest-à-direaprèstraitementdes caractèresspéciauxdu shell.

Premièresyntaxe
Activerl&#39;option
:
set x
Désactiverl&#39;option
:
set +x

rights
AII
resen/ed
Deuxièmesyntaxe

ksh bash

ENI
Éditions
«
Activerl&#39;option
:
set O XÈIBCE
Désactiverl&#39;option
:
set +0 xtrace
©

sh, ksh, bash


Chapitre4

Troisièmesyntaxe
invoquerle sheii interpréteuravecl&#39;option
x :
S ksh -x script

Exemple
Voicilescriptaffiche.sh
danslequeluneerreura étéintroduite.
Ledéveloppeur
duscripta, par inadvertance,
écrit fic au lieu de sfic (ligne4) :

Snl affiche.sh
l #1/usr/bin/ksh
echo "Nomdu fichier a visualiser: \c"
read fic
if [[ f fic ]] ; then
cat Sfic

ooxloxmwsww
else
echo
"Fichierinexistant"
fi
Exécutiondu scriptsansmiseau point.Il semblesurprenant
(voireinquiétant?)
quele fichierletc/passwd
ne soitpastrouvé!
S affiche.sh
Nomdu fichier a visualiser: /etc/passwd
Fichier inexistant
Exécution
duscripten activantl&#39;option
x. Ici l&#39;option
estpasséeen argument
au
shellinterpréteur
duscript.Leslignes
affichées
pourla miseaupointsontprécé-
déesd&#39;un
signe"+". Onconstatequela variablefic ([[ f fic ]]) n&#39;est
pas substituéepar sa valeur:
S ksh -x affiche.sh
+ echo Nomdu fichier a visualiser: \c
Nomdu fichier a visualiser: + read fic
/etc/passwd
+ [[ f fic ]]
+ echo Fichier inexistant
Fichier inexistant
Le basesde I l
L&#39;activation
de l&#39;option
peut égalementse faire à l&#39;intérieur
du script (ligne2) :
S nl affiche.sh
l #1 /usr/bin/ksh
2 set -x
3 echo "Nomdu fichier a visualiser: \c"
4
Correctionde / erreuret exécutionavecmise au point. Cettefois-ci la variableest
substituéepar sa valeur:

Snl affiche.sh
1 #!/usr/bin/ksh
2 set -x
echo "Nomdu fichier a visualiser: \c"

xoooxlmuwu>
read fic
if [I -f "sfic" 1] ; then
cat Sfic
else
echo "Fichier inexistant"
fi
S affiche.sh
+ echoNomdu fichier a visualiser: \c
Nomdu fichier a Visualiser: + read fic
/etc/passwd

rights
AII
reserved
+ [ f /etc/passud ]
+ cat /etc/passwd
root:x:O:1:SuperAUser:/:/usr/bin/ksh
daemonzx l:l::/:
bin:x:2:2"/usr/bin:

Editians
ENI
-
sys:x:3: /:
adm:x:4:4:Admin:/var/adm:
è...
©
593.9534
2. Autres options

Fonction Bourneshell,ksh,bash ksh,bash


Lecture
descommandes
sanslesexé- set-n set onoexec
deserreursde syntaxeset+n
cuter.Détection set +o noexec

shell.
Affichage
des
commandes
avant
subs-
setv set
-overbose
titution
descaractères du
spéciaux set+v set+overbose
shell.

Exemple
Détection erreurdesyntaxe
d&#39;une shellenligne4 (ilmanque
unguillemet),
sans
lancerl&#39;exécution
duscript:

SnlaEfiche.sh
l #1/usr/bin/ksh
echo"Nom du fichier a visualiser: \c"

Sqmmàwm
read fic
if [[ -5 "Sfic ]] ; then
cat Sfic
else
echo"Fichier inexistant"
fi
S ksh -n affiche.sh
affiche.sh[9]: syntaxerror at line 9 : "&#39;
unmatched
S

N. Les structures de contrôle

1. if
Les basesde la Erogrammation
shell

Si la commanderenvoiefaux et qu&#39;il
n&#39;y
a pas de partieelse, le flux d&#39;exécution
se poursuità la premièrecommandesituéesous le fi.

Premièresyntaxe
if commandel
then

commande2

c0mmande3
else
commande4
fi

Deuxièmesyntaxe
La partieelse est facultative.
if commandel
then
AII
reserved
rights
commande2
EN/
Editions
commande3
©
fi
MMMMW M ,...NMM
0 Lemotcléfi représente
lafermeture
duif. Lemotcléelif n&#39;a
pasdefer-
meture.

Autressyntaxes
Lemotcléthenpeutêtreplacé
surla première
ligneà condition
d&#39;utiliser
un;
pourle séparer
de la commande.
if commandel
; then
commande2
fi
ll estégalement
possible
d&#39;imbriquer
desstructures
decontrôle.
Lasyntaxe
ci dessous
estéquivalente
à lasyntaxe
elif présentée
précédemment.
if commandel
then
commande2

else
if commande3
then
commande4

else
if commande5
then
commandeô
else

commande7
Le s de la -
4 echo "Usage: S0 nom_user"
5 exit l
6 fi
7 if grep q " Sl:" /etc/passwd
8 then
9 echo "L&#39;utilisateur
S1 est defini sur le systeme"
10 else
11 echo "L&#39;utilisateur
S1 n&#39;est
pas defini sur le systeme"
12 fi
13 exit 0

S exist_user.sh christie
L&#39;utilisateur
christie est defini sur le systeme
5 exist_user.sh zoe
L&#39;utilisateur
zoe n&#39;est
pas defini sur le systeme
Ce script analysele nombred&#39;argumentsreçus(ligne2) avec la commandede test
[[1]. Si ce nombreest différentde 1, le traitementne peut être fait, donc le script
se termineen retournantun statusfaux (ligne 5).
La commandegrep permetde rechercher,en modesilencieux(-q), le nom de l&#39;uti-
lisateurdans le fichier letc/passwd(ligne 7). Le caractère" utilisé dans la chaîne
à rechercherpossèdeune significationspécialepour la commandegrep : il signi e
"débutde ligne",c&#39;est-à-dire
que grep doit rechercherle nom "51" suivi du carac-
tère ":" uniquementen début de ligne. La commandegrep renvoieun code de
retour vrai lorqu ellea trouvé au moins une ligne, faux dans le cas contraire.La
structurede contrôle"if" orientele flux d&#39;exécution
en fonctionde ce code.

Deuxièmeexemple

A/i
rights
Ieserved
Le script codepos.shdemandeà l&#39;utilisateur
de saisir un code postal et teste si
ce dernier est valide:
S nl codepos.sh
1 #1 /usr/bin/ksh

Editions
ENI
© 2
3
4
5
echo "Entrez un code postal \c"
read cp
if [[ Sep= 75[O-9][0-9][0-9] ]]
then

sh, ksh, bash


4
Çhagitre
6 echo"Scp est un code postal parisien"
7 elif [l SCP= @(7l78ll9l1-5])[0-9]lO-9l[0-9] 1]
8 then
9 echo"Scpest un code postal de la regionparisienne"
10 elif [[ Scp= @([0 9][O-9][O*9][0-9][0 9]) 1]
1l then
12 echo"Scp est un codepostal de province(Metropole)"
13 else
14 echo"Scpn&#39;est
pasuncodepostaldeFrance
Metropolitaine"
15 fi

S codepos.sh
Entrezun code postal : 75020
75020est un codepostal parisien
S codepcs.sh
Entrezun codepostal : 95851
95851est un codepostal de la regionparisienne
S codepos.sh
Entrezun codepostal : 89000
89000est un codepostal de province(Metropole)
S codepos.sh
Entrezun codepostal 1 789651
789651n&#39;est
pasun codepostal de FranceMetropolitaine
S codepos.sh
Entrezun codepostal : 78389
78a89n&#39;est
pas un codepostal de FranceMetropolitaine
Cescript
sera
interprété
parunKorn
Shell
(ligne
1).Ilestdonc
possible
d&#39;utilis
lacommande
[[ ]] etlacomparaison
avecdesmodèles
dechaînes
decaractè-
res(lignes4, 7 et 10).
MWMMMWWWMWWWWWW w WmWMiWwM
0 Pour
implémenter
cescript
enBourne
Shell,
la structure
caseestplus
adaptée.

2. Case
Lastructure
decontrôle
casepermet
également
deréaliser
destests.
Ellepermet
decomparer
une à différentes
variable valeurs
oumodèles.Lorsque
letests&#39;
prête,
elleremplace
avantageusement
leif-elif carelleestbeaucoup
plus
lisible.

. maum
Programmation
shellsousUnix/Linux
Lesbasesde la programmation
shell

a. Syntaxe
case Svariable in
modelel) commande
i?
modele2) commande
li
modele3l modele4| modele5) commande

858C

b. Principe
Le shell comparela valeur de la variableà chacundes modèlescités (l&#39;évaluation
est faite de haut en bas). Lorsquela valeur correspondà l&#39;undes modèles,les
commandesrelativesà ce derniersont exécutées.Les caractères;; représententla
fin du traitementet permettentde sortir du case (la prochainecommandeexé-
cutée est celle située sous le esac). Les modèlessont des chaînesde caractères
pouvantinclure les caractèresspéciauxprésentésau chapitre Mécanismesessen-
tiels du shell - Substitutionde noms de fichiers. Le caractère| permetd&#39;exprimer
l&#39;alternative
entre plusieursmodèles.

0 L&#39;oubli
descaractères
;; génère
uneerreur
desyntaxe.
Le tableauci-dessousrappelleles caractèresspéciauxconcernés.

Caractèresspéciauxpour modèles Signification


de chaînesde caractères

A/I
resen/ed
Iights
Caractèresspéciauxutilisablesdans les modèles(valablesdanstous les shells):
* O à n caractèresquelconques.
? 1 caractèrequelconque.

Ediiions
ENI
-
[abc] 1 caractèreparmi ceuxcités entre les
crochets.
[!abc] 1 caractèrene faisant pas partiedes
caractèrescités entre les crochets.

sh, ksh, bash


Chapitre4

Caractères
spéciaux
pourmodèles Signification
de chaînesde caractères
Caractères
spéciaux
nonvalides
enBourne
Shell(enbash,
activer
l&#39;option
ext
glob : shopt -s extglob):
Kexpression) Oou1 foisl&#39;expression.
*(expression) 0 à n foisl&#39;expression.
+(expression) 1 à n foisl&#39;expression.
@(expression) 1 foisl&#39;expression.
llexpression) 0 foisl&#39;expression.
?(expression1
|expression2
| ...) Alternatives.
*(expression1
|expression2 l ...)
+(expression1|expression2l...)
@(expression1 |expression2 | ...)
!(expression1
|expression2l ...)

c. Utilisation

Premierexemple
Lescript
menu.sh
affiche
unmenu,
saisitlechoix
del&#39;utilisateur
ettesteàl&#39;aide
d&#39;une
structure case la validité de ce choix :

Snl menu.sh

1 #! /usr/bin/ksh
2 echo "- 1 - Sauvegarde"
3 echo " 2 Restauration "
4 echo "- 3 - Fin"
5 read reponse?"Votrechoix: # Syntaxeksh

6 case "Sreponse"in
7 1) echo "Vousavez choisi la sauvegarde"
8 # Lancementde la sauvegarde
9 ;;
10 2) echo "Vous avez choisi la restauration"
11 # Lancementde la restauration
12 ;;
. Lesbasesde la grogrammatîon
shell
13 3) echo "Fin du traitement"
14 echo "A bientot ..."
15 exit O
16 ;;
17 *) echo "Saisie incorrecte"
18 echo "Bye ..."
19 exit 1
20 ;;
21 esac
S menu.sh
1 - Sauvegarde
- 2 < Restauration
3 Fin
Votre choix: 1
Vousavez choisi la sauvegarde
S menu.sh
1 Sauvegarde
2 Restauration
A 3 Fin
Votre choix: 2
Vous avez choisi la restauration
S menu.sh
1 Sauvegarde
2 - Restauration
- 3 Fin
Votre choix: 3
Fin du traitement
A bientot ...
S menu.sh
- 1 - Sauvegarde
2 Restauration
3 - Fin
Votre choix: 4
Saisie incorrecte

reserved
Bye ...
S

AII
rights
En ligne 17, le caractère* signifieTouteautre chaînede caractères.

É
ENI
- ditions
©
sh, ks bsh
ChaEitre
4
Deuxièmeexemple
Lescript
cadepos.sh
demande
lasaisie
d&#39;un
codepostal
etteste
lavalidité
dece
dernier:

Snl codepos.sh
1 #!/usr/bin/sh

2 echo "Entrez un code postal : \c"


3 read cp
/
ê case &#39;"Scp"
in
5 75[0-9][0-9][0-9] )
6 echo "Sepest un codepostal parisien"
7 :;
8 7[78][0-9][0-9][0 9] I 9[l-5][0 9][0-9][O 9])
9 echo "Scp est un codepostal de la region parisienne"
10 ;;
ll [079][O-9][O-9][0 9][0-9])
12 echo "Sepest un code postal de province (Metropo1e)"
l3 F;
14 *)
l5 echo "Scp n&#39;est
pas un code postal de FranceMetropolitaine"
16 ;;
17 esac
Lescriptcodepos.sh
estcompatible
avecleBourne
Shell.
Troisièmeexemple
Lescripttestnbre.sh
demande
lasaisie
d&#39;un
nombre
ettestela validité
dece
dernier:

Snl testnhre.sh
l #1/usr/bin/ksh
2 echo "Saisir un nombre:\c"
Lesbasesde la Erogrammation
shell

5 ?(+)+([0-9]) )
6 echo "Snombreest un nombreentier positif"
7 ;;
3 -+([0*9J) )
9 echo "Snombreest un nombreentier negatif"
l0 ;;
ll
l2 ?(+)+([0-9])-+([0-91))
13 echo "Snombreest un nombreflottant positif"
14 ::
15 +([0-9])-+([0-9]) )
16 echo "Snombreest un nombreflottant negatif"
17 ;;
18 *)
19 echo "Snombren&#39;est
pas un nombre"
20 exit 1
21 ;;
22
23 esac
24 exit 0
S testnbre.sh
Saisir un nombre:4
4 est un nombreentier positif
S testnbre.sh
Saisir un nombre:+4
+4 est un nombreentier positif
S testnbre.sh
Saisir un nombre:-4
-4 est un nombreentier negatif

AI/
rfghts
reserved
S testnbre.sh
Saisir un nombre:+4.5
+4.5 est un nombreflottant positif
S testnbre.sh
Saisir un nombre:4.5

Editions
EN/
- 4.5 est un nombreflottant positif
S testnbre.sh
Saisir un nombre: 45.689
-45.689 est un nombreflottant negatif
S testnbre.sh
Saisir un nombre:789621
©

sh, ksh, bash


É
789621est un nombreentier positif
S testnbre.sh
Saisir un nombre:7.
7. n&#39;est
pas un nombre
S testnbre.sh
Saisir un nombre:az45
az45 n&#39;est
pas un nombre
S
Lescript
testnbre.sh
utilise
desexpressions
complexes,
il n&#39;est
doncpascompa-
tible avecle BourneShell.

3. Boucle for

Syntaxe
Lastructure
decontrôle
for permetdetraiterunelistedevaleurs
représentée
par
vall va12 va13 valn. À chaquetourde boucle,la variable
var est
initialisée
avec
| une
desvaleurs
delaiiste(lesvaleurs
sonttraitées
dans
l&#39;ordre
de
leurénumération).
Lalistedevaleurs
peutêtrecitéedirectement,
ougénérée
par
substitutionde caractèresspéciauxdu shell.

Liste de valeurscitéesdirectement
for var in vall va12 val3 ... valn
do

commande
done

Listedevaleursgénérée
parsubstitution
devariable
for var in Svariable
do

commande
done
Lesbases
delagrogrammation
shell
Listedevaleursgénéréegarsubstitution
de commande
for var in commande
do

commande
done

Listede valeursgénéréeEarsubstitution
de caractères
de génération
de noms
defichiers
for var in *.c
do

commande
dans

Listegardéfaut: Arguments
de la lignede commande
for var
do

commande
done

reserved
rights
AII à
Éguivalent
for var in 5*
do

-
ENI
Éditions
commande
aogè&#39;
©
Premierexemple
Lalistede valeursduscriptrebours.sh
estcitéedirectement
:
ChapÆe
4
5 done
S rehours.sh

Feu
E!
Deuxièmeexemple
Lescript
testfic.sh
prend
unelistedenoms
defichiers
enargument
etdonne
une
Lesbasesde ia Erorammationshell

S testfic.sh /etc /etc/passwd /dev/console /backup


Liste desarguments recus:
/etc /etc/passwd/dev/console/backup
/etc est un repertoire
/etc/passwdest un fichier ordinaire
/dev/consolen&#39;est
ni fichier ordinaire, ni un repertoire
/backupn&#39;existe
pas

Troisième
exemple
Lescripttraitusenshtraitetouslesutilisateursdéfinisdansle fichierletc/passwd
dont le nom commence par "compta".La liste de valeursest généréeà partir
d&#39;une
substitution
de commande :
S nl traituser.sh
l #! /usr/bin/ksh
2 for user in cut -d":" f1 /etc/passwdI grep " compta
3 do
4 echo"Traitementde l&#39;utilisateur
: Suser"
5 # ...
6 done
S
S traituser.sh
Traitementde l&#39;utilisateur
: comptaOl
Traitementde l&#39;utilisateur
: compta02
Traitementde l&#39;utilisateur
: compta03
Traitementde l&#39;utilisateur
: comptaO4

0 Vous
pouvez
vous
reporter
auchapitre
Lesexpressions
régulières
pour
lasignifi-
cationducaractère" utiliséavecgrep.

reserved
rights
AII
4. Boucle while

a. Syntaxe
while commandel

-
Editians
ENI
do
commande2
© done
Lastructure
decontrôle
whilepermet
deboucler
tantqu&#39;une
commande
retourne
lecode
vrai.A chaque
tourdeboucle,
lacommande
spécifiée
derrière
lemot
whileestexécutée.
Lorsque
ce|le renvoie
ci uncode vrai,leshellexécute
les
commandes
internes
situées
entre
ledoetledone,puis
remonteauwhilepour
exécuter
denouveau
lacommande.Sicette
dernière
renvoie
faux,leshell
sortdu
whileetexécute
lacommande
située
immédiatement
derrière
ledone.
b. Utilisation

Exemple
Lescript
somme.sh
affiche
àl&#39;écran
lasomme
desnombres
saisis
:
S nl somme.sh
l #l /usr/bin/ksh

2 somme=0
3 echo"Saisirunnombre
par ligne, d pourafficherla sommez"
4 while read nombre
5 do
6 # Le test suivant n&#39;est
pas compatible
7 # Bourneshell
8 if [i "Snombre"!= ?([+ ])+([o 9]) 1]
9 then
10 echo "La valeur saisie n&#39;est
pas un nombre"
ll continue
12 fi

13 # Lasyntaxe
suivante
est equivalente
a ((somme=somme+nomb
14 # et a ((somme=Ssomme+Snombre))
15 # EnBourneShell: somme=*expr
Ssomme
+ Snombre
16 ((somme+=nombre))
17 done
18 echo "Somme:Ssomme"
19 exit O
Lacommandereadestexécutée
àchaque
tourdeboucle
(ligne4).Tantquel&#39;u
lisateur
nesaisit
pasd (EOF),
lacommande
renvoie
vrai,cequifaitentrer
dans
le corpsdu while(ligne5).
mwummædmæmmæmu
Programmation
shellsousUnix/Linux
Les basesde la programmationshell

La valeur saisieest testée (ligne 8) : si cette valeur correspondà un nombre,elle


est ajoutée à la valeur actuelle de somme(ligne 16). Dans le cas contraire, la
commandeinterne continue (ligne 11) permet de remonterimmédiatementau
while (ligne4) pourfaire saisir une nouvellevaleur(la commandecontinue est
détaillée,dansce chapitre,sectionLesstructuresde contrôle- breaket continue).
S somme.sh
Saisir un nombrepar ligne, Ad pour afficher la somme:
l
3
a
La valeur saisie n&#39;est
pas un nombre
4
"d
Somme: 8
S

c. Boucleinfinie
Le shell proposela commandeinterne : dont l&#39;intérêt
réside dans le fait qu elle
renvoietoujoursvrai. Placéederrièreun while, elle permetde fabriquerune boucle
infinie.

Exemple
La commande: est interne au shell et renvoietoujoursvrai :
S type :
: is a shell builtin
S:
S echo S?
0

AII
rlghts
reserved
0 Lebash
etlekshproposent
également
lacommande
interne
trueéquivalente
à la commande: dont le mérite est d&#39;avoir
un nom plus explicite. Les pla-
tes formesUnix proposentégalementla commandeexterne/usr/bin/true

Editians
ENI
- (ou /bin/true).

En,ksh,bash
Exemples
Boucle infinie utilisant la commande
:
while :
do
done
Boucleinfinie utilisant la commandetrue :
while true
do

agge
Le
script
menuboucle.sh
CaseUtilisation
reprend
leprogramme
decechapitre.
menu.sh
L&#39;affichage
vudans
etletraitement
lasectio
dumenu
sont
inclus
dans
uneboucle
infinie
(ligne
2),cequipermet
deréafficher
lemenu
après
chaque
traitement
(sauflecasdesortie).

Snl menubouc1e.sh

1 #!/usr/bin/ksh
2 while :
3 do
4 echo "- 1 Sauvegarde"
5 echo "- 2 Restauration "
6 echo " 3 Fin
7
8 read reponse?"Votrechoix: "
9
10 case "Sreponse"in
11 1) echo"Vousavezchoisi la sauvegarde
<Validez>\c"
12 # Lancementde la sauvegarde
13 read x
14 n
15 2) echo"Vous
avezchoisila restauration
<Va1idez>\c"
16 # Lancementde la restauration
Lesbases
dela programmation
shell
24 read x
25 ;;
26 esac
27 done

Pour que l&#39;utilisateur


aitletemps devisualiser
lesaffichages
écran,
lescript
utilise
lacommande readx(lignes 13,17et24):lacommande provoque
une
pause
écranen
variable
attendant
quel&#39;utilisateur
x neserapasexploité.
appuie
surlatouche[Entrée].
Lecontenu
dela

Résultatde l&#39;exécution
:
S menuboucle.sh
l - Sauvegarde
2 Restauration
3 Fin
Votre choix: 1
Vousavez choisi la sauvegarde<validez>
[Entrée]
1 Sauvegarde
2 Restauration
3 Fin
Votre choix: 2
Vousavez choisi la restauration <Validez>
[Entrée]
1 - Sauvegarde
- 2 - Restauration
3 - Fin
Votre choix: 4
Saisie incorrecte <Validez>

AI/
riant;
ruarvod
l- [Entrée]
1 Sauvegarde
- 2 Restauration
3 Fin
votre choix: 3

o
Edltlana
ENI
-
Fin du traitement
A bientot
S

h, ksh,bah
5. until

a. Syntaxe
until commandel
do

commande2
done.
Lastructure
decontrôleuntil permetdeboucler
jusquce
à qu&#39;une
commande
retourne
lecode vrai.Achaque tourdeboucle,
lacommandespécifiéederrière
le
motuntilestexécutée.
Lorsquecelle-ci
renvoie
uncodefaux,lesheilexécute
les
commandes
internes
situées
entrele do et le done,puisremonte
auuntil pour
exécuter
denouveau
lacommande.
Dès
quecette
dernière
renvoie
vrai,lesheil
sortduuntil etexécute
lacommande
situee
immédiatement
derrière
ledone.
b. Utilisation

Exemple
Lescript
attend.sh
boucle
jusqu&#39;à
cequelefichier
dont
lenomestcontenu
dans
s2arrive
dans
lerépertoire
représenté
pars1: Lefichier
s2arrivera
parle
réseau.

Snl attend.sh

1 #!/bin/bash
2 # Verification du nombred&#39;arguments
3 if [Ï 5# -ne 2 ]]
4 then
5 echo "Usage: S0 repertoire fichier"
6 exit 1
7 fi
8 # Le 2emeargumentdoit être un repertoire
9 if [[ 1 -d S1 ]]
10 then
11 echo "S1 n&#39;est
pas un repertoire"
12 exit 2
13 fi
Les basesde la programmationshell

16 [l -e 51/521]

17

18

l9until
do
sleep 2
done

20

AI/
rights
reserved
21

ENI
Editions
22 # Le fichier est arrive
date=S(date &#39;+%Y%m%d_%H%M&#39;)
mv S1/S2SHOME/S2.Sdate

© 23
Chapitre4
Résultatde l&#39;exécution
:
Le fichier ltmplresuJogn&#39;existe
pas encore:
S ls -1 /tmp/zesu.log
/tmp/resu.log: No such file or directory
Le script est exécuteen arrière plan:
S attend.sh /tmp resu.1og G
[1] 4481
Créationmanuelledu fichier attendu:
S > /tmp/resu.log
Messagegénérépar la ligne26 :
attend.sh : Vousavez recu du courrier
Lecturede la boîtemail :
S mail
Message1:
Fromchristie Sat Apr 23 13:05:21 2011
T0: christie
Date: Sat, 23 Apr 201113:05:21 +0200 (CEST)
Le fichier /home/christie/resu.log.20llO423_1305est arrive.
&

Variantedu script attend.sh


L&#39;utilisateur
aimeraits&#39;assurer
qu&#39;au
momentoù le nomdu fichier attenduapparaît
dansl&#39;arborescence,
celui-ciest présentsur le disquedansson intégralité(transfert
de fichierterminé).
L&#39;exemple
suivant proposeune variantedu script attend.shqui va tester la pré-
senced&#39;un
fichier témoin. L&#39;expéditeur
envoiele fichier de donnéesen premier,et
seulementensuitele fichiertémoin,ce qui signi epour la machineréceptriceque
si le fichier témoin est sur le disque, alors le fichier de donnéesa déjà été
intégralement transféré.

Programmation
shellsousUnix/Linu
Lesbases
delaErogrammation
shell
Bæmple
5nlattend2.sh

1 #!/bin/bash
2 # Verification du nombre
d&#39;arguments
3 # Il faut au moins2 arguments
4 if[[S# -1e2]]
5 then
6 echo"Usage fichier [ temoin
: S0repertoire ] "
7 exit l
8 fi
9 doit être un repertoire
# Le 2emeargument
10 if [[ ! d S1 L
11 then
12 echo"S1n&#39;est
pasun repertoire
13 exit 2
14 fi
15 # Nomdu fichier temoinpar defaut : "temoin"
16 ficTemoin=S(3: temoin)
17 # Lesarguments
sontcorrects
18 #Jusqu&#39;a
cequelefichier
L
temoin
19 until [[ e S1/SficTemoin
existe, dort2 secondes
lescript
20 do
21 sleep2
22 done

23 #Sile fichier
temoin
estarrive,
24 # Parsecurite, on verifie
le fichier
dedonnees
estarrive
25 if [[ ! e S1/S2I] ; then
26 echo
est absent" "Lefichier
SficTemoin
estarrive
mais
&#39;le fichier
dedonnees
27 exit 1

AI/
rights
reserved
28 fi
29 # Traitementdufichier dedonnees
30 date=S(date&#39;+%Y%m%d_%H%M&#39;)
31 mvS1/S2SHOME/S2.Sdate

-
Editions
ENI 32 mail SLOGNAM <<FIN
33 Le fichier SHOME/S2.Sdate
34 FIN
est arrive.

35 echo"S0: vous avezrecudu courrier"


36 exit O
©
Eæ tzs.
Commentaire:
Ligne4 : le script attend au minimum2 arguments: le nom du fichier témoin
est facultatif car un nom par défaut est prévu (le fichier par défaut se nomme
"temoin").
Ligne 16 : la variable ficTemoin est initialiséeavec "S3" si la variablen&#39;est
pas vide, avec le nom de fichier "temoin"sinon.
Ligne 19 : contrairementà la version précédente,le script boucletant que le
fichier témoinest absent.
Ligne25 : dès que le fichier témoin est présent,cela signifieque le fichier de
donnéesest présentlui aussi,dansson intégralité.Unevérificationde l&#39;existence
du fichier de donnéesest quand même effectuée.La suite du traitement est
identique.

6. break et continue

Les commandesinternesbreak et continue peuvents&#39;utiliser


à l&#39;intérieur
des
bouclesfor, while, until et select (cf. chapitreAspectsavancésde la pro-
grammationshell Gestionde menusavecsélect).
La commandebreak permet de sortir d&#39;une
boucle, tandis que la commande
continue permetde remonterà la conditiond&#39;une
boucle.

Syntaxe
Quitterla bouclede premierniveau:
break
Quitterla bouclede niveaun :
break n
Remonterà la conditionde la bouclede premierniveau:
continue
Remonterà la conditionde la bouclede niveaun :
continue n

Programmation shell sous Unix/Linux


W,,,________.____.__._-.------Illllllllll

Lesbases
dela Erogrammation
shell
Exemg/e
Lescript
somme2.sh
estunevariante
duscript
somme2.sh.
Cette
version
utilise
unebouc/e
infinie
etaffiche
lemessage
d&#39;invite
àchaquetourdebouc/e
:
Snlsomme2.sh
l #1/usr/bin/ksh
2 somme=0
3 # Boucle infinie
4 while crue
5 do
6 echo "Entrez un nombre: \c"
7 # Saisie d&#39;un
nombre
8 if read nombre
9 then
10 # Si la saisieest incorrecte,onremonte
a la boucle
11 if [Î "Snombre"
!= ?([+ ])+([O 9]) ]
12 then
13 echo"La valeur saisie n&#39;est
pasun nombre"
14 continue
15 fi

16 # La saisie est correcte, on fait la somme


17 (( somme=Ssomme + Snombre))
18 else
19 # L&#39;utilisateur
a saisi dz Sortie de la boucle
20 break
21 fi
22 done
23 # Affichage du resultat
24 echo "\nLa somme est : Ssomme\c"

AII
rlghts
raserved
25 exit 0

Lescriptsomme2.sh
utilise
uneboucleinfinie
(ligne
4).Àchaquetour
deboucle,
unmessage
d&#39;invite
estaffiché
(ligne
6) et la saisie
d&#39;un
nombre
estdemandée
(ligne
8).Silacommandereadrenvoievrai(l&#39;utilisateur
asaisi
autre
chose
que
EdIt/ans
EN/
- "d) : lavaleur
nombre
déclencher
saisie
entier,
unenouvelle
estvérifiée
onremonte
saisie.
(ligne
11).Sicelle-ci
immédiatement
àlaligne
Sil&#39;utilisateur
effectuée(ligne 17).
a saisi
necorrespond
4 (grâce
unnombre,
lasomme
pasà un
àlaligne
est
14)pour

©
Chagitre4
Si read renvoiefaux (l&#39;utilisateur
a saisi"d), la commandebreak (ligne20) est
exécutéeet le flux d&#39;exécution
se poursuiten ligne 24.
S some2.sh
Entrez un nombre: 4
Entrez un nombre: a*
La valeur saisie n&#39;est
pas un nombre
Entrez un nombre: 3
Entrez un nombre: Entrée
La valeur saisie n&#39;est
pas un nombre
Entrez un nombre: Ad
La somme est : 7

Prgmation sheious nix/inx


Û Chapitre
5 : Aspects
avancés

B
C
D.
3l ?!-
E de la programmation shell
. Comparatif des variables 5* et S@ . . . . . . . . . . 200

. Substitution de variables . . . . . . . . . . . . . . . 203

Tableaux . . . . . . . . . . . . . . . . . . . . . 206
F
Initialisation des paramètres positionnelsavec set . . . . 209
A. Comparatif des variables 5* et S@
1. Utilisation de 5* et de S@

Ce chapitre présented&#39;autres
fonctionnalitésutiliséesen programmationshell qui
viennent complétercelles abordéesau chapitre Les bases de la programmation
shell.
Les variables3* et S@ contiennentla liste des argumentsd&#39;un
script shell. Lors-
qu&#39;elles
ne sont pas entouréespar des guillemets,ellessont équivalentes.

Exemple
Le script test_var1.shaffiche la valeur de chaqueargumentde la ligne de com-
mande:

Snl test_var1.sh

l #1/usr/bin/ksh
2 compteur=l ;
3 for arg in 5* # Equivalent à S@
4 do
5 echo "ArgumentScompteur: Sarg"
6 ((compteur+=l))
7 done
S
Voici un exempled&#39;appel
du script .-
S test_yar1.sh a b c "d e f" q
Premièreétape : le shell courant traite les caractèresde protectionavant de lan-
cer le script.À ce niveau,les espaces
internesà "d e f" sontprotégés
et ne
sont pas vus comme séparateurs de mots, mais comme des caractères
quelconques.
Aspects
avancés
dela programmation
shell
Deuxièmeétape: le shell enfant qui interprètele script substitue5* (ou 5C7)
par
a b c d e f g.
for arg in S@
ou
for arg in 3*
41v
for arg in a b c d e f g
Lesespacesqui étaientprotégésau niveaudu shell de travailne le sontplus au
niveaudu shell enfant. Voicile résultatde l&#39;exécution
du script :
S test_var1.:h a b c "d e f" g
Argument1 : a
Argument2 : b
Argument3 : c
Argument4 : d
Argument5 : e
Argument6 : f
Argument7 : g

2. Utilisation de "S*"

Les guillemetsretirent la significationspécialedes éventuelsespacescontenus


dans3*.

Exemple
Dansle script test_var2.sh,la variable5* est placéeentreguillemets.

Snl test_var2.sh

All
rlnht:
morvnd 2
1 #!/usr/bin/ksh
compteur=li

ENI
Edlrlons
-
3 for arg in "S*
4 do
5 echo "ArgumentScompteurz Sarg"
6 ((compteur+=1))
7 done
o
Voiciun exempled appeldu script :
S test_var1.sh a b c "d e f" g
Première
étape: leshellcourant
traitelescaractères
deprotection
avant-
delan-
cerle script.A ceniveaules espaces
internesà "d e f" sontprotégés
et ne
sont pas vus commeséparateursde mots, mais commedes caractères

quelconques.

Deuxième
étape:leshell enfant
quiinterprètelescriptsubstitue
"s*"
par
c d e f j . Lesguillemetsentourant5* protègenttouslesespaces
"ab
internes.
Ceux-cisont donc vuscommedescaractèresordinaires:
for arq in "s*"

for arq in a b c d e f g"
Pourle shellenfant,il y a un seulargument.Voicile résultatde l&#39;exécution
du
script : &#39;
S test_var2.sh a b c "d e f" g
Argument1 : a b c d e f g
S

3. Utilisation de "S@"
Placerla variableSS@
entreguiilemets
permetdeconserver
la protection
miseen
placeauniveaudushelldetravail.

Exemple

Dans
lescript
test_var3.sh,
lavariable
3@est
placée
entre
guillemets
Snl test_var3.sh

l #1/usr/bin/ksh
Aspects
avancés
dela programmation
shell
Première
étape: le shellcouranttraitelescaractères
deprotectionavantdelan-
cer le script. A ce niveau,les espacesinternesà "d e f" sont protégéset ne
sont pas vus comme séparateurs de mots, mais comme des caractères
quelconques.
Deuxièmeétape: le shell enfant qui interprètele script substitue "S1?" par a b
c "d e f" g. La protectiondes espacesinternesà d e f est conservéepar
le shell enfant.
for arg in "SG"
4}
for arg in a b c "d e f" g
Pour le shell enfant, il y a cinq arguments.Voici le résultat de l&#39;exécution
du
script:
S test_var3.sh a b c "d e f" g
Argumentl : a
Argument2 : b
Argument3 : c
Argument4 : d e f
Argument5 : g

B. Substitution de variables

ksh bash

Lasubstitutionde variablesa été abordéeau chapitreLesbasesde la programma»


tion shell - Lesvariablesutilisateur.Cettesectionprésentede nouvellesfonctionna-

All
r/nhla
mamd
litésdisponiblesau niveaudesshellsbashet ksh.

1. Longueurde la valeur contenuedans une variable

Edltlona
EN/
- Syntaxe
5l ltvariable}

sh, ksh, bash


Exemple
5 var="machaine"
S echo 5(#var)
9
S

2. Manipulation de chaînes de caractères

Les fonctionnalités présentéesci-dessous permettent de manipuler la valeur


contenuedansune variable.

a. Retirerle plus petit fragmentà gauche

Syntaxe
S(variable#modele}
où modele est une chaînede caractèrespouvantinclureles caractèresspéciaux*,
?, [], Nexpresssion),+(expression),*(expression),@(expression),
Kexpression)
(cf.
chapitreMécanismesessentielsdu shell - Substitutionde nomsde fichiers).
Le caractère# signifie"Chaînela plus courtepossibleen partantde la gauche".

Exemple
Afficher la variableligne sansson premier champ:
S ligne="champ1:champ2:champ3"
S echo S{ligne#*:}
champ2:champ3

b. Retirerle plus grandfragmentà gauche

Syntaxe

S{variable##modèlel
Asgects
avancés
dela grogrammation
shell
Les caractères## signifient "Chaînela plus longue possibleen partant de la
gauche".
Exemple
Afficher le dernierchampde la variableligne :
S ligne="champ1:champ2:champ3"
S echo s{1igne##*:}
champ3

c. Retirerle pluspetit fragmentà droite

Syntaxe
S{variab1e%modèle}
Lecaractère%signifie"Chaînela plus courtepossibleen partantde la droite".

Exemple
Afficherla variableligne sanssondernierchamp.-

S 1igne="champ1:champ2:champ3"
S echo 5{1igne%:*)
champlzchampz

d. Retirerle plusgrandfragmentà droite

Syntaxe
S{variable%%modèle}

rlnhts
marvad
Les caractères%%signifient "Chaînela plus longue possibleen partant de la
droite".

Exemle

EdIt/onn
ENI
-
AII
Afficher le premierchampde la variableligne :
S 1igne="cham1:champ2:champ3"
S echo S{ligne%%:*}
e champl

sh,ksh,bash
932935 ,

0 En
bash,
nepas
oublier
d&#39;activer
l&#39;option
extglob
avec
lacommande
shopt
-s extglob pourquele shellinterprète
lesmodèles
utilisantlesexpressions
complexes.

C. Tableaux

ksh bash
Lesshellsrécents
permettent
detravailler
avecdestableaux
à unedimension.
Les
éléments
d&#39;un
tableausontindicésà partirde O.

1. Assigner un élément

Syntaxe
nomtableau
[indice] =valeur

Exemple
S tab[0]=10
S tab[2]=12
Unecasede tableaunon initialiséeest vide.

2. Référencer un élément

Syntaxe
S{nomtableau[indice]}

Exemple
Affichagede l&#39;élément
d&#39;indice
O .-
S echo S(tab[0])
10

Programmati
ell sousUnix/
Asgects
avancés
dela Erogrammation
shell
Affichagede l&#39;élément
d&#39;indice
2:
S echo S(tab[2])
12
Affichagede l&#39;élément
d&#39;indice
1. La casen&#39;ayant
jamais été initialisée, l&#39;expres-
sion est substituéepar du vide :
S echo S{tab[1]}

0 Lesaccolades
sontobligatoires.
3. Assignementglobal d&#39;un
tableau
bash

Syntaxe
nomtableau=(val1val2 ... valn)

Exemple

stab=(10
11121312)
ksh

r/ghts
A/I
reserved
Syntaxe
set -A nomtableauvall val2 ... valn

Exemle

Edlllons
ENI
-
s set A tab 1o 11 12 13 12

0 Cesdeuxsyntaxes
réinitialisent
complètement
letableau
si celui-cicontenait
déjàdesvaleurs.
II&#39;I"_&#39; _ _ __ A A /A)!

SÆE

4. Référencer
tousleséléments
d&#39;un
tableau

Syntaxe
S{nomtableau[*]}

Exemple
5 echoSltab[*]}
10 11 12 13 12
S

5. Obtenirle nombre
d&#39;éléments
d&#39;un
tableau

Syntaxe
5{#nomtableau[*])
Exemple
S echoS(#tab[*])
5
s

6. Obtenir
lalongueur
d&#39;un
élément
d&#39;un
tableau

Syntaxe
S(#nomtableau[indice])

Exemple
Affichagede l&#39;élément O:
d&#39;indice
S echos{tab[O]}
10

Affichage
dunombre del&#39;élément
decaractères O:
d&#39;indice
5 echo5(#tab[0]}
Aspects
avancés
de la programmation
shell

D. Initialisation des paramètres


positionnelsavecset
La commandeset appeléesans option mais suivie d&#39;arguments affecteces der-
niersaux paramètrespositionnels(331,S2, ..., 5*, 3S@,S#). Celapermetde mani-
pulerfacilementle résultatde substitutionsdiverses.

Exemple
Exécutionde la commandedate :
S date
TueMar 18 23:57:43 MET2003
Le résultat de la commandedate est affecté aux paramètrespositionnels:
S set date
S echo S1
Tue
S echo S2
Mar
S echo S4
23:57:53
S echo 5*
TueMar 18 23:57:53 MET2003
S echo Sil
6
S

AII
rlghts
rasarvod
E. Les fonctions
Lesfonctionsserventà regrouperdes commandesqui ont besoind&#39;être
exécutéesà
plusieursreprisespendantle déroulementd&#39;un
script.

Edltlnns
ENI
- 1. Définition d&#39;une
fonction

La définitiond&#39;une
fonctiondoit êtrefaite avantson premierappel.

sh, h, bash
Chapitre5
Premièresyntaxe
Les parenthèses
indiquentau shell que mafonction est unefonction.
Définitionde la fonction :
mafonction() {
commande 1
commande 2
l
Appelde la fonction :
mafonction

Deuxièmesyntaxe

ksh bash

Le mot clé function remplace les parenthèsesutilisées dans la première

syntaxe.
Définition
de
lafonction
:
function mafonction {
commandel

commandez
l
Appelde la fonction :
mafonction
Dans un script contenantdes fonctions, les commandessituées en dehors des
corpsde fonctionsont exécutéesséquentiellement.
Pourque les commandeslocaliséesdans une fonctionsoientexécutées,il faut faire
un appel de fonction. Une fonction peut être appeléeaussi bien à partir du pro-
grammeprincipalqu àpartir d&#39;une
autrefonction.
Aspects
avancés
dela programmation
shell
Exemples
Utilisationde la premièresyntaxe:

Snl fonc2.sh

l f1()i # Definition de la fonction


echo "Dansf1"

xlmRùLdN
}
echo "lere commande"
echo Zemecommande"
fl # Appelde la fonction
echo "3emecommande"
S fonc2.sh
1ere commande
2emecommande
Dansf1
3emecommande
S
Utilisationde la deuxièmesyntaxe:
S nl fonc3.sh
1 function fl ( # Definition de la fonction
2 echo Dansf1"
3 }
echo "lere commande"

4m01»
echo "Zemecommande"
fl # Appelde la fonction

Ail
rights
reserved
echo "3emecommande"

0 Dèsqu&#39;une
fonction
estdéfinie,
elleestconsidérée
parleshellcomme
une
commandeinterne.La syntaxeutiliséepour appelerune fonctionou exécuter

Editions
ENI
unecommandeUnixest rigoureusement identique.

2. Code de retour d&#39;une


fonction

Commetoute commandeUnix, unefonctionretourneun coded&#39;erreur.


Pardéfaut,
© la valeurretournéecorrespondau codede la dernièrecommandeexécutéedansla
fonction. La commandereturn permetà une fonctionde se termineren retour-
nantéventuellement un coded&#39;erreur
explicite.
Chapitre5

Ü return permet
à unefonction
deretourner
unevaleur
numérique
entière
com-
prise entre O et 255. Il ne faut pas utiliser return pour retournerune valeur
qui ne jouerait pas le rôle de code d&#39;erreur
(par exemple,il ne faut pas retour-
ner le résultatd&#39;un
calcul).

Le coded&#39;erreur
retournépar la fonctionest contenudans la variable5?.

Exemple
Le script exist_user.shdemandela saisie du nom d&#39;un
utilisateur et teste si ce
dernierest défini ou non sur le système:

Snl exist_user.sh
1 #! /usr/bin/ksh

2 # Faire une pauseecran


3 function
pause
I
4 echo "Appuyezsur une touche pour continuer"
5 read x
6 l
7 # Savoir si un utilisateur est defini sur le Systeme
8 function exist_user {
9 echo "Saisir le nomd&#39;un
utilisateur : \c"
10 read user
11 if grep -q "Asuserz" /etc/passwd ; then
12 return 0
13 fi
14 return 1
15 }
16 # Programmeprincipal
17 while true
18 do
19 clear
20 echo " 1 Savoir si un utilisateur est defini"
21 echo "- 2 Connaitre 1&#39;uid
d&#39;un
utilisateur"
22 echo "- 3 Fin"
23
24 echo "Votre choix : \c"
Aspects
avancés
de la programmation
shell
28
29 1) # Appelde la fonction
30 # Test du code de retour de la fonction (S?)
31 if exist_pser
32 then
33 echo "L&#39;utilisateur
Suser est defini"
34 else
35 echo "L&#39;utilisateur
Suser n&#39;est
pas defini"
36 fi
37 pause # Appelde la fonction pause
38 iî
39 2)
40 echo "Choix non implemente";;
41
42 3) exit O ii
43
44 esac
45 done
Le script exist_user.shcontientdeuxdéfinitionsde fonction :
- La fonction pause (ligne 3) permet de faire une pause écran (grâce à la
commanderead). Elle est appeléeen ligne 37 pour que l&#39;utilisateur du script
puissevisualiserles messagesécranavant que la commandeclear (ligne 19)
ne soit appelée.Le code de retourde cette fonction (qui a pour valeur le code
de la commanderead x) n&#39;est pas exploité.
- La fonctionexist_user(ligne 8) fait saisir le nom d&#39;un
utilisateuret teste à l&#39;aide
de la commandegrep (ligne 1l) si ce dernier est défini dans le fichier
/etc/passwd.Si grep retournevrai, la fonctionse termineet retourneà son tour
un codevrai (ligne 12). Dansle cas contraire,elle se termine en retournantun
codefaux (ligne 14).

AII
resen/ed
Ilghts
L&#39;appel
de la fonctionexist_userest considérécommeune commandeUnix et peut
donc être placé derrière un if (ligne 31). En fonction de la valeur qui sera
retounéepar la fonction (0 ou 1), la structurede contrôleva orienterle flux d&#39;exé-
cution en ligne33 si le codeest vrai, en ligne35 s&#39;il
est faux.
Le shell exécuteraensuitela fonction pause. Le code de retour de cette dernière

ENI
EdIt/ons
n&#39;est
pas exploité.

s, ksh,bash
3. Portée des variables

Lesvariablesutilisateursont globales.Dansle script exist_user.sh,la variableuser


est initialiséedans la fonction (ligne 10) et réutiliséedans le programmeprincipal
(lignes 33 et 35). Chaqueréférenceau nom de variable user fait référenceau
mêmeespacemémoire(cf. Figure1).
â cal: exisi:_user.
5h
functionexist_user
{
read usa-
if grep"Asusen"letdpasswd j then
>fdev/null
}
# Pro
gramme
principal
exist_user
then
echo"Ijutilisateur
suserestde ni"
else
echo"L&#39;utilisateur
susern&#39;est
pasdefini"
fi

Variables
globales

Figure1 : Les variablesutilisateursont globalespar défaut.

4. Définition de variables locales

ksh bash

La commandetypeset permetde définir des variableslocalesà une fonction.

Syntaxe
typeset variable
typeset variable=valeur

Programmation shell sous Unix/Linux


Asgects
avancés
delaprogrammation
shell
; Exemple
La fonctionf1 du scriptIocales.sh
définitunevariablelocale.-
l S nl loca1es.sh
1 #! /usr/bin/ksh
2 function f1 {
3
4 typesetvar1
5 echo"DansE1 =>
6 var1=100
7 echo"Dansf1 =>
varl
8 echo"Dansf1 =>
9 var2=200 varl
10 echo"Dansfl =>
11 } var2
12 var2
13 va:1=1
14 var2=2
15 avant

apres
# var1 est unevariable locale
16echo"Dans avant
17 f1
18 echo"Dansprogramm
e Svarl"
19 echo"Dansprogramm apres
Svarl"
S loca1es.sh 6 pri

rumnd
rlnhlc
AII
Dansprogramme principal => Svar2
Dansprogramme principal :>
Dansf1 => varl avant :
Dansfl => var1 apres : 100 pri Svar2"
Dansf1 => var2 avant 2

-
ENI
EdIt/on:
Dansf1 => var2et
# var1 apres
var2: sont
200 2 variables globales
Dansprogramme principal => varl ncipal
Dansprogramme principal => var2ncipal
S echo"Dansprogramme principal
programme principal - avant
c! avant
var1
var1avant var2 avant
çmlgmaitre
5
La fonctionf1 définit une variablelocalevarl (ligne4). Toutemodificationde var1
dansf1 n&#39;affectera
en aucuncas la variableglobalede mêmenom (la variableglo-
bale varl est inaccessibledans la fonction), ce qui ne sera pas le cas pour la
variableglobalevar2 dont le contenuest modifiédans la fonction.

5. Passage d&#39;arguments
Le shellproposeun mécanisme
qui permetd&#39;envoyer
desvaleursà unefonction.
Lesvaleurs
reçues
parla fonction
vontêtreaffectées
automatiquement
à des
variablesspécialesdu shell localesà la fonction.
Cesvariables
localesse nomment
S1, S2, ..., S9, silo) 5*, R@
S#. La variables0 contienten permanence
le nom du script.

Exemple
Lescriptparam.sh
contienttroisfonctionsqui affichentchacuneleursarguments
reçus :

Snl param.sh
l #! /usr/bin/ksh
Eunction E1 (
echo "Argumentsde la fonction fl : u

r-J
echo "\SO => S0"
echo "\S1 => S1"
echo "\S2 => S2"
echo "\S3 => S3"
echo "\S* => 5*"
echo "\S# => S#"
l
Aspects
avancés
de la programmation
shell
20 function f3 (
21 echo Argumentsde la fonction f3 z"
22 echo "\S0 => S0"
23 echo "\S1 => S1"
24 echo "\S2 => S2"
25 echo "\53 => S3"
26 echo "\S* => 5*"
27 echo "\S# => 5#"
28 )
29 echo "Parametresdu programme
principal: "
30 echo "\S0 => S0"
31 echo "\S1 => 51"
32 echo \S2 => S2"
33 echo "\S3 => S3"
34 echo "\S* => 3*"
35 echo "\S# => S#"
36 fl 1 2 3
37 f2 100 200 fic.c
38 f3 S2 S3
Appeldu script param.sh:
5 param.shE1 f2 f3 fl f5
Parametresdu programme principal:
S0 => param.sh
S1 => fl
S2 => f2
S3 => f3
5* => f1 f2 f3 f4 f5
S# => 5
Argumentsde la fonction f1

AII
rlnmu
morvod
S0 => param.sh
S1 => 1
S2 => 2
S3 => 3
s*=>123

EN)
Edltlona
-
S# => 3
Argumentsde la fonction f2
S0 => param.sh
S1 => 100
S2 => 200
S3 => fic.c
«a

sh,ksh,bash
5* => 100 200 fic.c
Sil =>3
Argumentsde la fonction f3 :
S0 => param.sh
S1 :> f2
S2 => f3
S3 =>
5* :> 52 f3
S# => 2
Le script param.shreçoitcinq arguments(f1, f2, f3, f4 et f5). Cesargumentssont
accessiblesdans le programmeprincipal(lignes29 à 38) au traversdes variables
5l, S2, S3, S4, S5, 5*, S@, Sil.
La fonctionf1 est appelée(ligne 36) avec les valeurs1, 2 et 3. Dansle corpsde
la fonction(lignes3 à 9), celles-cisont accessiblesdans les variableslocaless1,
S2, S3, 5*, S@, Sil. Lesargumentsdu programmeprincipalsont donc inac-
cessiblespendantl&#39;exécution
de la fonction.
La fonctionf2 est appelée(ligne 37) avec les valeurs100, 200 et fic.c. Dans le
corpsde la fonction (lignes12 à 18), celles-cisont accessiblesdans les variables
localess1, s2, S3, 5*, S@, Sil. Les argumentsdu programmeprincipal
sont donc inaccessibles pendantl&#39;exécution
de la fonction.
La fonction f3 montre comment une fonction peut travailler sur les arguments
reçus dans le programmeprincipal. La fonction est appelée(ligne 38) avec les
valeurss2 et s3, c&#39;est
à dire f2 et f3. Dans le corps de la fonction (lignes21 à
27), les valeursreçuessont accessiblesdans les variableslocalesS1, s2, 5*,
5G, Sil. Les deuxièmeet troisièmeargumentsdu programmeprincipalsont donc
envoyésen paramètreà la fonction f3, qui les récupèreen tant que premieret
deuxièmeargument.

6. Exploiter l&#39;affichage
d&#39;une
fonction

Un appel de fonction peut, au même titre que n&#39;importe


quelle commande,être
placéà l&#39;intérieur
de caractèresde substitutionde commande( ou 350).

rogrammation
shellsousUnix/Linux
avancés
Asgects dela grogrammation
shell
« em le
prendenargument
Lescriptget_uid.sh unnomd&#39;utilisateur
et recherche
sonuid .-

Snlget_uid.sh
1 #!/usr/bin/ksh
2 functionget_uid
3 l
4 grep ""S1:" /etc/passwdI cut d&#39;:&#39;
-f3
5 l

6 # ------------------------------ --
7 # Definition de variables globales
8 # --
9 UID-"" # UID d&#39;un
utilisateur
1o lt -
ll # Programme
principal
12 # -
13 # La fonctionaffiche un UID ouvide
14 get_uidS1
15 # La vâriable UID est initialisee avecle resultat (=affichage)
16 # de la fonction (=commande) get_uid
17 UID=S(get_uid S1)
18 if [Î SUID!= "" ]] ; then
19 S1 a pouruid : SUID"
echo"L&#39;utilisateur
20 else
21 S1 n&#39;existe
echo"L&#39;utilisateur pas"
22 fi
S get_uid.sh
Z025
christie a pouruid : 2025
L&#39;utilisateur
S
La ligne14 montreque la fonctionget_uidaffiche|&#39;uid
de l&#39;utilisateur
dontelle
reçoitle nomen argument(elle n&#39;affiche
riensi l&#39;utilisateur pas). Cette
n&#39;existe
lignea été placéepourlesbesoins
de la démonstration,
dansun casréel,elleest
inutile.
Chapitre5
En ligne 17, la fonctionest de nouveauappelée.Grâceau mécanismede substitu-
tion de commandes,le shell remplacecet appel par la valeuraffichéepar la fonc-
tion. Cettevaleurest ensuiteaffectéedansla variableglobaleUlD.

7. Programme complet de l&#39;exemple

Voici le script gestusenshqui regroupeles fonctionspause,exist_useret get_uid :

Snl gestuser.sh

1 #3/usr/bin/ksh
# Faire une pauseecran

mwSww
function pause {
echo "Appuyezsur une touche pour continuer"
read x
l
7 # Savoir si un utilisateur est defini sur le systeme
8 function exist_user {
9 grep -qi "*s1:" /etc/passwd &&return O
10 return 1
11 }
12 # Trouver l&#39;uid
d&#39;un
utilisateur
13 function get_uid
14 (
15 grep -i "*S1:" /etc/passwd | cut -d&#39;:&#39;
f3
16 l
17 4+ --
18 # Programme
principal
19 1; --

20 Uid=""
21 User=""
22 Choix= "
23 while true
24 do
25 clear
26 echo "- 1 Savoir si un utilisateur est defini"
27 echo "- 2 - Connaitre l&#39;uid
d&#39;un
utilisateur"
28 echo "- 3 - Fin"
Asgects
avancés
delaErogrammation
shell
29
30 echo "Votre choix : \c"
31 read Choix
32
33 if [I SChoix= @(lI2) ]] ; then
34 echo"Saisirle nom
d&#39;un
utilisateur : \c"
35 read User
36 fi
37 case Schoix in
38
39 l) # Appel de la fonction
40 #Testducode
deretour
dela fonction(S?
41 if exist_user süser ; then
42
43 else
echo"L&#39;utilisateur
SUser
est defini"
44
45 fi
echo"L&#39;utilisateur
SUsern&#39;est
pasdefini"
46 I;
47 2)
48 if exist_user Süser ; then
49 Uid=S(get_uid
Süser)
50
51
echo"L&#39;UID
else
del&#39;utilisateur
SUser
est: SUid"
52
53
&#39;
fi
echo"L&#39;utilisateur
SUsern&#39;est
pas defini"
54 ;;
55 3) exit O ;;
56
57 esac
58 pause
59 done
# Appeldela fonctionpause
S

AII
rlnhn
riurvad
0
Ed/tlanc
EN/
-
sh, ksh, bash
Chapitre5

F. Commandes d&#39;af chage

1. La commande print

ksh

Cettecommandeapportedes fonctionnalitésqui n&#39;existent


pas avececho.

a. Utilisationsimple

Exemple
S print Imprimanteen panne
Imprimanteen panne
S
h. Suppressiondu saut de ligne naturel de print
ll faut utiliser l&#39;option
n.

Exemple
S print -n Imrimante en panne
Imprimanteen pannes
c. Afficher des argumentscommençantpar le caractère"-"

Exemple
Dansl&#39;exemple
ci-après,la chaînede caractèresi fait partiedu message.
Mal-
heureusement,print interprète i commeune option, et non commeun argu-
ment.
S print -i : Option invalide
ksh: print: bad option(s)
S print "-i : Option invalide"
ksh: print: bad option(s)

0 Il nesertà riendemettre
desprotections
autour
desarguments
deprint. En
effet," " n&#39;est
pasun caractère
spécialdu shell,il nesertdoncà riende le pro-
téger.Il n&#39;est
pasinterprété
parle shell,maisparla commande print.

Programmaion
shellsos Unix/Linux
Aspects
avancés
dela programmation
shell
Avecl&#39;option
dela commande
print, lescaractères
quisuivent
seront,
quelle
que soit leur valeur,interprétéscommedes arguments.
Exemple
S print - i : Option invalide"
-i : Option invalide
S

d. Écrire
surundescripteur
particulier
L&#39;option
u permetd&#39;envoyer
un message
surun descripteur
particulier.
print udesc message
où desc représentele descripteurde fichier.

Exemple
Envoyer
un message
surla sortied&#39;erreur
standardavecprint :
S print u2 "Messaged&#39;erreur"

Envoyer
un message
surla sortied&#39;erreur
standardavececho:
5 echo "Messaged&#39;erreur"
1>&2
Comparaison
des deuxcommandes:
- L&#39;option
u2 dela commande
print lui indique
qu&#39;il
fautenvoyer
le message
sur la sortied&#39;erreur
standard.
- Lacommande echoécrittoujours
sursondescripteur
1. ll faudra
doncquela
sortie
standard
aitétéredirigée
verslasortied&#39;erreur
standard (1>&2)avantque
la commandeecho ne s&#39;exécute.

A/I
rlahtn
rlnmd
2. La commandeprintf

bash

Edltlonn
ENI
- Cette
commande
reprend
lafonction
ter lesaffichages.
printf dulangage
En tant quecommande
C.Ellepermet
deforma-
interne,elle n&#39;est
touslesshells,parcontre,ellepeutexistersousformeexterne
pasdisponible dans
(/usr/bin/printf).
4D printf chaine exprl expr2 ... exprn

sh,ksh, bash
chaine représentela chaînequi seraaffichéeà l&#39;écran.
Elle peut contenirdes for-
mats qui serontsubstituéspar la valeur des expressionscitéesà sa suite. ll doit y
avoirautantde formatsque d&#39;expressions.

l-Zxemples
deformatscouramment
utilisés
%20s Affichaged&#39;une
chaîne(string)sur 20 positions(cadrageà droite
par défaut).
%-20s Affichaged&#39;une
chaîne(string)sur 20 positionsaveccadrageà
gauche. A
%3d Affichage
d&#39;un
entier
(décimal)
sur3 positions
(cadrage
à droite).
%O3d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà droite)
complétépar des O à gauche.
%-3d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà gauche).
%+3d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà droite)
avecaffichagesystématiquedu signe(un nombrenégatifest tou-
jours affichéavecson signe).
%10.2f Affichaged&#39;un
nombreflottant sur l0 positionsdont 2 décimales.
%+010.2f Affichaged&#39;un
nombreflottant sur l0 positionsdont 2 décimales
complétépar des zérosà gauche,cadrageà droite, affichagesysté«
matiquedu signe.

Exemple
S article="Fournitures" ; quantite=3 ; prix=45.2
S printf "%-20s***%O3d***%+10.2f\n" Sarticle Squantite Sprix
Fournitures ***OO3*** +45.2O
S

Programmation shell sous Unix/Linux


Aspects
avancés
de la programmation
shell

G. Gestion des entrées/sorties d&#39;un


script
1. Redirection des entrées/sorties standard

La commandeinterne exec permet de manipulerles descripteursde fichier du


shell courant. Utiliséeà l&#39;intérieur
d&#39;un
script, elle permetde redirigerde manière
globaleles entrées/sortiesde celui ci.

Redirigerl&#39;entrée
standardd&#39;un
script
exec O<fichierl
Toutesles commandesdu script placéesderrièrecette directiveet qui lisent leur
entréestandardvont extraireleurs donnéesà partir de fichierl. ll n&#39;y
aura donc
plus d&#39;interaction
avecle clavier.
Redirigerla sortie standardet la sortie d&#39;erreur
standardd&#39;un
script
exec >l> fichierl >2> fichier2
Toutesles commandesdu script placéesderrièrecette directiveet qui écriventsur
leur sortie standardenverrontleurs résultatsdans fichierl. Cellesqui écriventsur
leur sortied&#39;erreur
standardenverrontleurserreursdansfichier2.

Redirigerla sortie standardet la sortie d&#39;erreur


standardd&#39;un
script dans un
mêmefichier
exec 1> fichierl 2>&l&1>
Toutes les commandesdu script placéesderrièrecette directive enverrontleurs
résultats et leurs erreurs dans fichierl (cf. chapitre Mécanismesessentielsdu
shell - Redirections).

Premierexemple

raserved
AII
rlghis
Le script batch1.shenvoiesa sortie standarddans /tmp/resuet sa sortie d&#39;erreur
standarddans/tmp/Iog .-

5nl batch1.sh

Editions
EN!
- 1 #! /usr/bin/ksh
2 exec 1> /tmp/resu 2> /tmp/log
©
ChaEitre5
w print "Debutdu traitement: S(date)"
b ls
m cp *.c /tmp
4
m rm *.c
sleep 2
print "Fin du traitement: S(date)"
S
Il n&#39;y
a pas de fichier se terminantpar ".c"dansle répertoirecourant:
S 1s
shell resu.log.110303_lO08
Lancementdu script .-
5 hatch1.sh
Contenudu fichier /tmp/resu:

Snl /tmp/resu
1 Dehut
dutraitement:
Thu Mar1320:04:47
MET2003
2 Shell
3 resu.log.llO303_l0OB
4 Fin du traitement: ThuMar 13 20:04:49 MET2003

Contenudu fichier ltmp/Iog .-

Snl/tmp/log

1 cp:cannot
access
*.c
2 *.c: No such file or directory

l) ll n&#39;est
paspratique
d&#39;avoir
lesmessages
résultats
etlesmessages
d&#39;er
dansdesfichiersdifférentscar la chronologiedesévènementsn&#39;est
pasfacileà
reconstituer.

Deuxièmeexemple
Le script batch2.shenvoiesa sortie standardet sa sortie d&#39;erreur
standarddans
Aspects
avancés
dela programmation
shell
1 #1 /usr/bin/ksh
M exec 1> /tmp/log 2>&1
m
ù
w print Debutdu traitement: S(date)"
1S
cp *.c /tmp
4
m
S rm *.c
sleep 2
print "Fin du traitement: S(date)"
Lancementdu script :
S batch2.sh
Contenudu fichier ltmp/Iog :

N
w
m
a
H
S nl /tmp/log
Debutdu traitement: ThuMar 13 20:12:31 MT 2003
Shell
resu.log.110303_lOO8
cp: cannot access*.c
*.c: No such file or directory
Fin du traitement : ThuMar 13 20:12:33 MET2003

0 Lefichier
/tmp/|og
regroupe
touslesaffichages
etreflète
Pordre
chronologiqu
desévènements.

Troisièmeexemple
Voicile fichier de donnéesteLtxt qui va être exploitépar le script lecture.sh:

nlte1.txt
1 Joyeux
Gisellelrue
dela SourceI89290IVaux|45.26.28.
2 DehautOlivierirue de Pussenvall75020|Paris|78.25.96.78
3 KaramaJosettelrue de la tempete|56lOOlLorient[85.26.45.58

All
rights
reserved
4 GronPierreirue du chateaul38350|LaMure|78.21.23.69
Lescript lecture.sh/it les deuxpremièreslignesd&#39;un
fichier :

Snl lecture.sh
Chapitre5
# La commande read lit son entree standard

Sqmmuww
echo "Lecture de la lere ligne"
read ligne
echo Sligne
echo "Lecture de la 2emeligne
read ligne
echo Sligne
Chaqueappel à la commanderead (lignes 4 et 7) déclenchela lecture d&#39;un
lignedu fichierte|.&#39;txt
puisquel&#39;entrée
standarddu scripta étéconnectée
sur ce
fichier (ligne 1).
Résultatde l&#39;exécution
:
S lecture.sh
Lecture de la lere ligne
JoyeuxGisellelrue de la Sourcel89290lVaux|45.26.28.47
Lecture de la 2emeligne
]DehautOlivierlrue de Pussenvall75020[Paris|78.25.96.78

2. Gestion de fichiers

ksh bash

Les shells récentsapportentune fonctionnalitésupplémentaireà celle présentée


ci-dessus.lls permettentd&#39;ouvrir
et de manipulerdes fichiers en utilisant des des-
cripteurscomprisentre3 et 9 (en plusde O, 1 et 2). L&#39;avantage
est de pouvoir
manipuler desfichierstouten conservant
lesdescripteursO, 1 et 2 connectéssur
le terminal.
a. Ouverturede fichier

En lecture
exec desc<fichier

En écriture
exec desc>fichier

Prograio sellsousnix/Lnux
Aspects
avancés
dela Erogrammation
shell
b. Lectureà partird&#39;un
fichier
read variablel variablez ... variablen<&desc

OU

read
-udesc
Variablel
variable2
... variablen
c. Écrituredansunfichier
echovariablel variahle2 ... variablen >&desc
OU
ksh
print -udescvariablel variable2 ... variablen

d. Fermeture
d&#39;un
fichier

Syntaxe
execdasc<E-
execdesc>s-

Exemple
Le scriptIecture2.shlit les deuxpremièreslignesdu fichierteLtxt,lesafficheà
l&#39;écran
et lesécritdansle fichierouLtxt.-

5nl1ecture2.sh

1 #!/usr/bin/ksh
2 # Ouverturede fichiers
3 exec3<te1.txt A>out.txt
Ë 4 #Lecture
delalere
ligne
detel.txt
â 5 read-u3ligne
Ë; 6 # Ecriture de la lere ligne a l&#39;ecran
et dansout.txt
È 7 print Sligne
T 8 print -u4 Sligne
Ë .
Chapitre
5
ll # Ecriture de la 2emeligne a l&#39;ecran
et dansout.txt

12 print Sligne
13 print -u4 Sligne
14 # Fermeturedes fichiers
15 exec3<&-
16 exec4>&
Exécutionduscript:
S 1ecture2.sh
JoyeuxGisellelrue de la Sourcel89290|Vaux|45.26.28.47
DehautOlivierlrue de Pussenvall75020|Paris|78.25.96.78
Contenudu fichierout.txt.-

Snlout.txt

l Joyeux
Gisellelrue
delaSourcel89290|Vauxl45.26.28
2 DehautOlivierlrue de Fussenval]75020|Paris|78.25.96.78

3. Traitement d&#39;un
fichier

a. Informations
préalables

Rappeldescaractéristiques
de read
La lectured&#39;une
lignede fichierse feraavecla commande read. Voiciun rappel
descaractéristiquesdecettecommande :
- ellelit unelignesurl&#39;entrée
standard(descripteurO) ;
- elleretourne uncodevraisi unelignea étélue(mêmesi la ligneestvide);
- elleretourne uncodefauxlorsqu&#39;elle
rencontre
lafin dufichier.
La lecturedetoutesleslignesd&#39;un
fichierseferaen associant
la commande
read
et la bouclewhile.
Aspects
avancés
de la programmation
shell
La notion de fin de fichier
Lorsquel&#39;entrée
standard(descripteurO) de read est connectéeau terminal (cas
par défaut), la notion de fin de fichier doit être envoyéesur l&#39;initiative
de l&#39;utilisa-
teur par l&#39;intermédiaire
des touches d.
Si l&#39;entrée
standardde la commandeest connectéesur un fichier ordinaire, le
noyau Unix prévientread lorsquela fin de fichier est atteinte. Pour le dévelop-
peur, seul le test du code de retourde read indiqueque la commandeest arrivée
en fin de fichier.

b. Les différentesfaçonsd&#39;exploiter
un fichier

Redirigerl&#39;exécution
du script
Les redirectionspeuventêtrefaites au momentde l&#39;appel
du script.
Exemples
Le script Iitfic1.sh utilise les commandesread et print et ne fait aucuneredi-
rection. Le fichier d&#39;entrée
est le clavier et le fichier de sortie est le terminal :
S nl litfic1.sh
1 #! /usr/bin/ksh
2 # A chaquetour de boucle, lecture d&#39;une
ligne
w numero=0
4 while read ligne
5 do
6 ((numero+=1))
7 print "Ligne no Snumero
=> Sligne" # Utiliser echo en bash
8 done

Ail
rlghts
Ieserved
9 print "Fin de fichier"
S 1itfic1.sh
1ere ligne # saisie
Ligne no 1 => 1ere ligne

Editions
ENI 2emeligne
3emeligne
# saisie
Ligne no 2 => Zemeligne
# saisie
Ligne no 3 => 3emeligne
d # saisie
© Fin de fichier

sh, ksh, bash


Chapitre5
Voiciune versionde ce script compatibleBaumeShe/I.-

Snl litfic1_sh.sh
1 #!/usr/bin/sh
2 numero=0

w
m
»while
do
read ligne
numero= expr Snumero+ 1
4
S
mecho
echo "Ligne no Snumero=> Sligne"
done
"Fin de fichier"
S
L&#39;entrée
et la sortie standarddu shell (celui qui interprètele script) sont asso-
ciéesrespectivementaux fichiers teI.txt et out.txt avantque le script Iit c1.sh ne
commenceà être exécute Toutesles
. commandesdu script qui lisent leur entrée
standard(ici read) extraientleurs donnéesà partir du fichier teLtxt, toutescel-
les qui écrivent sur leur sortie standard (ici print) envoientleurs affichages
dansle fichier out.txt .-
5 1itfic1.sh <te1.txt >out.txt
S nl out.txt

N
w
n
m
1 Ligneno l => JoyeuxGisellelrue de la Sourcei8929OIVaux|45.26.28.47
Ligneno 2 => DehautOlivierlrue de Pussenvali75020)Parisl78.25.96.78
Ligneno 3 =>Karama Josetteirue de la tempete[56100|Lorient|85.26.45.58
Ligne no 4 => GronPierrelrue du chateau|38350JLa
Mure|78.21.23.69
Fin de fichier

Redirectionsinternesau script
Lesredirectionsde l&#39;entrée
(O)et de sortie(1) standardspeuventêtre faitesà l&#39;in-
térieurdu script.
AsEects
avancés
delaprogrammation
shell
Exemple
Lesredirections
del&#39;entrée
etdelasortie
standard
sontfaitesà l&#39;intérieur
du
script Iitfic2.sh en utilisant la commandeexec :

Snl1itfic2.sh
1 #!/usr/bin/ksh
2 exec<te1.txt >out.txt
3 numero=0
4 uhile read ligne
S do
6 ((numero+=l))
7 print "Ligne no Snumero => Sligne"

w
p
N
m
H
8 done
9 print "Fin de fichier"
1itfic2.sh
nl out.txt
Ligne no 1 => JoyeuxGisellelrue de la Sourcel8929DlVauxl45.26.28.47
Ligne no 2 => DehautOlivierlrue de Pussenvall75020lParis|78.25.96.78
Ligneno3 =>Karama
Josettelruedela tempete|56l0O|Lorient|85.26.45.58
Ligne no 4 => GronPierrelrue du chateau[38350|La
Mure|78.21.23.69
Fin de fichier

Voiciuneversiondecescriptcompatible
BourneShell:
Snllitfic2_sh.sh
1 #!/usr/bin/sh
2 exec <tel.txt >out.txt
3 numero=O

4
m
n
All
rlghts
rusarvod
while read ligne
do
numero= expr
done
Snumero+ 1
echo "Ligne no snumero=> sligne"
echo "Fin de fichier"
Chapitre5

yjtilisation d&#39;autres
descrigteurs
En ksh et bash, il est possibled&#39;utiliser
des descripteursde fichier comprisentre 3
et 9, ce qui permetde ne pas dissocierles descripteursO, 1 et 2 du terminal.

Exemple

ksh

Dansle script litfic3.sh, le fichier teI.txt est ouvert en lecture sousle descripteur
3 et le fichier out.txt est ouvert en écriture sous le descripteur4. Les comman-
des read et print utilisent l&#39;option u pour spécifierle descripteurutilisé :

m
à

4
m
S
w

10
11
S
5 litfic
S nl out
Ligne

Ligne
S nl 1itfic3.sh
#1 /usr/b
exec3<te
numero=0
while rea

Ligne
do
Asgects
avancés
de la grogrammation
shell

Snl 1itfic3_hash.sh
1 #1/bin/bash
N exec 3<te1.txt 4>out.txt

numero=0
while
read
ligne<&3

H
do
((numero+=1))
echo"Ligne no Snumero=> Sligne" >&4
done
echo"Fin de fichier" >&4
exec3<&-
exec4>l

w
à
m
0
H
4
m
M
H
N
m 1itfic3_ÿash.sh
nl out.txt
Ligne no 1 => JoyeuxGisellelrue de la Source|89290|Vaux|45.26.28.47

m
M
h
w
Ligne no 2 => DehautOlivierlrue de Pussenval|75020lParis|78.25.96.78
Ligne no 3 => KaramaJosettelrue de la tempetel56100|Lorient|85.26.45.58
Ligne no 4 => GronPierrelrue du chateaul38350lLa
Mure|78.21.23.69
Fin de fichier

Redirectiond&#39;un
bloc

Il est possiblede redirigeruniquementles commandessituéesà l&#39;intérieur


d&#39;une
structurede contrôle(un bloc).Lesredireçtions
doiventêtreécritesderrièrele mot
clé qui fermela structurede contrôle.A l&#39;exécution,
ellessont misesen place
avant le traitementde la structurede contrôle.
Chagitre5
6 ((numero+=l))
7 print "LignenoSnumero => Sligne"
8 done<te1.txt >out.txt
9 print "Finde fichier"
S 1itfic4.sh
Avantwhile
Fin de fichier
S nl out.txt
1 Ligneno1 => JoyeuxGisellelruede la SourcelB9290|Vauxl45.26.28.47

N
w
m Ligne no2 => DehautOlivierlrue de Pussenval|75020|Paris]78.25.96.78
Ligneno3 => Karama Josettelruede la tempete|56100|Lorient|85.26.45.58
Ligneno 4 => GronPierre)ruedu chateau|3B350}La
Mure|78.21.23.69

Redirigerun blocsurdesfichiersouvertsen amont.-

5nl1itfic5.sh

1 #!/usr/bin/ksh
2 exec3<tel.txt 4>out.txt
3 numero=0
D echo"Avantwhile"
m while readligne
4
mdo
((numero+=l))
0
mdone
echo"Lignenosnumerc
<&3>&4
echo"Fin de fichier"
=> Sligne"

11 exec3<&-
12 exec4>&-
S 1itfic5.sh
Avantwhile
Fin de fichier
S nl out.txt
1 Ligneno1 => JoyeuxGisellelruede la Source|89290|Vaux[45.26.28.47
2 Ligneno2 => DehautOlivierlrue de Pussenvalj75020]Paris178.25.96.78
3 Ligneno 3 =>Karama Josettelruede la tempete[56lOO|Lorient|85.26.45.58
4 Ligne no 4 => GronPierrelrueduchateau|38350jLaMure|78.2l.23.69
S
Aspects
avancés
de la programmation
shell
c. Découperune ligne en champs
Si les lignesdu fichier à traiter sont structuréesen champs, il est très facile de
récupérerchacunde ceux-cidans une variable.Pourcela, il faut modifierla valeur
de la variable IFS (cf. chapitre Les bases de la programmationshell La
commanderead).

Exem le
Le script Iitfic6.sh génère,à partir du fichier teLtxt, une sortie écran qui reprend
le format du fichier traité, mais en ajoutant "01." devantle numérode téléphone
des clients localisésen région parisienneet "99." devant le numérodes clients
localisésen province.La variableIFS est initialisée à la valeur du caractèrefai-
sant office de séparateurde champdans le fichier (ici "|") :
S nl 1itfic6.sh
1 #1 /usr/bin/ksh
2 if (( S# != l ))
3 then
4 echo "Mauvaisnombred&#39;arguments"
5 echo "Usage: S0 fichier"
6 exit 1
7 fi
8 if [[ ( ! -f "S1" ) Il ( ! -r "S1" ) ]
9 then
10 echo "S1 n&#39;est
pas un fichier ordinaire ou n&#39;est
pas
accessible en lecture"
11 exit 2
12 fi

All
r/ghts
rusarvad
13 IFS="|"
14 while read nomadr cp ville tel
15 do
16 case "Sep" in
17 7[57e]* | 9[1-5]* )

EN/
Edltfons
-
18 prefix="01."
19 ;;
20 *)
21 prefix="99."
22 i;
23 esac
©

sh, , bah
Chapitre5
24 echo "Snom|Sadr|Scplsvillelsprefixstel"
25 done < S1
S
La commanderead reçoit cinq noms de variablesen argument(ligne 14). Elle
découpedonc la ligne lue en champsen utilisant le caractère"|" commesépara-
teur (modificationde la variableIFS en ligne 13). La ligne est donc automatique-
ment découpée.ll ne resteplus qu&#39;à
tester la valeurdu codepostal(ligne 16) et à
réassembler la ligne en y insérantl&#39;index
téléphoniqueadéquat(ligne24).
Exécutiondu script :
S litfic6.sh tel.txt
JoyeuxGisellelrue de la Source|89290|Vauxl99.45.26.28.47
DehautOlivierlrue de Pussenvall75020|ParislOl.78.25.96.78
KaramaJosettelrue de la tempete|56l00ILorientl99.85.26.45.58
Gron Pierrelrue du chateaul38350iLaMure|99.78.21.23.69
S

H. La commande eval

Syntaxe
eval exprl expr2 ... exprn
La commandeeval permetde faire subir à une ligne de commandeune double
évaluation.Elle prenden argumentune suite d&#39;expressions
sur laquelleelle effectue
les opérationssuivantes:
Premièreétape : les caractèresspéciauxcontenusdans les expressionssont
traités. Le résultatdu traitementaboutit à une ou plusieursautresexpressions:
eval autre_exp1 autre_exp2 ... autre_expn. LexpSsdon autre_
expl représentera la commandeUnix à lancerdans la deuxièmeétape.
r Deuxième étape : eval va lancer la commande
autre_expl autre_exp2 ... autre_ expn. Mab aupamvam, ce e
ligne de commandeva subir une nouvelleévaluation.Les caractèresspéciaux
sont traités, puis la commandelancée.

Progmmation
ll sousUnix/Liux
Aspects
avancés
dela programmation
shell

Exemple
Définitionde la variablenom qui contient"christie":

I5nom=christie
Définitionde la variablevar qui contientle nomde la variabledéfinie ci-dessus:

I5 var=nom
Commentfaire afficher la valeur"christie"en se servantde la variablevar .7Dans
la commandesuivante,le shell substitueS5 par le PIDdu shell courant.-
S echo Ssvar
17689var
Dansla commandesuivante,le nom de la variableest isolé. Celane pourrapas
fonctionnernon plus .-le shell génèreune erreurde syntaxecar il ne peut traiter
les deuxcaractères"E"simultanément.-
S echo Sfsvar}
ksh: S{Svar}: bad substitution
Il est indispensabled&#39;utiliser
la commandeeval :
S eval echo \ssva:
christie
S

0 L&#39;ordre
d&#39;évaluation
dushellestdonné
auchapitre
Lesbases
delaprogramma-
tion shell - Interprétationd&#39;une
lignede commande.

All
rlghts
reservod
Mécanismede la commandeeval
Premièreétape: évaluationdescaractèresspéciaux
eval echo\SSvar

ENI
Editlons
{P
Traitementdescaractèresde protection(Pantislash
est obligatoirepourempêcherie
traitementdu premier"SIS"
lorsde la premièreétape)

sh, Abah
Chapitre5
e
eval echo SSvar
J}
Substitutiondes variables
41-
eval echo Snom
4}
Deuxièmeétape: évaluationet lancementde la commande echo snom
echo Snom
4}
Substitutiondes variables
é}
echo christie
{L
Lancementde la commandeecho qui reçoitle mot "christie"en argument.

I. Gestion des signaux


Les dispositionsdu shell courantvis-à-visdes signauxpeuventêtre modifiéesen
utilisantla commandetrap.

1. Principaux signaux

Nom du signal N° Signification Dispositionpar défaut Disposition


d&#39;un
processussur modifiable .1
réceptiondu signal
HUP 1 Rupture d&#39;une
ligne de Mort oui
terminal. Lors d&#39;une
déconnexion,le signal
est reçu par d&#39;éventuels
processus lancés en
arrière-planà partir du
shell concerné.

Programmation
shllsousUnix/Liu
Asectsavancés
delaprogrammation
shell

Nomdusignal N° Signification Disposition


pardéfaut Disposition
d&#39;un
processus sur modifiable?
réceptiondu signal
INT 2 Généréà partirdu c!a Mort oui
vier (voir paramètre
intr de la commande
stty a). Utilisépour
tuer le processusqui
tourneenavantplan.
TERM 15 Généré via la com- Mort oui
mandekill. Utilisépour
tuerunprocessus.
KILL 9 Généré via la com- Mort non
mandekill. Utilisépour
tuerunprocessus.

0 Dans
lescommandes,
lessignaux
peuvent
être
exprimés
sous
forme
numérique
ou symbolique.
LessignauxHUP, INT, TERM et KILL possèdent la même
valeurnumérique surtouteslesplates-formes
Unix,ce qui n&#39;est
pasle casde
touslessignaux.Laformesymbolique estdoncpréférable.

2. ignorer un signal

Syntaxe
trap " sigl sig2

rlahtu
All
momd
Exemple
Leshellcouranta pourP/D 18033 :
S echo5S

-
EN/
Ed/rlom
18033
L&#39;utilisateur
demandeau shelld&#39;ignorer réceptiondessignauxHUP et
l&#39;éventuelle
TERM:
S trap &#39;
&#39;
HUPTERM
0

sh, ksh, bash


5
Chagitre
EnvoidessignauxHUP et TERM:
S kill -HUP18033
S kill -TERM18033

Lessignaux
sontignorés, shellnemeurtdoncpas:
leprocessus
S echoSS
18033
S

3. Modifier
le traitement à un signal
associé

Syntaxe
trap &#39;cmd1;cmd2;
...; cmdn&#39;
sigl sig2

Exemple
Le shellcourantportele P/D 18007 et a été lancéà partirdu sheIlde
P/D 17924 .-

Sps

PIDTTY TIME
CMD
18007ptS/Z 0:00 ksh
17924pts/2 0:00 ksh
S echoS5
18007

Modification du shellcourantvis-à-visde SIGINT.-


de la disposition
S trap &#39;echo
"SignalINT recu" ; exit 1&#39;
INT
Saisiede "c .-
S C

echo puis la commande


Leshe/Iexécutela commande exit :
Signal INT recu
Asgects
avancés
dela grogrammation
shell
L&#39;utilisateur
est revenuau shell précédentde P/D 17924 .-

S ps
PID TTY TIMECMD
17924pts/2 0:00 ksh
S echo S3
17924

4. Repositionnerle traitement par défaut du shell


vis-à-vis d&#39;un
signal

Syntaxe
trap - sigl sig2 ... sign

Exemple
Créationd&#39;un
fichier /tmp/fic :
s > Itmp/fic
Si le shell reçoit SIGINTou SIGTERM,
il doit détruirele fichier .-
5 trap &#39;:m
-f /tmp/fic INT TERM
PIDdu shell courant:
S echo 55
18033
Envoidu signalSIGINTau shell courant:

All
rlghts
reserved
S c
Le fichier a été supprimé:

Edltlans
ENl
-
S 1s /tmp/fic
/tmp/fic: No such file or directory
Nouvellecréationdu fichier /tmp/fic :

© S > /tmp/fic

s, , bash
Chapitre5

Repositionnement de la dispositionpar défaut du shel/ (pardéfaut, un shell inte-


ractif ignoreSIGIN7&#39;)
vis-à visdu signalSlGIN7&#39;.
S trap - INT TERM
PIDdu shell courant:
S echo S5
18033
Envoidu signalSIGINTau shell courant:
S c
Leshel/n&#39;a
rien fait et le fichier est toujoursprésent:
S ls /tmp/fic
/tmp/fic
S

5. Utiliser trap à partir d&#39;un


scriptshell
L&#39;utilisation
de trap à partird&#39;un
script shell permetde prévoirle traitementà effec-
tuer dansl&#39;éventualité
de la réceptiond&#39;un
ou de plusieurssignaux.

Exemple
Le script attrape_signo.shreçoit l&#39;un
des signauxS/GHUP,SlGlNT,SIGTERM,il
appelle la fonction "terminer"qui supprimele fichier SFICTEMPet termine le
script:

Snl attrape_signo.sh

1 #l/bin/bash
3 FICTEMP=/tmp/temp.txt
5 function terminer {
6 échoSuppressionde SFICTEMP
- Fin du script
7 rm -f SFICTEMP
Asgects
avancés
delaErogrammation
shell
10 # Dispositionvis a vis de SIGHUP,SIGINTet SIGTERM
signal
11 # Appelerla fonction terminersi receptiond&#39;un
12 trap terminer HUPINT TERM
13 # Creationde FICTEMP
14 > SFICTEMP
15 # Traitement
16 echo "Debutdu traitement"
l7 sleep 100
18 echo "Fin du traitement"
19 exit 0
Exécution

S attrape_signo.sh
Debutdu traitement
"C
Suppressionde /tmp/temp.txt Fin du script
S echoS?
l
S

J. Gestion de menus avec select

Syntaxe
select var in iteml item2 ... itemn

AI/
rlghts
merved
do
commandes
done
La commandeinterneselect est unestructurede contrôlede type bouclequi

-
ENI
Edltlons
permetd&#39;afficher
de manièrecycliqueun menu. La listedes items, iteml
item2 itemn seraaffichéeà l&#39;écran
à chaquetourde boucle.Lesitems
sont indicésautomatiquement.
La variablevar serainitialisée
avecl&#39;item
corres-
pondantau choixde l&#39;utilisateur.

sh,ksh,
bash
Chapitre5

Cettecommandeutilise égalementdeuxvariablesréservées :
- La variable PS3 représentele prompt utilisé pour la saisie du choix de
l&#39;utilisateur.
Sa valeurpar défautest #?. Elle peut être modifiéeà la convenance
du développeur.
- La variableREPLYqui contientl&#39;indice
de l&#39;item
sélectionné.

0 Lavariablevar contientle libellédu choixet REPLY


l&#39;indice
decedernier.

Exemple

Snl menuse1ect.sh

1 #1/usr/bin/ksh
3 function sauve {
4 echo "Vous avez choisi la sauvegarde"
5 # Lancementde la sauvegarde
6 l
8 function restaure (
9 echo "Vousavez choisi la restauration"
10 # Lancementde la restauration
11 }

14 PS3="Votrechoix : "
16 select item in "- Sauvegarde" "- Restauration " " Fin"
17 do
18 echo "Vousavez choisi l&#39;item
SREPLY: Sitem"
19 case "SREPLY" in
20 D
2l # Appel de la fonction de sauvegarde
22 sauve
23 îi
24 2)
25 # Appel de la fonction de restauration
26 restaure
27 :;
28 3) echo "Fin du traitement"
29 echo A bientot ..."
30 exit 0
.35e aanés a _&#39;.°atl°5e&#39;
31 ;;
32 *) echo "Saisie incorrecte"
33 :7
34 esac
35 done
Exécution:
S menuse1ect.sh
1) Sauvegarde
2) Restauration
3) - Fin
Votre choix : 1
Vousavez choisi l&#39;item
1: Sauvegarde
Vousavez choisi la sauvegarde
La saisiede la touche[Entrée]permetde réafficherle menu :
Votre choix : Entrée
1) ÿ Sauvegarde
2) - Restauration
3) - Fin
Votre choix : 3
3: * Fin
Vousavez choisi l&#39;item
Fin du traitement
A bientôt ...

K. Analyse des options d&#39;un


script avec getopts

Syntaxe

Ail
rlghts
reserved
getopts liste-options attendues option
La commandeinternegetopts permetà un script d&#39;analyser les options qui lui
ont été passéesen argument.Chaqueappel à getopts analysel&#39;option suivante

Edltlons
ENI
de la ligne de commande.Pourvérifier la validité de chacunedes options, il faut
appelergetopts à partir d&#39;une
boucle.

sh, ksh, bash


Chapitre5
Définitiond&#39;une
option

Pourgetopts , une optionest composéed&#39;un


caractèreprécédéd&#39;un
signe"+"
ou .._.._

Exemple
"-c"et "+c" sontdesoptions,tandisque "christ/e"est un argument:
# gestuser.sh -c christie
# gestuser.sh +c
Uneoptionpeutfonctionner
seuleou êtreassociéeà un argument.

Exemple
Voicile script gestusenshqui permetd&#39;archiver
et de restaurerdes comptesutili-
sateur. Les options-c et -x signifientrespectivement"Créerune archive"et
"Extraireune archive".Cesontdes optionssansargument.Lesoptions u et -g
permettentde spécifier la listedes utilisateurset la listedes groupesà traiter.
Elle doiventêtre suiviesd&#39;un
argument.
# gestuser.sh -c -u christie,bob,olive
# gestuser.sh -x g cours-u christie,hob
Pourtestersi les optionset argumentspassésau script gestuser.shsontceuxat-
tendus,le développeurécrira:
getopts "cxu:g:" option
B<plicationdesargumentsde getopts :
- Premierargument: les optionssontcitées l&#39;une
derrièrel&#39;autre.
Une option
suivied&#39;un
":" signifiequec&#39;est
uneoptionà argument.
- Deuxièmeargument: option est une variable utilisateurqui sera initialisée
avecl&#39;option
en coursde traitement.
Un appelà getopts récupèrel&#39;option
suivanteet retourneun codevrai tant qu&#39;il
restedesoptionsà analyser.Lorsqu&#39;une
optionestassociéeà un argument,ce der-
nier estplacédansla variableréservéeOPTARG.
LavariableréservéeOPTINDcontientl&#39;indice
de la prochaineoptionà traiter.

Snlgestuser.sh
l while
getopts
"cxu:g:"
option
2 do
Aspects
avancés
de la programmation
shell
3 echo "getopts a trouve l&#39;option
Soption"
4 case "Soption" in
5 c) echo "Archivage"
6 echo "Indice de la prochaine option a traiter : SOPTIND"
7 ;;
8 x) echo "Extraction"
9 echo "Indice de la prochaine option a traiter : SOPTIND"
10 ;;
ll u) echo "Liste des utilisateurs a traiter: SOPTARG"
12 echo "Indice de la prochaine option a traiter : SOPTIND"
13 if
14 q) echo "Liste des groupesa traiter: SOPTAR "
15 echo "Indice de la prochaine option a traiter : SOPTIND"
16 ;;
17 esac
18 done
19 echo "Analyse des options terminee"
20 exit O
Appel du script avecdes optionsva/ides:
S gestuser.sh -c -u christie,bob,o1ive -g cours
getopts a trouve l&#39;option
c
Archivage
Indice de la prochaine option a traiter : 2
getopts a trouve l&#39;option
u
Liste des utilisateurs a traiter: christie,bob,olive
Indice de la prochaine option a traiter : 4
getopts a trouve l&#39;option
g
Liste des groupesa traiter: cours
Indice de la prochaine option a traiter : 6
Analyse des options terminee

All
reserved
rights
Optioninvalide
Lorsquegetopts détecteune option invalide, la variableoption est initialisés
avec le caractère"?" et un messaged&#39;erreur
est affiché à l&#39;écran.
Puis les options

ENI
Edïtians
-
suivantessont analysées.

sh, ksh, bash


Chapitre5
Exemple
L&#39;option
-y ne fait paspartie de la liste desoptionsattendues.-
S gestuser.sh y c
gestuser.sh: getopts: y bad option(s)
getopts a trouve l&#39;option
?
getopts a trouve l&#39;option
c
Archivage
Indice de la prochaine option a traiter : 3
Analysedes options terminee
S

Gestiondeserreurs

Si le caractère":" est placéen premièrepositiondans la liste desoptionsà traiter


(ligne3), les erreurssontgéréesdifféremment.Encasd&#39;optioninvalide:
- getopts Naf cherapasde messaged erreur ;
- la variable OPTARGsera initialisée avec la valeur de l&#39;option incorrecte
(ligne18).

Exemple
Lecodepeut être réécritde la façonsuivante:

Snlgestuser.sh

l #Lecaractere
":"en1ere
position demieux
permet gerer
les
2 # options incorrectes
3 while getopts "zcxuzgz" option
4 do
5 case "Soption" in
6 c) echo "Archivage"
7 echo "Indice de la prochaine option a traiter : SOPTIND"
8 if
9 x) echo "Extraction"
10 echo "Indice de la prochaine option a traiter : SOPTIND"
11 ;;
12 u) echo "Liste des utilisateurs a traiter: SOPTARG"
l3 echo "Indice de la prochaine option a traiter : SOPTIND"
l4 ;;
15 q) echo "Liste des groupesa traiter: SOPTARG"
16 echo "Indice de la prochaine option a traiter : SOPTIND"
Aspects
avancés
dela Rrogrammtion
shell
l7 ;;
18 \?) echo "SOPTARG:
OPTION INVALIDE- Bye"
19 exit 1
20 :7
21 esac
22 done
23 echo Analysedes options terminee"
24 exit 0
S

Le messaged&#39;erreur
généréautomatiquementpar getopts n&#39;apparaît
plus et
SOPTARG a été substituéepar la valeurde l&#39;option
incorrecte:
S gestuser.sh -y -c
y: OPTIONINVALIDE A Bye

0 Enligne18,le"?"doitêtreprotégé
pournepasêtreinterprété
parleshell.
OEtionvalideavecargument
manquant
Lorsquel&#39;argument
d&#39;une
option est absent, la variableoption est initialisée
avecle caractère":" et OPTARG contientla valeurde l&#39;option
concernée(ligne14).

Exemple
Ici, la structurede contrôlecase traite le casde l&#39;argument
manquant:

Sn1gestuser.sh

l #Lecaractere
":" en1ere
position
permet
demieux
gerer
les
2 # options incorrectes
Ê 3 while getopts ":cxu:g:" option
Ë 4 do
3 5 case "Soption" in
Ë 6 c) echo "Archivage"
Ë, 7 ::
; 8 x) echo "Extraction"
T 9 r:
Ë 10 u) echo"Liste desutilisateurs a traiter: SOPTARG"
,,, 11 ;;
Ë 12 g) echo "Liste des groupesa traiter: SOPTARG"
Ë 13 ;;
@
Chapitre
5
14 z) echo "L&#39;option
SOPTARG
requiert un argument- Bye"
15 exit l
16 F;
17 \?) echo "SOPTARG:OPTION
INVALIDE - Bye"
18 exit 1
19 il
20 esac
21 dune
22 echo "Analysedes options terminee"
23 exit O

Appelen oubliantl&#39;argument
de l&#39;option
-u :
S gestuser.sh -c u
Archivage
L&#39;option
urequiert
unargument
Bye
S
Lesoptionssontstockéesdansles paramètrespositionnels(S1, S2, ...). Unefois
que celles-cisont analysées,il est possiblede s&#39;en
débarrasseravecla commande
shift (cf. chapitreLesbasesde la programmationshell - Variablesréservéesdu
shell).Ceciest intéressants&#39;il
restedesargumentsà traiterderrièreles options.

Exemple
Leslignesajoutéesderrièrela boucle while permettentde retirer les optionsde
la liste des arguments(ligne 26). L&#39;expression
OPTIND-l représentele nombre
d&#39;options
analysées,doncla valeurdu décalageà réaliser.
S nl gestuser.sh | tail
20 esac
21 done
22 echo "Analysedes options terminee"
23 echo "Avant shiftz"
24 echo "Liste des arguments:5*"
25 echo "Indice de la prochaine option a traiter: SOPTIND"
26 shift S((0P&#39;1&#39;1Nn 1))
27 echo "Apres shiftz"
28 echo "Liste des arguments:5*"
29 exit 0
S gestuser.sh -c -u christie,bob ficl fic2 fic3 fic4
Archivage
Asectsans e l rorain shl
Liste des utilisateurs a traiter: christie,bob
Analysedesoptionsterminee
Avantshift:
Liste desarguments: c -u christie,bob fiel fic2 fic3 fiel
Indice de la prochaineoption a traiter: 4
Apresshift:
Liste des arguments:ficl fic2 fic3 ficl
S

L. Gestiond&#39;un
processusen arrière-plan
Lacommande wait permetau shelld&#39;attendre
la terminaison
d&#39;un
processus
lancé
enarrière-plan.

syntaxes
Attendrela terminaison
du processusdontle PIDestdonnéenargument:
wait pidl
Attendrela terminaisonde tous les processuslancésen arrière-plan
à partirdu
shellcourant:
wait

ksh bash

Attendre
laterminaison
du processus
dontle numérodejobestdonnéenargument
:
wait %job

reserved
rights
Exemples
Lacommande Ellea pourPID 13415 :
find estlancéeen arrière-plan.

-
ENI
Editions
AII S find / -namepasswd1> /tmp/res 2> /dev/nulls
[1] 13415
S jobs
[1]+ Running find / -namepasswd>/tmp/res2>/dev/null &

sh,ksh,bsh
Chagitre5
Le shell s&#39;endort
en attendantla terminaisondu processus13415 :
S wait 13415# ou wait %1
Le shell est réveillélorsquele processus13415 est terminé.-
[1]+ Exit 1 find / snamepasswd>/tmp/res 2>/dev/null
S

0 LePIDdeladernière
commande
lancée
enarrière p|an
estcontenu
dansla
variablespécialeS1.

Le script attendproash lance une sauvegardeen arrière-plan. Pendant que


celle cise déroule,le shell effectue d&#39;autres
actions.Puis il attend la fin de la
sauvegardeavantde lancerune vérificationde la bande:

Snl attendproc.sh
1 #1/usr/bin/ksh
# Lancementd&#39;une
commande de sauvegardeen arriere-plan

xoooximmu
find / | cpio ocvB> /dev/rmt/0 &
echo "Le PID du processusen arriere-plan est : S!"
# Pendantque la commande de sauvegardese deroule,
# le script fait autre chose
echo "Debutdes autres actions
ecno Fin des autres actions"
10 # Attente de la fin de la sauvegardepour passer a la suite
ll echo "-Synchronisation - Attente de la fin de la sauvegarde"
12 wait S!
13 echo "La sauvegardeest terminee."
14 echo "Verification de la sauvegarde"
15 cpio -icvtB < /dev/rmt/0 > /backup/1og_ date+%d%m%y
16 exit O
S

Sattendproc.sh
Le PID du processusen arriere plan est : Z3014
.a vanté ., ami ,.
# Le shell s&#39;endort
La sauvegarde est terminee.
Verification de la sauvegarde

M.Scriptd&#39;archivage
incrémental
et transfert sftp automatique
1. Objectif
ll s&#39;agit
d&#39;écrire
un scriptqui sauvegarde
de manièreincrémentale
le contenud&#39;un
d&#39;une
répertoire machinede production.Lesfichiersde sauvegarde(archives
cpio
compressées)seronttransféréssurunserveurde sauvegarde
(serveurvenus),dans
unrépertoire
dontle nomdépenddumoiset de l&#39;année
desauvegarde.
Répertoires
de la machinede production :
- lroot/admin/backup zrépertoire
desscriptsdesauvegarde.
- lhome/document : répertoire
desdocuments à sauvegarder.
- /home/lbackup : répertoire
localdesarchives.Ce répertoire
seranettoyétousles
mois.
Répertoires
de la machinedesauvegarde :
- /home/dbackup/2011/01: archives
du moisdejanvier2011.
- /home/dbackup/2011/02 du moisdefévrier2011.
: archives

reserved
rlghts
AI/
Dansl&#39;exemple
présentéici, cesrépertoires
sontcréésparavance.Ce n&#39;est
pasle
scriptdesauvegarde
quilefait (maiscelaestfacilementréalisable).
Lafigure2 représente
l&#39;arborescence
des2 serveurs.

-
ENI
Éditions
La sauvegarde incrémentale
utiliseraautantde niveaude sauvegarde y a de
qu&#39;il
jourdansle mois.Parprincipe,unesauvegarde de niveau0 (sauvegarde
de tous
lesfichiersdu répertoire
lhome/document) estfaitele premierjourdechaquemois.
Les jourssuivants,seulsles fichiersmodifiésdepuisle jour précédentseront
archivés.
©

s h, ash
Chapitre5
Desfichiers de niveausont utilisés (niveau0,niveau1...).Ceux-citémoignentde la
date à laquellela sauvegarde
a été réalisée.

Exemple
Le 01/01/2011 : Sauvegardede niveau 0 : création du fichier témoin "niveauO"
et sauvegardede tous les fichiers situés souslhome/document.Transfertde l&#39;ar-
chive sur le serveurde sauvegarde.
Le 02/01/2011 : Sauvegardede niveau 1 .- créationdu fichier témoin "niveau1".
Puis les fichiers plus récents que le fichier témoin "niveau0"sont sauvegardés.
Transfertde l&#39;archive
sur le serveurde sauvegarde.
Le 03/01/2011 .- Sauvegardede niveau2 : créationdu fichier témoin "niveau2".
Puis les fichiers plus récent que le fichier témoin "niveau1"sont sauvegardés.
Transfertde l&#39;archive
sur le serveurde sauvegarde.
etc.
Le 01/02/2011 : Sauvegardede niveau 0 : suppressionde tous les fichiers
témoindu mois précédent.Créationd&#39;un
nouveaufichier témoin "niveauO"et sau-
vegardede tous les fichiers situés sous /home/document.Transfertde l&#39;archive
sur le serveurde sauvegarde.
etc.

Ü Lasauvegarde
incrémentale
permet
d&#39;avoir
unesauvegarde
journalière,
en
archivantuniquementles fichiers modifiésou ajoutésdepuis la veille. En cas
de perte d&#39;un
fichier, il suffit de restaurerla dernièrearchive contenantce
fichier. Si l&#39;utilisateur
souhaite restaurertout le répertoireIhome/document,il
faut restaurertoutes les archives du mois en cours en commençantpar
l&#39;archive
de niveau0.

Progatin sll sousUnix/Linux


Aspects
avancés
dela programmation
shell
Serveur
deproduction
- Machine
locale

rappom.doc
rapportldoc

niveauù

niveaui
2011_[11_U1_n&#39;i\reauEl.cpio.bz2
2011_|J1_lJ2_niveau1.cpio.bz2
Serveur
desauvegarde
- Machine
distante

rlghts
AII
reserved
2311431
_Ü1_niveauU.cpio.hz2
2D11__Ü1_02_niveau1.cpio.bz2
Figure2 : Arborescencedesserveursde productionet de sauvegarde

Edltlons
ENI
-
Lescript de sauvegarde se décomposeen deuxfichiers:
Lefichier uploadBackupshest le programmeprincipal.
- Le fichier fonctions.inc.shcontient des fonctionsappeléesà partir du fichier
upload ackupsh.
©
ChaBitre
5
2. Le fichier uploadBackup.sh
Voici le codesourcecommentédu script uploadBackup.sh:
1 #! /bin/bash
2
3 # Variables globales
4:: --
5 # Repertoire des scripts-shells de backup
6 SCRIPTDIR="/root/admin/backup"
\ # Repertoire des fichiers a sauvegarder
8 DATADIR=/home/document
9 # Repertoire local des archives
10 ARCHIVEDI "/home/lbackup"
11 # --
12 # Librairies de fonction
13 # --
14 # Inclure fonctions
15 . SSCRIPTDIR/fonctions.inc.sh
16 # Fichier de log
17 LOG=SARCHIVEDIR/ getDate .log
15 # --
19 # Programme
20 # --
21 exec l>SLOG 2>&1
22 # --------------------------------
23 # Determinerle niveau de sauvegarde
24 # Le ler du mois => niveau O
25 # ----- --
26 jourDuMoi getDayForCalcul
27 ((niveau=Sj0urDuMois-1))
28 case Sniveauin
29 O) # Sauvegardetotale
30 # Nettoyagedu repertoire d&#39;archive
31 rm -i SARCHIVEDIR/*.bz2 SARCHIVEDIR/niveau*
32
33 # Creation du fichier de niveau (niveau0)
34 touch SARCHIVEDIR/niveauo

Programmation
shellsousUnix/Liux
AsBects
avancés
de la Brogrammation
shell
35 archive="SARCHIVEDIR/ getDate _niveau0.cpio"
36 find SDATADIR
I cpio -ocv I bzip2 -c > Sarchive.bz2
37 ;;
38 *)
39 touch SARCHIVEDIR/niveausniveau
40 archive="SARCHIVEDIR/ getDate _niveauS(niveau).cpio"
41 ((niveauPrec=Sniveau-1))
42 if [[ l f SARCHIVEDIR/niveauSniveauPrec]] ; then
43 echo Fichier de niveau SniveauPrec
inexistant"
44 exit l
45 fi
46 # Sauvegarde
47 find SDATADIR-newerSARCHIVEDIR/niveauSniveauPrec\
| cpio -ocv I bzip2 c > archive.bz2
48 îi
49 esac
50 # Verification de la validité de l&#39;archive
5l if isArchiveInvalide Sarchive.bzZ; then
52 echo"Archive Sarchive.bz2INVALIDE - Fichier non transfere"
53 exit 1 ;
54 fi
55
56 if transfert S(archive).bz2; then
57 echo"Transfert realise avec succes"
58 exit O
59 fi
60 echo"Echecdu transfert"
6l exit 1

raservad
rlghts
AII
Commentaires :
- Lignes6, 8 et 10 : Initialisationde 3 variablesglobalesqui représententles
nomsde répertoiresqui serontmanipulés.

EdIt/ons
ENI
-
- Ligne 15 : Inclusiondans l&#39;environnement courant (via la commande.) des
fonctionsdéfiniesdans le fichier fonctions.inc.sh.La variableglobaleSCRlPTDlR
est utilisée pour l ordre d&#39;inclusion,il faut donc qu&#39;elle
ait été définie
antérieurement: il faut faire attentionà l&#39;ordre
des instructions.

4D

sh, ksh, bash


Chapitre5

- Ligne 17 : Définitiond&#39;une
autre variableglobale. La variableglobale LOGest
initialisée en faisant appel à la fonction getDate définie dans le fichier
fonctions.inc.sh.ll faut doncque ce derniersoit inclusantérieurement.
- Ligne21 : Redirectiondes sortiesstandardet erreurstandarddu script dans le
fichier de log.
- Lignes26 et 27 : Calculdu niveaude sauvegarde à partir du jour courant.
Casde la sauvegardetotale (niveauO)
- Ligne29 : Le premierjour du mois tous les fichierssont archivésau format cpio
et compressésau format bz2.
- Ligne31 : Lesfichierslocauxconcernantle mois précédentsont supprimés.
- Ligne 34 : Création du fichier témoin niveauOdont la date de dernière
modification(ici identiqueà la date de création)sera utilisée pour réaliserles
sauvegardes ultérieures.
Casdes sauvegardes incrémentales:
- Ligne39 : Créationdu fichier témoin reflétantle niveaude sauvegarde
- Ligne47 : Sauvegarde incrémentale: seulsles fichiers modifiésdepuisle niveau
précédentsont traités. L&#39;option
newer de la commandefind permet de
réalisercette opération.
Reprisedu traitementcommun.-
- Ligne 51 : Vérificationde la validité de l&#39;archive
par la fonction isZ-Xrchive-
Invalide.
- Ligne 56 : Transfertde l&#39;archive
sur le seNeur de sauvegardepar la fonction
transfert.

0 Lescommandes
cpio etbzip2sontprésentées
auchapitre
Lescommandes
filtres.

3. Le fichier fonctions.inc.sh

La fonction transfert
Elle prend un nom de fichier en argumentet le transfèresur la machinedistante
venus, en utilisant l&#39;identité
dbackup. La fonction transfert retourneun statut
vrai (0) en cas de succèsou faux (1) sinon.

Prgrammation
shellsousUnix/Liu
AsEects
avancés
de Ia grogrammation
shell
1 # ----------------------------- --
2 # Fonction transfert
3 # Argument : fichier a transferer
4 # &#39;-
5 function transfert {
6 typeset mois
7 typeset annee
8

9 typeset
ficATransferer=Sl
10
11 mois= getMonth
12 annee= getYear
l3
14 sftp -b - "dbackup@Svenus"
<FIN
15 cd /home/dbackup/Sannee/Smois
l6 pwd
l7 put SficATransferer
18 FIN
l9
20 (( S? != 0 )) &&return 1
21
22 # Tester si archive valide sur machinede sauvegarde
23
24 ficSurMachineCible=S(basename
SficATransferer)
25 ssh dbackup@Svenusbzip2 t
/home/dbackup/Sannee/Smois/SficSurMachineCible
26

27 case
S?in
28 0) i;
29 255)
30 echo "Echecde la commande
ssh"
31 return 1
n 32 ;;
Ë 33 *)
Ë 34 echo"Archive\
Æ /home/dhackup/Sannee/Smois/SficSurMachineCible
INVALIDE"
Ë: 35 return l
Ë 36 ;;
. 37 esac
Ë 38
Ê 39 return O
Chapitre5
Commentaires :
- Ligne9 : Le nom du fichier à transférerest reçuen paramètre(S1).
Ligne14 : Transfertde fichier sur la machinevenus,de manièrenon interactive.
Les commandesde sftp sont lues sur l&#39;entrée standard (option b et double
redirectionen lecture).L&#39;environnement
de travail a été paramétrépour que le
mot de passen&#39;ait
pas besoind&#39;être
fourni (cf. la commandesftp au chapitre
Les commandesfiltres Commandesréseau sécurisées).L&#39;identité sur la
machinedistanteest dbackup.
- Ligne20 : Si la commandesftp a échoué,la fonction retournele statut faux.
- Ligne 25 : Vérification(bZipZ -t) de la validité de l&#39;archivesur la machine
distante.
- Lignes27 à 37 : Test du code retourde ssh et bzip2.
- Ligne 28 : Si le code retour vaut 0, ssh et bzip2 se sont bien déroulées,
l&#39;archive
est valide.
- Ligne29 .-Si le coderetourvaut 255, ssh a échoué.
- Ligne33 : Si le code retourn&#39;est
ni 0, ni 255, l&#39;archive
est invalide.

La fonction isArchivelnvalide
Cette fonction reçoit une archivede type bz2 en argument,retournevrai si l&#39;ar-
chiveest invalide,faux dansle cas contraire.
41 # --
42 # Argument:nomde l&#39;achive
43 # Verification de la validite de l&#39;archive
44 # Retour : vrai si archive valide, faux dans le cas contraire
45 # --
46 function isArchiveInvalide {
47 typeset archivezsl
48 bzip2 -t Sarchive 2>/dev/null &&return 1
49 return 0
50 )

Programmaionsll
sousUnix/Linux
AsEects
avancés shell
dela Erorammation
LafonctiongetDate
La fonctiongetDate affichela datedu jour,au formataaaa_mm_jj.
51 #
52 # FonctiongetDate
53 # Fabriquela date au formataaaa_mm_jj
54 4+ --
55 functiongetDate{
55 date &#39;+%Y_%m_%d&#39;
57 }

LafonctiongetYear «\
LafonctiongetYear affichel&#39;année au formataaaa.
courante, a
58 # ----------------------------- --
59 # FonctiongetYear
60 # Fabriquel&#39;année au formataaaa
61 # --
62 functiongetYæar(
63 date &#39;+%Y&#39;
64 )

LafonctiongetMonth
La fonctiongetMonth affichele moiscourantau formatmm.
65 # ----------------------------- --
66 # FonctiongetMonth
67 # Fabriquele moisau formatmm
68 # --
69 functiongetMonth{
70 date &#39;+%m&#39;
reserved 71 }

rights
Lafonction
getDayForCaLcg!

EN/
Editions
-
AII Lafonction
getDayForCalcul
affiche
lejourcourant
sous
forme à1
numérique
ou2 chiffres.

sh,ksh,bsh
Chapitre5

0 Cette
valeur
étant
destinée
à fairedescalculs,
ilnefautpasdepréfixe
O(qui
signifienombreoctal pour certainescommandesde calcul), ni espace(qui n&#39;est
pas un caractèrenumérique).
72 4: --
73 # Fonction getDayForCalcul
74 # Fabrique le jour au format j ou jj
75 4l --
76 function getDayForCalcul{
77 date &#39;+%e&#39;
l sed &#39;s/
//&#39;
78 ]

0 Lacommande
sedestprésentée
auchapitre
Lacommande
sed.Lescomman-
des ssh et sftp sont présentéesau chapitreLescommandesfiltres.

Programmation shell sous Unix/Linux


A.

C.
B

D
Ü chapitre6 .Lesexpressions
reguiieres
Introduction. . . . . . . . . . . . . . . . . . . . 266
. Caractèrescommunsaux ERbet Ere. . . . . . . . . . 266

E Caractères
spécifiques
. Caractères
. Exploitation
auxERb. . . . . . . . . . . . 269
spécifiques
auxERe. .\.__.. . . . . . . . 269
desexpressions
régulières
parlescommandes
271
Chapitre6

A. Introduction
Ce chapitre présenteles caractèresspéciauxdes expressionsrégulières.Ce|les ci
sont utiliséespar un certain nombrede commandesUnix et fournissentun méca-
nismepuissantde sélectionde chaînesde caractères.
Lesexpressions régulièressont composéesde caractèresordinaireset de caractères
ayant une significationparticulière.Il existedeuxtypes d&#39;expressions
régulières:
- les expressions régulièresbasiques(ERb);
- les expressionsrégulièresétendues(ERe).
Les ERbsont utiliséespar les commandessuivantes:
vi (rechercheet substitution);
&#39;
915F;
&#39;
eXPr ;
- sed.
Les EResont utiliséespar les commandessuivantes:
- grep avec l&#39;option
-E, egrep ;
- awk.

B. Caractères communs aux ERb et Ere

Caractèrespécial Signification
" Débutde ligne
5B Fin de ligne
. Un caractèrequelconque
[liste de caractères] Un caractèrecité dans la liste
[Aliste de caractères] Un caractèrequi n&#39;est
pascité dans la liste
* 0 à n fois le caractèreou regroupement précédent
\< Débutd&#39;un
mot. Caractèrespouvantfaire partie
d&#39;un
mot : [A Za-z0-9 ]
\>expressionrégulière> Fin d&#39;un
mot

Programation
shellsos Unix/Linux
Lesexpressions
régulières

Caractèrespécial Signification
\c Protectiondu caractèrespécialc

Exemples

0 Lessymboles
L" et W9"utilisés
danslesexemples
représentent
lestouches
[espace]et [tabulation].

Expressionrégulière Signification
soleil Chaînecontenant"soleil".
Exemplesde correspondance :
Aujourd&#39;hui
il fait soleil, mais demain?
soleil toujoursl!
Passersesvacancesau soleil
"soleil Chaînecommençantpar "soleil".
Exemplede correspondance :
soleil toujours!!
soleils Chaînese terminantpar "soleil".
Exemplede correspondance :
Passersesvacancesau soleil.
[A Z][5-9].î Chaînecomposéede trois caractères: le premierest une
majuscule,le deuxièmeun chiffre comprisentre5 et 9,
le dernierun caractèrequelconque.
Exemplesde correspondance :
86a

reservad
rlghts
AI!
Z5*
"15 Chaînecomposéed&#39;un début de lignesuivi immédiate-
ment d&#39;une
fin de ligne. C&#39;est
donc une chaînevide.

ENI
Edltlons
"L4? ]*S Chaînecontenantentre O (chaînevide) et n caractères
(espaceou tabulation) espaceou tabulation.

sh, ksh, bash


Chapitre6

Expression régulière Signification


7..[O-79]A* Chaînecontenant le caractère 7, suivid&#39;un
espace,suivi
de n&#39;importe A 0 à n fois.
quelchiffresauf8, suivid&#39;un
Exemples decorrespondance :
x7 6
abc79Axy
7 1AAAAAAAAAAbbbbbbbb
[O 9]["A-Z_]3 Chaînedontl&#39;avant caractère
dernier estunchiffreet le
derniern&#39;est
ni unemajuscule ni uncaractère souligné.
Exemples de correspondance :
AZER1a
3*
890008b
\<tout Chaînecontenant unmotcommençant par"tout":
Exemples decorrespondance :
bonjour toutle monde
il fautdiretoutefois
Exemple de non-correspondance :
partoutdansle monde
\<tout\> Chaînecontenant le mot"tout":
Exemples decorrespondance :
bonjour toutle monde
Exemples de non-correspondance :
il fautdiretoutefois
partoutdansle monde
[O 9][O-9]\.[O-9] Chaînecontenant deuxchiffressuivisducaractère. suivi
d&#39;un
chiffre.
Exemple decorrespondance :
7892.89

0 Les AetSperdent
marqueurs leursignification
s&#39;ils
nesont
pasplacés
respec-
tivementendébutet enfin de l&#39;expression
régulière.

rogramatioshl sous
Uni/Linux
Lesexpressions
régulières

C. Caractères spéci ques aux ERb


Caractère
spécial Signification
\{m\} m foisle caractèreprécédent
\{m,\} au moinsm foisle caractèreprécédent
\{m,n\} Entrem et n foisle caractère
précédent
\(ERb\) Mémorisation d&#39;une
ERb
\1, \2, Rappelde mémorisation

0 Dans
lesERb,lecaractère
"\"donne
unesignification
spéciale
auxparenthèses
et accolades.

Exemple

|[0-9]\{5\}| Chaîne
contenant à cinqchiffres
unnombre entouré
par
deuxbarresverticales.
Exempledecorrespondance :
routedeVaux| 89000 |Auxerre
|38350|La Mure

Desexemples
desubstitution
sontdonnésauchapitreLacommande
sed.

D. Caractères spéci ques aux ERe


È
l)
Caractère
spécial Signification
Ë ? 0 ou 1 foislecaractère
ouregroupement
précédent
2
E, + 1 à nfoislecaractère
ouregroupement
précédent
Ë {m} m foisle caractère
précédent
Ë {m,} aumoins
mfoislecaractère
précédent
{m,n} Entrem et n foisle caractère
précédent
Ë (er1) Regroupement
©

h, ks,h
Chapitre
6

Caractèrespécial Signification
er1ler2|er3 Alternatives

0 DanslesERe,lesaccolades
et parenthèses
perdent
leursignification
spéciale
si
ellessont précédéesd&#39;un
antislash.

Exemples
ER Signification
[+ ].7[0 9] +5 Chaîne
représentant
un nombreentierlau moins1
chiffre)éventuellement
précédéd&#39;un
signe(Oou 1
fois)
Exemplesde correspondance :
2
-56
+235
789654
\l [0-9]{5}\I Chaînecontenantun nombreà cinq chiffresentouré
par deuxbarresverticales.
Exemplesde correspondance :
routede Vaux| 89000 |Auxerre
|38350|La Mure
\{[0 9]{2}\}5 Chaînese terminantpar deuxchiffresentouréspar
deuxaccolades.
Exemplesde correspondance :
note1{23}
{78}
"truc |choses Chaînecommençantpar "truc"ou finissantpar
"chose".

Programmaion
shellsos Unix/Lnux
Lesexpressions
régulières

i ER Signification
A(truclchose)+3 Chaînecomposéede 1 à n occurrencesde "truc"ou
de "chose".
Exemplesde correspondance
:
truc
chose
trucchosetruc
chosechose

E. Exploitation des expressions régulières


par les commandes
1. La commande vi

Les ERb sont utilisablesdans l&#39;éditeur


vi pour la rechercheet la substitutionde
chaînesde caractères.

Syntaxe

Recherche
(mode
commande)
:

AII
riant:
rasarved
/expression-régulière&#39;basique
Substitution(modeex) :
:[adresse[,adresse]]s/expression régulière-basique/
expression de remplacement/[flags]

ENI
EdIt/ons
-
Des exemplesde substitutionsont donnésau chapitre La commandesed avec la
commandesed qui utilise la mêmesyntaxeque l&#39;éditeur
vi.

0
Chapitre
6
2. La commande grep
Ce paragrapheillustre l&#39;utilisation
des expressionsrégulièresau traversde la com-
mandegrep normaliséepar POSlX.Utiliséeavec l&#39;option -E, la commandecom-
prendles expressionsrégulièresétendues.
Syntaxede base
grep [-iv...] expression-régulière-basique [ ficl .... ]
grep [ iv...] -E expression régulière étendue [ fiel .... ]

0 Lacommande
greputilisée
avecl&#39;option
-E remplace
lacommande
egrep.
Pourles autresoptions,se reporterau manuelde la commande.

Exemples
Voici
lefichier
tel2.
txt
:
S cat tel2.txt
JoyeuxGisellell2. rue de la Sourcel89290lVaux|45.26.28.47
DehautOlivierl3 rue de Pussenvall75020lParis|78.25.96.78
KaramaJosette|256 rue de la tempete|56l0O|Lorient|85.26.45.58
Zanouri Joel|45/48 boulevard du Gardl56100|Lorient|85/56/45/58
Gron Pierrel89 90 rue du chateau|38350|LaMurel78.2l.23.69
Grival Zoel3, rue du chateau|38350|LaMurel78.21.78.69
S
Recherchede la chaîne"Iorient"en majusculesou minuscules:
S grep -i 1orient&#39;
te12.txt
KaramaJosettel256 rue de la tempete!56100|Lorient|85.26.45.58
Zanouri Joel]45/48 boulevard du Gardl56100|Lorient|85/56/45/58
S
Recherchedes lignescommençantpar la lettre &#39;K&#39;
.-
S grep &#39;tel2.txt
K&#39;
KaramaJosette[256 rue de la tempetel56l00lLorientl85.26.45.58
Lesexgressions
régulières
Recherchedeslignesse terminantpar 8 :
S grep &#39;85
tel2.txt
DehautOlivier|3 rue de Pussenval|75020]Paris|78.25.96.78
KaramaJosette|256 rue de la tempetel56100|Lorienti85.26.45.58
Zanouri Joell45/48 boulevard du Gard|56100|Lorient]85/56/45/58
S
Recherchedeslignespossédantdeuxoccurrencessuccessivesde la lettre f :
S grep &#39;rr
tel2.txt
GronPierre|89A9Orue du chateau|38350|LaMurei78.21.23.69
Mêmechoseen utilisant une ERb.-
S grep r\{2\)&#39;
te12.txt
GronPierre|89-90 rue du chateau\38350|LaMurel78.21.23.69
Mêmechoseen utilisant une ERe.-
S grep &#39;r\(2\l&#39;
te12.txt
GronPierre\89 90 rue du Chateau|38350\La
Mure|78.21.23.69
S
Afficher toutesles lignesqui ne sontpas blanches.-

S grep -v &#39;*[-çâ]*S&#39;
tel2.txt
JoyeuxGiselle|12. rue de la SourceI89290iVaux]45.26.2B.47
DehautOlivier|3 rue de Pussenval|75020lParis!78.25.96.78
KaramaJosette|256 rue de la tempete|56l00lLorient|85.26.45.58
Zanouri Joeli45/48 boulevard du GardI56100|Lorient|85/56/45/58
GronPierre]89-90 rue du chateau}38350|LaMure|78.2l.23.69
Grival Zoe|3, rue du chateau|38350|LaMure|78.21.78.69

rlghts
All
resarved
O Uneligneblanche
d espaces
peutêtreunelignevideouunelignecontenant
ou de tabulations.
unesuite

Edltions
ENI
-
©

h, ksh,bash
Chapitre6
Afficher les lignes contenantles chaîneslori ent ou vaux (majusculeset mi-
nusculesconfondues):
S qrep -iE &#39;lorient|vaux&#39;
te12.txt
JoyeuxGisellellz. rue de la Sourcel89290lVauxl45.26.28.47
KaramaJosettel256 rue de la tempetel56100|Lorient|85.26.45.58
Zanouri Joell45/48 boulevard du Gardl56100|1orient|85/56/45/58
S

3. La commande expr

Syntaxe
expr chaîne de caractères: expression-régulière-basique
Cettecommandeproposeun opérateur":" qui permetde mettreen correspondance
unechaînede caractèresavecuneexpressionrégulière.
Fonctionnement de l&#39;opérateur
":" :
Le nombrede caractèresde chaîne-de-caractères correspondantà I ERb
expression-régulière-basique est affichéà l&#39;écran.
- Si chaîne de caractères correspond à expression-régulière-
basique, la commanderetourneun codevrai. Elle retourneun codefaux dans
le cascontraire.
régulièreest comparéepar rapportau début de la variable(le n/xu
- L&#39;expression
est implicitedans I ERb).
- Si une partie de l&#39;expression
régulièreest mémoriséeavec\( \), la commande
affichesur le terminalla portionde la chaînecorrespondante.

Exemples
Vérifierque l&#39;utilisateur
a saisi un nombre:
S read nbl
250

Sread
nb2
a8
Lesexgressions
régulières
La variablenbl contientuniquementdeschiffres :
S expr "Snbl" : # équivalent à &#39; [0
[O 9]
9]*S&#39;
3
&#39;[0&#39;9]
[0-9]*S&#39;
Secho
S?
0
La variablenb2 contient au moins 1 caractèrequi n estpas un chiffre. L&#39;ERb
n&#39;est
pas satisfaite:
S expr "Snb2" : &#39;[0 9][O-9]*S&#39;# équivalent à &#39; [0 9][0-9]*S&#39;
Ü
S echo S?
1
Compterle nombrede caractèrescontenusdansune variable:
S ligne="JoyeuxGise1le|12 rue de la Source]89290|Vaux|45.26.28.47"
S expr "Sligne" : &#39;.*&#39;
57
Afficherla partiedela chaînecorrespondant
à la mémorisation
(ici le codepos-
tal) :
S expr "Sligne" I &#39;-*|\([0-9]\{5\}\)&#39;
89290

All
rights
reserved
Commele montrela figure 1, le caractère* est gourmand.-il recherchetoujours
la chaînela plus longue(ici le "l" le plus à droite) .-
S expr "Sligne" : &#39;\(.*\)
l &#39;

ENI
Éditions
- JoyeuxGiselle|l2 rue de la Source|89290lVaux

3Bexpr "Sligne" &#39;\(.*\)|&#39;

© JoyeuxGise||e|12rue de la Source|89290hlau><
I __|
\<,*\> &#39;
Chaitre 6
Solutionpermettantde s&#39;arrêter
au premier"l" (cf. Figure2) :
S expr "Sliqne" = &#39;\(["|]*\)|&#39;
JoyeuxGiselle
S

Sexwîligne" : &#39;\(["l]*\)l&#39;

JoyeuxGise||e|12ruedelaSource|89290|Vaux
ure:
\([ l]*\) l

Figure2 : Récupérerla chaînela plus courte


Le script testnb.shteste si la saisie correspondà un nombrepositif ou négatif.
Dansfaffirmatif, il effectuela sommedesnombressaisis.

Snl testnb.sh
1 #1/usr/bin/sh
2 somme=O
3 while :
4 do
5 echo "Saisir un nombreentier: \c"
6 if read nombre
7
8 then
9
if ( expr"Snombre"
: [0-9][D-9]*S&#39;
Il \
expr "Snombre": &#39;-[0-9][0-9]*S&#39;)
> /dev/null
10 then
11 somme= expr Ssomme + Snombre
12 else
13 echo "Saisie incorrecte"
14 fi
15 else
16 break
17 fi
18 done
19 echo "Resultat: Ssomme"
Lesexpressions
régulières
0 L&#39;antislash
enfindeligne8 permet
demasquer
lecaractère
"saut
deligne"
pour pouvoirécrire la commandesur deux lignes.L&#39;affichage
de la commande
expr est éliminécar ici, c&#39;est
le codede retourqui est exploité.
S testnb
Saisir un nombreentier: 1
Saisir un nombreentier: 8000
Saisir un nombreentier: -10
Saisir un nombreentier: 2
Saisir un nombreentier: aaa
Saisie incorrecte
Saisir un nombreentier: "d
Resultat: 7993
3

4. sed et awk

Les outils sed et awk seront présentésrespectivementaux chapitres La com-


mandesed et Le langagede programmation awk.

A/l
morvod
rlght:
EN/
EdIl/ons
-
®

sh,ksh,bash
Û Chapitre7: Lacommande
sed
A. Utilisation de la commande sed . . . . . . . . . . . . 280

B. Exemples. . . . . . . . . . . . . . . . . . . . . 282
A. Utilisation de la commande sed
La commandesed (streameditor) est un éditeurde texte non interactif. Elle per-
met d&#39;automatiser
le traitementde fichierstexte. Ce chapitreprésenteles principa-
les fonctionnalitésde la commande.

Syntaxede base
sed [-n] action { ficl ... ]
sed [-n] -e actionl [ e action2 ... ] [ ficl ...]
sed -f script sed [ ficl ... ficn ]
Les actionsspécifiéesserontexécutéessur chaqueligne du fichier. Le résultatdu
traitementest affichésur la sortie standard.Si plusieursactionssont spécifiéessur
la lignede commande,chacunedoit être précédéede l&#39;option -e.

0 Lacommande
sednemodi epaslefichierd&#39;origine.

Syntaxe
d&#39;une
action
[adresse[,adresse]]commande[arguments]
Uneactionest syntaxiquement composéede :
une partie adressequi permetde spécifiersur quelles lignesdoit s&#39;effectuer
la
commande;
- la commandeà exécuter;
- les argumentsde la commande.

Yêyntaxe
d&#39;une
adresse

Typed&#39;adresse Lignestraitées
Aucuneadresse Toutesles lignes.
Adressesde type 1
n Lignen.
æ Dernièreligne.
/ERb/ Lignescorrespondant
à l&#39;expression
régulière.

Programatonell ous ix/Linux


La commandesed

Typed&#39;adresse Lignes
traitées
Adresses
detype2
n1,n2 Lignen1 jusqu&#39;à
lignen2.
/ERb1/,/ERb2/ Lapremière
lignetraitée
serala première
trouvée
corres-
pondantà ERb1. Letraitement
se poursuivra
surtoutes
leslignesjusqu&#39;à
ce quesedrencontre
unelignecorres-
à ERb2.Cettedernière
pondant seraégalement
traitée.

Syntaxede la commande

Commande Argument Typed&#39;adresse Signification


supporté
(maximum)
d Aucun 2 Ne pas afficherles lignes
spécifiées
(delete).
p Aucun 2 à l&#39;écran
Afficher leslignes
spécifiées
(print).
s 2
Srb/remplacement/[g] Effectuerune substitution
sur les lignes spécifiées
(substitute).
w fichier 2 Écrireles lignesspécifiées
dansunfichier(write).
= Aucun 1 Afficherle numérode la
lignespécifiée.
Danslescommandes
ci-dessous,
Pantislash
rendle caractère
"sautde ligne"invi-

reserved
rlghts
All
sible,cequipermet
depouvoir
spécifier
plusieurs
lignes
detexte.Ledernier
saut
delignen&#39;est
pasmasqué
etreprésente
lafindelacommande.
a\ texte\.J 1 Ajouterles lignesde texte
texte\__l aprèschaque
lignespécifiée
texte.J (adm-
- i\
ENI texte\..l 1 Insérerles lignesde texte
textep avant
chaque
ligne
spécifiée
Ed/tlons
©
teXteJ (insert).

sh,ksh,bash
Chapitre7

Commande Argument Typed&#39;adresse Signification


supporté
(maximum)
c\ texte\._| 2 Remplacerles lignesspéci-
textep fiéesparleslignes
detexte
teXteJ (change).
Négation
de la commande
lcommandeLacommande s&#39;exécutera
surtoutesleslignessaufcellesspécifiées
dansl&#39;adresse.

B. Exemples

1. Utilisationde seden lignede commande

0 Lessymboles
L"et"<9"
utilisés
dans
lesexemples
représentent
lestouches
"espace"
et "tabulation".

Voicile contenudufichierquiserautilisédanslesexemples
ci-dessous
:
S cat te12.txt
JoyeuxGisellellz. rue de la Sourcel892901Vauxl45.26.28.47
DehautO1ivier|3 rue de Pussenvall75020lParis|78.25.96.78
KaramaJosette|256rue de la tempetel56100lLorient|85.26.45.58
ZanouriJoel|45/48 boulevarddu Gard]56100ILorientl85/56/45/58

GronPierrel89-90 rue du chateau|38350|La


Murel78.2l.23.69
Grival Zoe|3, rue du chateaul38350|La
Mure|78.2l.78.69
S

Proammionhellsous
Unix/Linux
La commande sed

a. La commanded (delete)
La commanded permetde ne pas afficherà l&#39;écran
les lignessélectionnées
par la
partieadresse.

Exemple
Ne pas afficher les lignes blanches:
s sed &#39;/A[_*°*s/a&#39;
te12.txt
JoyeuxGiselle|12. rue de la Sourcel89290|Vaux|45.26.28.47
DehautOlivierl3 rue de Pussenvall75020lParisi78.Z5.96.78
KaramaJosettel256 rue de la tempetel56100|Lorient|85.26.45.58
Zanouri Joel|45/48 boulevard du Gardl56100lLorientI85/56/45/58
GronFierre|89-90 rue du chateaul38350|LaMure|78.2l.23.69
Grival Zoe|3, rue du chateaul38350iLaMureI78.21.78.69
S

0 Uneligneblanche
peutêtreunelignevideouunelignecontenant
unesuite
d&#39;espaces
ou de tabulations.

b. La commandep (print)
La commandep permet d&#39;afficher à l&#39;écran
les lignes sélectionnéespar la partie
adresse.Par défaut, sed affiche égalementtout le contenudu fichier. Pour mo-
difier ce comportement,il faut utiliser l&#39;option
n.

Exemple
Afficher les lignes 1 à 2. Par défaut, sed affiche en plus tout le contenu du
fichier. Leslignes demandéesapparaissentdonc en double:

All
reservacl
rlghls
S sed &#39;l,2p&#39;
tel2.txt
JoyeuxGisellellz. rue de la Sourcel89290|Vauxl45.26.28.47
JoyeuxGiselle]12. rue de la Sourcel89290|Vaux|45.26.28.47
DehautOlivier|3 rue de Pussenvall75020|Parisl78.25.96.78

Éditions
ENI
-
DehautOlivierl3 rue de Pussenvall75020|Paris|78.25.96.78
KaramaJosettel256 rue de la tempetel56l00|Lorient|85.26.45.58
Zanouri Joel]45/48 boulevard du Gardl56100|Lorient|85/56/45/58

sh, ksh, bash


Gron Pierre|89-90 rue du chateau|38350|LaMurel78.21.23.69
Grival Zoe|3, rue du chateaul38350|LaMurel78.21.78.69
S
L&#39;option
-n spécifie à la commandesed de ne pas réaffichertout le fichier :
S sed -n &#39;1,2p&#39;
tel2.txt
JoyeuxGisellell2. rue de la Source]89290lVaux|45.26.28.47
DehautOlivierl3 rue de Pussenvall75020lParisl78.25.96.78
S

c. La commandew (write)
La commandew permet d&#39;écriredans un fichier les lignes sélectionnéespar la
partie adresse.Comme pour la commandep, sed affiche égalementtout le
contenudu fichier à l&#39;écran.
Pour modifierce comportement,il faut utiliser l&#39;option
n.

Exemple
Stockerdans le fichier dpt_56 toutes les personneshabitant le Morbihanet dans
le fichier dpt_89, toutesles personneshabitant dans I&#39;Yonne.
L&#39;option
e précède
chaqueaction :
S sed -n -e &#39;/AiA|]*|["l]*l56/w
dpt_56
-e / [ l]*|["|]*l89/w dpt_89&#39;
tel2.txt
S cat dpt_56
KaramaJosette|256 rue de la tempetel56100lLorient|85.26.45.58
Zanouri Joel|45/48 boulevard du Gardl56100lLorient|85/56/45/58
S cat dpt_89
JoyeuxGiselle|12. rue de la Sourcel89290lVauxl45.26.28.47
S

d. Négationd&#39;une
commande(l)
Le caractère! placédevantla commandepermetd&#39;exécuter cette dernièresur tou-
tes les lignessauf sur cellescorrespondant
à la partieadresse.

Programmtion
sell sousix/Lnu
La commande sed

Exemple
Ne pas afficher les lignesblanches(en utilisant la négation).-
S sed n &#39;/A[._.° >]*S/!p&#39;
tel2.tx c
JoyeuxGiselle|12. rue de la Sourcel89290|Vaux|45.26.28.47
DehautOliVierI3 rue de Pussenvall75020|Paris]78.25.96.78
KaramaJosettel256 rue de la tempetel56100lLorient!85.26.45.58
Zanouri Joel|45/48 boulevard du Gardl56l00lLorientl85/56/45/58
GronPierrel89 9Orue du chateau\38350|LaMure|78.2l.23.69
Grival ZoeJ3,rue du chateaul38350|LaMure|78.21.78.69
S

e. La commandes (substitution)
La commandes permetde substituerune chaînede caractèrespar une autresur
les lignessé|ectionnées
par la partieadresse.

Premierexemple
Travaillersur le contenud&#39;une
variable:
S echo sarg
userl,user2,user3
S echo Sarg | sed &#39;s/,/
/9&#39;
userl user2 user3
S 1iste_users=S(echoSarg | sed &#39;s/,/
/g )
S echo S1iste_users
userl user2 user3
S for user in S1iste_users
> do
> ...

A/I
r/ahts
reaervad
Deuxièmeexemple
Le caractère"&" utilisé dansla partie remplacementreprésentela chaînecorres-
pondantà l&#39;expression
régulière(cf. Figure1) :

Edlt/ona
ENI
-
S echo Sligne
JoyeuxGiselle|l2. rue de la Sourcel89290lVauxl45.26.28.47
S echo Sligne | sed s/.*/(G)/&#39;
(JoyeuxGiselle!12. rue de la Sourcel89290|Vaux|45.26.28.47)
S
0

sh, ksh, bash


Chapitre7

s echoÇligne| sed&#39;s.-*.*f(&).æ"

Expression
régulière".*":
JoyeuxGise||e|12.rue de la Source[8929E||UauxI45.26.2B.47
- *

Expressionde remplacement
"(â)":
(JoyeuxGise||e|12.
ruedela Source|8929D|Uaux|45.26.2S.47)

( & )

Figure1 : Utilisationde la substitutionet du caractèrespécial "&"

Troisièmeexemple
Insertionde la chaîne "O2."devant le numérode téléphonedes personneshabi-
tant le Morbihan.Deuxmémorisations(cf. Figure2) ont été faites dans l&#39;expres-
sion régulière et sont rappeléesdans la deuxièmepartie grâce aux références
arrière l1 et l2.
S sed &#39;s/"\([ |]*|["i]*|56---|[Ai]*|\)\(.*\)S/\102.\2/&#39; telltxt
JoyeuxGiselle[l2. rue de la Source|89290|Vauxl45.26.28.47
DehautOlivier}3 rue de Pussenval|75020|Paris|78.25.96.78
KaramaJosettei256 rue de la tempete\56100|Lorient\02.85.26.45.58
Zanouri Joel|45/48 boulevard du Gardi56100|lorienti02.85/56/45/58
Gron PierreJ89-90 rue du chateau\38350\LaMure|78.2l.23.69
Grival Zoe|3, rue du chateau|38350|LaMure\78.21.78.69
S

Programation
ell sousni/Lnx
La commande sed

&#39;s/"\(["|]*
i["l] |56---l["|]* |\)\(-*\)515/\102.\2/&#39;

Expression
régulière:
" ["|]* | ["|]* l56-. . l["|]*| 3" S

\(mérnU1\) \(mémo2\)

Expression
deremplacement:
Karama
Josette|256
ruedelatempete|5610U|Lorient|
85.26.45.58
\1 02. \2

Figure2 : Insertiond&#39;une
chaîneentredeuxsous-chaînes

2. Script sed
Unscriptsedestunfichiertextecontenant
unesuited&#39;actions
sed quiserontexé-
cutéessur les lignesd&#39;un
fichier de données(ou sur les donnéesde l&#39;entrée
stan-
dardle caséchéant).
Toutesles actionsserontexécutéesd&#39;abord
sur la premièreiigne du fichier, puis
sur la deuxième,etc. Lorsquela partieadressen&#39;est
passpécifiée,les actionssont
appliquéessur toutesles lignes.

Exemple
riahil
Ail
rucrvnd
Snlscript.sed
ENI
Edltlonl
- 1
2
3
4
/c if" 1*s/a
li\
Liste des Clients:
S/ \([ |]*|["|]*|55---l["i]*l\)\(.*\)S/\102.\2/
o 5 s/*\<[ |]*|["|]*|89...i[ i]*l\)\(.*\)S/\l03.\2/
6 s/ \([Al]*|[*|]*l75...i[ i]*1\)\(.*\)S/\101.\2/
7 s/A\([ i]*|[ |]*l38...|[Ai]*|\)\(.*\)S/\104.\2/
8 s/\(..\)\/\(..\)\/\(..\)\/\(..\)S/\l.\2,\3.\4/
Chapitre7
11 Bye ...

- Ligne1 : Si la ligneest blanche,ne pas l&#39;afficher


;
- Ligne2 : Insérerla phrasecitée en ligne3 au-dessusde la ligne 1 ;
- Ligne 4 : Insérer O2. devant le numéro de téléphone lorsque la personne
demeuredans le Morbihan;
- Ligne 5 : Insérer 03. devant le numéro de téléphone lorsque la personne
demeuredans l&#39;Yonne
;
- Ligne 6 : Insérer 01. devant le numéro de téléphone lorsque la personne
demeureà Paris ;
- Ligne 7 : Insérer 04. devant le numérode téléphonesi la personnedemeure
dans
l&#39;lsère
;
....
- Ligne8 : Remplacerles "/" des numérosde téléphonepar des . ;
- Ligne9 : Ajoutersous la dernièrelignedu fichier (35),les deux phrasescitéesen
ligne9 et 10.
S sed -f script.sed tel2.txt
Liste des Clients:
JoyeuxGiselle|12. rue de la Sourcel89290lVauxlO3.45.26.28.47
DehautOlivier|3 rue de Pussenval|75020|Parisl0l.78.25.96.78
KaramaJosette|256 rue de la tempetel56100|Lorient|02.85.26.45.58
Zanouri Joell45/48 boulevard du Gardl56100lLorient|O2.85.56.45.58
Gron Pierrel89 90 rue du chateau|38350|LaMure|O4.78.21.23.69
Grival Zoe|3, rue du chateaul38350|LaMurelO4.78.21.78.69
Fin du traitement
Bye
S
0 Chapitre8 : Lelangage
de programmation awk
Principe. . . . . . . . . . . . . . . . . . . . . . 290

FPFF
. . . . . . . . . . . . . . . . . . . . . 298
Opérateurs
La fonctionprinlf . . . . . . . . . . . . . . . . . . 300
Redirections . . . . . . . . . . . . . . . . . . . . 301

Lecturede la lignesuivante: next. . . . . . . . . . . 303


Structures de contrôle . . . . . . . . . . . . . . . . 304

Terminerun script . . . . . . . . . . . . . . . . . 306


Tableaux . . . . . . . . . . . . . . . . . . . . . 307

Lesargumentsde la lignede commande. . . . . . . . 310


Fonctionsintégrées. . . . . . . . . . . . . . . . . 312

F?!
Fonctions utilisateur. . . . . . . . . . . . . . . . . 319

Exemplesde scripts. . . . . . . . . . . . . . . . . 321


Chapitre8

A. Principe
Le langagede programmationawk est un outil adapté au traitement de fichiers
textes. Il permetd&#39;effectuer
des actionssur des enregistrements
de donnéeséven-
tuellementstructurésen champs.Le nom "awk"a pour origineles initialesdu nom
de chacunde ses auteurs:Aho, Weinbergeret Kernighan.Ce chapitreprésenteles
principalesfonctionnalitésdes versionsrécentesdu langageawk, appeléesnawk
(new awk) sur certainesplates-formesUnix. Sous Linux, la commandeawk est un
lien symboliquevers l&#39;interpréteur
gawk (GNUAwk).

1. Syntaxe
awk [ F] &#39;
(action-awk) [ ficl . . . ficn ]
awk [ F] f script-awk [ ficl ficn ]
La commandeawk prenden argumentla liste des fichiers à traiter. En l&#39;absence
de nomsde fichiers sur la ligne de commande,awk travaillesur les donnéesarri-
vant sur son entréestandard.Cettecommandepeut donc être placéederrièreun
tube de communication.

2. Variables spéciales
a. Variablesprédéfiniesdès le lancementde awk
Le tableausuivant présenteles principalesvariablesinternesdu langageawk pré-
sentesen mémoiredès le lancementde la commande.La valeur de ces variables
peut éventuellementêtre modifiéeen fonctionde la structuredes donnéesà traiter.

Nom de la variable Valeur par défaut Rôlede la variable


RS Newline(\n) RecordSeparator: Caractèresépara-
teur denregistrement
(lignes).
FS Suited&#39;espaces
et/ou FieldSeparator: Caractèressépara-
tabulations teurs de champ.
OFS Espace OutputFieldSeparator: Séparateur
de champutilisé pour l&#39;affichage.
ORS Newline(\n) OutputRecordSeparator: Caractère
séparateurd&#39;enregistrement
en
sortie.

rogramaon Vshellsousnxinux
Le langage
de programmation
awk

Nom de la variable Valeur par défaut Rôlede la variable


ARGV Tableauinitialiséavecles arguments
de la lignede commande(optionset
nom du script awk exclus).
ARGC - Nombred&#39;éléments
contenusdans le
tableauARGV.
ENVIRON Variablesd environne Tableaucontenantles variablesd&#39;en-
ment exportéespar le vironnementexportéespar le shell.
shell
Par défaut, un enregistrement
corresponddonc à une ligne (suitede caractèrester
minéepar "\n").

0 Lorsque
lavariable
FSestinitialisée
avecunminimum
de2 caractères,
cette
valeurest interprétéecommeune expressionrégulière.

b. Variablesinitialiséeslors du traitementd&#39;une
ligne
Lesenregistrements sont traités successivement.
L&#39;enregistrement
courantest auto-
matiquementdécoupéen champset un certain nombrede variablesinternesawk
sont alors initialisées.Le tableausuivantdonnela liste des principalesvariables.

Nom de la variable Valeurde la variable


S0 Valeurde l&#39;enregistrement
courant.
NF Numberof Field : Nombrede champsde l&#39;enregistre-
ment courant. &#39;
3151
82 RNF S1 contientla valeurdu l" champ,E52la valeurdu
2ème, ..., et SNF la valeurdu dernierchamp(NF est

reaervod
NR
remplacépar sa valeur).
Number: indicede l&#39;enregistrement
courant(NR vaut
AII
rlghta 1 quand la 1ère ligneest en coursde traitement,puis

Ed/t/ons
ENI
-
s&#39;incrémente
dès que awk changed&#39;enregistrement).
FNR File Number: Indicede l&#39;enregistrement
courantrelatif
au fichier en coursde traitement.
FILENAME Nom du fichier en coursde traitement.
o

sh,kshbash
Chapitre8

0 Contrairement
auxvariables
dushell,
lesymbole
"s"desvariables
awks1,s2,
etc. fait partiedu nom des variables.

c. Exemplessimples

Premierexemple
S ps -ef | awk &#39;{print
51,58)
lci awk travaillesur le résultatde la commandeps -ef. La partie écrite en ita-
lique représentel&#39;action
que awk doit exécutersur chaqueligne. Les simplesquo-
tes sont indispensablespour empécherle shell d&#39;interpréter
les caractèresdestinés
à la commandeawk. Les instructionsdoivent être placéesentre accolades.La
fonction intégréeprint va afficher à l&#39;écran
les champs 1 et 8 de chaqueligne
(correspondant ici au propriétaireet nom de chaqueprocessus).
Résultatde la commande.-
S ps -ef | awk &#39;{print
51,58)
UID CMD
root init
root /usr/bin/gdm
root /usr/bin/gdm
gdm/usr/bin/gdmlogin
gdm/usr/bin/xsri
root /usr/sbin/sshd
christie -bash
christie ps

Deuxièmeexemple
La fonction print peut égalementprendre des chaînesde caractèresen argu-
ment:
S ps -ef | awk &#39;{print
"User: " , S1 , "\tcommande:" , S8)
User: UID Commande:CMD
User: root Commande:init
User: root Commande:/usr/bin/gdm
User: root Commande:/usr/bin/gdm
User: gdm Commande:/usr/bin/gdmlogin

Progrmmtion
shellsousnix/Linx
Lelangagedeprogrammation
awk
User: gdm Commande:/usr/bin/xsri
User: root Commande:/usr/sbin/sshd
User: christie Commande:ebash
User: christie Commande: ps
S

0 \t représente
lecaractère
tabulation.
Troisièmeexemple
Voicile fichier texte tel3.txt qui va être traité par awk. Leschampssont séparés
par le caractère"|" :
S est tel3.txt
JoyeuxGisellellz. rue de la Sourcel89290lVauxl45.26.28.47
Dehaut0livierl3 rue de Pussenval|75020lParis|78.25.96.78
KaramaJosettel256 rue de la tempetel56100|Lorient|85.26.45.58
Zanouri Joell45/48 boulevard du Gardl56100|lorient|85/56/45/58
GronPierrel89 90 rue du chateau|38350|LaMure|78.2l.23.69
Grival Zoe|3, rue du chateaul38350lLaMure|78.2l.78.69
S
Modificationdu séparateurde champ(option F), affichagedu numérode ligne
et du nom du client .-
S awk-F&#39;|&#39;
&#39;{print
"Ligne: " , NR, "Client : " , S1) tel3.txt
Ligne: 1 Client : JoyeuxGiselle
Ligne: 2 Client : DehautOlivier
Ligne: 3 Client : KaramaJosette
Ligne: 4 Client : Zanouri Joel
Ligne: 5 Client : GronPierre
Ligne: 6 Client : Grival Zoe

r/ghts
AII
reserved
S

0 Silafonction
print nereçoitpasd&#39;argument,
elleaffiche
S0.

ENI
Éditions
-
3. Critères de sélection

ll estpossible
desélectionner
lesenregistrements
surlesquels
l&#39;action
doitêtreexé-
cutée.
©

sh,h, bash
Chapitre8

Syntaxe
awk [ F] critère {action-awk}&#39;
[ ficl ... fion 1
Le critèrede sélectionpeut s&#39;exprimer
de différentesmanières.

a. Expressionsrégulières
Lesenregistrements
à traiter
peuvent
êtresélecticÿnés
enutilisant
lesexpressions
régulièresétendues.

Premierexemple
Afficher les lignesdu fichier tel3.txt contenantau moins un "/" :
S awk -F&#39;|&#39;
&#39;/[/]/
{print S0) tel3.txt
Zanouri Joell45/48 boulevard du Gardl56l00|lorientl85/56/45/58
5

0 Pardéfaut,
lecritère
estmisencorrespondance
avec80.
Il est possiblede mettre un champ particulieren correspondanceavec une expres-
sion régulière.Dans ce cas, il faut utiliser l&#39;opérateur
de concordance(N) ou de
non-concordance (b).

Deuxièmeexemple
Afficher les clients localisésdans le Morbihan:
S awk -F&#39;l&#39;
S3 N / 56/ {print S0}&#39;
tel3.txt
KaramaJosettel256 rue de la tempetel56100lLorient|85.26.45.58
Zanouri Joell45/48 boulevard du Gardl56lOOllorient|85/56/45/58
Afficher les clients qui ne sont pas localisésdans le Morbihan.-
S awk -F&#39;l&#39;
S3 !« /A56/ (print S0) tel3.txt
JoyeuxGiselle|12. rue de la Sourcel89290lVaux|45.26.28.47
DehautOlivier|3 rue de Pussenvall75020lParisl78.25.96.78
Gron Pierrel89-90 rue du chateaul38350|LaMurel78.2l.23.69
Grival Zoel3, rue du chateaul38350lLaMure|78.2l.78.69
S

Arograation shellsos UiLinux


Lelangagede programmation
awk

b. Testslogiques
Lecritèrepeutêtreuneexpression
composée
d opérateurs
et renvoyant
la valeurde
véritévrai ou faux.

Opérateurs
detests
courants
Opérateur Signification
Inférieur

VAVA
Supérieur
Inférieurou égal
Supérieurou égal
Testd&#39;égalité
!= Test d&#39;inégalité
N Correspondance avecune expressionrégulière
Non-correspondance avecune expressionrégulière

Illl
! Négation
&& Et logique
l| Ou Logique
(expression) Regroupement

Al/
neserved
rlghts
ENI
Exemple
- Afficher le nom et le téléphonedes clients des lignes 1 et 2 :

Edltlons
S awk -F&#39;|&#39;
&#39;NR
== 1 Il NR== 2 {print
JoyeuxGiselle - 45.26.28.47
© DehautOlivier > 78.25.96.78
S1, " - " , S5) te13.txt

S
Chapitre8
c. Intervallesde lignes
Traitementdes lignes 2 à 4 .-
S awk -F&#39;|&#39;
&#39;NR
== , NR== 4 {print S1, " - " , S5) tel3.txt
DehautOlivier a 78.25.96.78
KaramaJosette - 85.26.45.58
Zanouri Joel 85/56/45/58 //
s /

4. Structure d&#39;un
script awk
Lorsqu&#39;il
y a un certain nombre d&#39;actions
à réalisersur les données,il est plus
confortabled&#39;écrire
un script awk. Un script awk peut contenirune sectionBEGIN,
une sectionEND,et 0 à n sectionsintermédiaires.Toutesectionest facultative.

a. BEGIN
La section BEGINest exécutéeavant traitement du premier enregistrementdes
données.Elle est utiliséeessentiellement
pour initialiserle contexted&#39;exécution.

h. Sectionsintermédiaires
Il peut y avoir plusieurssectionsintermédiairesqui seront exécutéessur chaque
enregistrement.
c. END
La section END est exécutéeaprèstraitementdu dernierenregistrementdes don-
nées.Elleest utiliséepour exploiterles résultatsissusdu traitementdes données.

d. Commentaires
Un commentairecommencepar le caractère"#" et se termineau caractère"\n" (fin
de la ligne).
e. Variables
Le développeurpeut créer ses propresvariables. Une variable est définie dès
qu&#39;elle
est initialiséeet n&#39;a
pas besoind&#39;être
typée. L&#39;utilisation
d&#39;une
variablequi
n&#39;a
jamais été définie a pour valeur 0 dans un contextenumériqueet chaînevide
dansun contextede chaîne.

Pogrmatio sell sousUnix/Linu


Le Ianae de ro ammationak

f. Exemple
x Snl script1.avk
1
2
3

4
5
6
7

8
9
10
11

12
13

14

15

16
17#BEGIN
SectionBEGIN
(
print "Dansla sectionBEGIN"
Chapitre8
Sectionsintermédiaires
Exécutionsur chaque enregistrementdes deux sections intermédiaires.Pour
chaqueenregistrement :
- Si le code postal commencepar "38", le nom du client est affiché, précédédu
mot "lsère".Puis le compteurnb_38 est incrémenté.
- Si le code postal commencepar "89", le nom du client est affiché, précédédu
mot "Yonne".Puis le compteurnb_89 est incrémenté.

SectionEND
Affichagedu nombretotal de clients (NR),du nombreËîâe clients résidantdans
l&#39;lsère
puis du nombretotal de clients résidantdans l&#39;Yonne
(nb_89).
Résultatde l&#39;exécution
:
S awk f script1.awk tel3.txt
Dansla section BEGIN
Yonne: JoyeuxGiselle
Isere : Gron Pierre
Isere : Grival Zoe
Dansla section END
Nombretotal d&#39;enregistrements
: 6
Nombrede clients localisés dans l&#39;Isere
: 2
Nombrede clients localises dans l&#39;Yonne
: l
S

B. Opérateurs
Le tableausuivantregroupeles opérateursdisponiblesdans le langage.

Opérateur Arité Signification


Opérateursarithmétiques
+ Binaire Addition.
Binaire Soustraction.
* Binaire Multiplication.
/ Binaire Division.

shellsousUniLinux
ÿProgammatio
Le langage
de programmation
awk

Opérateur Arité Signification


% Binaire Modulo.
" Binaire Exponentiation.
++ Unaire lncrémentationd&#39;une
variabled&#39;une
unité.
-- Unaire Décrémentation d&#39;une
variabled&#39;une
unité.
+= Binaire x+=yestéquivalent
àx=x*y.
= Binaire x-=y est équivalentà x=x y.
*= Binaire x*=y est équivalentà x=x*y.
/= Binaire x/=y est équivalentà x=x/y.
%= Binaire x%=y est équivalentà x=x%y.
" = Binaire x" =y est équivalentà x=x"y.
Opérateursde tests
< Binaire Inférieur.
> Binaire Supérieur.
<= Binaire Intérieurou égal.
>= Binaire Supérieurou égal.
== Binaire Test d&#39;égalité.
!= Binaire Testd&#39;inégalité.
w Binaire Correspondance avecune expressionrégulière.
l» Binaire Non correspondance avecune expressionrégulière.
Opérateurslogiques
! Binaire Négation.

reserved
Iights
A/I
&& Binaire Et logique.
|_] Binaire Ou logique.
Divers

ENI
Editions
-
= V Binaire Affectation.
el ? e2 : e3 Ternaire L&#39;expression
globalevaut e2 si el est vrai, e3 dans
le cas contraire.
el e2 (opérateur Binaire concaténationde e1 et e2.
© espace)

sh, ksh, bash


Chapitre8

C. La fonction printf
awk proposela fonction intégréeprintf similaireà celle du langageC. Elle per-
met de formaterles affichages.
printf ("chaine", exprl,expr2,. . . ,exprn) \\\
chainereprésente
lachaîne
quiseraaffichée
à l&#39;écran.
Ellepeutcontenir
desfor
mats qui serontsubstituéspar la valeur des expressionscitéesà sa suite. ll doit y
avoirautantde formatsque d&#39;expressions.

gemmesdeformatscouramment
utilisés
%20s Affichaged&#39;une
chaîne(string)sur 20 positions(cadrageà droite
par défaut).
% 20s Affichaged&#39;une
chaîne(string)sur 20 positionsaveccadrageà
gauche.
%3d Affichaged&#39;un
entier(décimal)sur 3 positions(cadrageà droite).
%03d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà droite)
complétépar des 0 à gauche.
% 3d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà gauche).
%+3d Affichaged&#39;un
entier (décimal)sur 3 positions(cadrageà droite)
avecaffichagesystématiquedu signe(un nombrenégatifest tou-
jours affichéavecson signe).
%10.2f Affichaged&#39;un
nombreflottant sur 10 positionsdont 2 décimales.
%+010.2f Affichaged&#39;un
nombreflottant sur 10 positionsdont 2 décimales,
cadrageà droite,affichagesystématiquedu signe,complétionpar
des zérosà gauche.
Desexemplesd&#39;utilisation
de la fonctionprintf sont donnésdans la suite de ce
chapitre.

Programmatin
shll sousx/Linx
_

Le langage
de Erogrammation
awk

D. Redirections

Il est possiblede redirigerles sortiesdu script vers un fichier ou vers une com-
mandedu systèmed&#39;exploitation.
Syntaxe &#39; ,
r
r
instruction > "fichier" Au premieg&#39;appel,
ouverture en mode "écra-
sement", puis écriture. Les écritures ulté-
rieures se font à la suite de la ligne
précédente.
instruction >> "fichier" Au premier appel, ouverture en mode
"ajout", puis écriture. Les écritures ulté-
rieures se font à la suite de la ligne
précédente.
print[f] "..." i "commande"Le résultat de l&#39;instruction print est
transmise sur l&#39;entrée
standard de la com-
mandepar l&#39;intermédiaire
d&#39;un
tube.

Premierexemgle
Ouvertureen modeécrasement:
S nl redirect1.awk
1 BEGIN{
2 nomfic = "/tmp/fic.txt"
3 print "Ligne l" > nomfic
4 print "Ligne 2" > nomfic
5 print "Ligne 3" > nomfic
6 close(nomfic)
7 }

Iights
A/I
reserved
Exécution:
S date > /tmp/fic.txt # création d&#39;un
fichier non vide
S cab /tmp/fic.txt
samjan 26 14:14:32 CET2008

É
ENI
©ditions
S awk -f redirect1.avk # Exécution du script awk
S cat /tmp/fic.txt # Le contenuprécédent a été écrasé
Ligne l
Ligne 2

sh,ksh,bsh
ChaBitre8
Ligne 3
S

Deuxièmeexemple
Ouvertureen modeajout :
S nl redirect2.awk
l BEGIN{
2 nomfic = "/tmp/fic.txt"
3 print "Ligne 1" >> nomfic
4 print "Ligne 2" > nomfic
5 print "Ligne 3" > nomfic Ï
6 close(nomfic) Ï
7 }
Exécution:
S date > /tmp/fic.txt # création d&#39;un
fichier non vide
S cat /tmp/fic.txt
samjan 26 14:15:54 CET2008
S awk-f redirect2.auk # Exécution du script awk
S cat /tmp/fic.txt # Le contenuprécédentest conservé
samjan 26 14:15:54 CET2008
Lignel
Ligne 2
Ligne3
S

Troisièmeexemple
Écrituredansuntube.Trierleslignesimpaires:
S cat agenda.txt
Robert 75020 robert@monsite.com
Natacha75012 nataCha@monsite.com
Alex 75001 a1ex@monsite.com
S awk &#39;
NRÆZ( print S1 I "sort" } END(close("sort") )&#39;
agenda.txt
Alex
Robert
S

rogrammatinshellsousUni/Linu
Lelangagedeprogrammation
awk
À la premièreécriture dans le tube, celui-ci est ouvert. Tousles ordresprint
ultérieursenvoientleurs donnéesdans ce même tube. La commandesort n&#39;est
exécutéequ&#39;une
seulefois. Dansla sectionEND,le tubeest fermé.

E. Lecture de la ligne suivante : next


L&#39;instruction
next interromptle traitementde la lignecouranteet déclenchela lec-
ture de &#39;
ne suivante,sur laquellele traitementintégralseraappliqué.

Exemple
Le script transfertLawkgénère,à partir du fichier tel3.txt, une sortie écran qui
reprendle format du fichier traité, mais en ajoutant 01. devant le numérode
téléphonedesclients localisésen régionparisienneet 99. devantle numérodes
clients localisésen province.
S nl transfert1.awk
1 BEGIN{
2 FS="|"
3 l
4 S3N / (7[578]|9[1-5])/ (
5 printf ("%s|%sl%s|%sl01.%s\n",Sl,S2,S3,S4,S5)
6 # Saut a l&#39;enregistrement
suivant
7 next
s &#39;
l

9 l
l0 printf ("%sI%sI%s]%s]99.%s\n",S1,S2,S3,S4,55)
11 )

All
rlghts
resarved
Exécution:
S awk-E transfert1.awk tel3.txt
JoyeuxGisellell2. rue de la Sourcel89290|Vaux|99.45.26.28.47

EN/
Edltlons
-
DehautOlivierl3 rue de Pussenvall75020|ParisJ01.78.25.96.78
KaramaJosettel256 rue de la tempetel56100|Lorient|99.85.26.45.58
Zanouri Joel|45/48 boulevard du Gard|56l00|lorient|99.85/56/45/58
GronPierre|89-90 rue du chateau|38350|LaMurel99.78.21.23.69

t!)

sh,ksh,bh
Chapitre8
Grival Zoe|3, rue du chateaul38350|La
Murel99.78.21.78.69
S
Lignes4 à 8 : la premièresectionintermédiaire traitelescodespostauxd&#39;|Ie
de
France.Dèsque le traitement estterminé,l&#39;instruction
next redémarre letraitement
surla prochainelignedufichier.Cecipermetde ne pasexécuter la deuxième sec-
(lignes9 à 11) quiestdédiéeà touslesautrescodespostaux.
tionintermédiaire
l

F. Structures de contrôle
Awk proposedesstructures
de contrôleque l&#39;on
retrouveclassiquement
dansles
langages
de programmation.
Lasyntaxeesthéritéedu langageC.

1. if

Lapartieelse estfacultative.

Sxntaxe
if (condition) i
instruction
l
else {
instruction

}
Lorsqu&#39;une
seuleinstruction
estprésente,
lesaccolades
sontfacultatives
:
if (condition)
instruction
else
instruction

2. for

Premièresyntaxe
for (initialisation ; condition; incrementation)(
instruction
amaîon.

l
Lorsqu&#39;une
seuleinstructionest présente,les accoladessont facultatives.
Syntaxeéquivalente:
initialisation
for ( ; condition ; ) {
instruction
incrementation
l
Deuxièmesyntaxe
La bouclefor permetégalementde traiter un tableau(cf.sectionTableaux).
for (cle in tableau) {
print cle , tableau[cle]
l
Lorsqu&#39;une
seuleinstructionest présente,les accoladessont facultatives.

3. While

Syntaxe
while (condition) (
instruction

4. do-while

AII
reserved
rights
Syntaxe
do l
instruction

ENI
Éditions
-
) unile (condition)

5. break

Le mot clé break permetd&#39;interrompre


une boucle.
©

sh, ksh, bash


Chapitre8

Principe
while (1) (
if (condition) break ; # sortie de la boucle
instruction ;
i
# Ici après break

6. continue

Le mot clé continue permet de remonterimmédiatementà la condition,sans


exécuterla suite de la boucle.

Principe
while (1) {
if (condition) continue ; # remonteimm&#39;diatement
au while
instruction ; # exécuté uniquementsi condition fausse

G. Terminer un script
L instructionexit permetà tout momentde terminer un script en retournantun
statut au systèmed&#39;exploitation.

Exemple

{ i
if ( NF < 3) exit 1 ; # Fin du script avec statut faux

i
END(
exit O # Fin du script avec statut vrai
i
Lelangagedegrogrammation
awk

H.Tableaux

1. Tableaux indicés par un entier

L&#39;indice
de départestau choixdu développeur.

Exemple
Cescript initialise un élémentde tableauà chaquenouvelenregistrementtraité.
Le fichier traité est teI3.txt. Chaqueélément représentele nom d&#39;un
client. Ce
tableauest indice à partir de 1 .-
S nl tab.awk
1 # sectiôn BEGIN
2 BEGIN(
3 FS= I"
4 l
5 # Tableaustockant les nomsdes clients
6 (
7 client[NR]=s1
8 }

9 # Section END
10 END{
ll # Affichage du tableau
12 5B: (indice=1 ; indice <= m2 ,- indice++)
13 printf("C1ient n° %4d=> %-20s\n ,indice, client[indice]);
14 }
S

All
rlghts
reserved
Résultatde l&#39;exécution
.-
# awk-f tab.awk te13.txt
Client n° 1 => JoyeuxGiselle
Client n" 2 => Dehautolivier
Client n° 3 => KaramaJosette

ENI
EdIt/ons
-
Client n 4 -> Zanouri Joel
Client n 5 => GronPierre
Client n 6 => Grival Zoe
#
©

sh,ksh,ba
Chapitre
8
2. Tableaux associatifs

a. Définition
Les tableauxassociatifsont leurs élémentsindicés par une chaînede caractères.
Cet indice alphanumériqueest considérécommela clé et l&#39;élément
correspondant
est nommévaleur.

Exemple
Le fichier venteslxt contient des informationssur les entes d&#39;une
société. Les
informationssont classéespar ville. A001:1 00 représen le code d&#39;un
article et
le nombred&#39;exemplaires
vendus.
S cab ventes.txt
Codearticle:Nombre d&#39;articles
vendus
#Paris
AOOl:l0O
AO02:300
A003:50O

A001:1000
#Nice

A002:30

A0O3:5
Le langage
de Erogrammation
awk

# Tableaustockant les nomsdes ôiients

094mm
NR 2= 1 &&S0 1» /"#/ &&so 1» /"S/\l
ventes[S1]+=S2
}
9 # Section END
l0 END{
ll # Affichage du tableau
12 for (article in ventes)
13 printf("Code article: %s- Total ventes: %10d\n",
article, ventes[artic1e])
l4 l
S
Le critèrede sélection(ligne6) évitede traiterla 1ère
lignedu fichier,les lignes
commençant parun "#" et leslignesvides.A chaquefoisqueawktraiteun enre-
gistrement,le tableauventesestmisà jour (ligne7). Lesclésdu tableausontles
codesarticles(31) et les valeursreprésententle nombred&#39;articles
vendus(ajout de
5B2à la valeurdéjà présentedans le tableau).La sectionEND(ligne 10) affichele
tableauà l&#39;aide
d&#39;une
bouclefor (ligne 12). La variablearticle représentela
clé et l&#39;expression
ventes [articles] la valeur.
Résultatde l&#39;exécution
:
S awk -f tab2.awkventes.txt
Codearticle: A001 Total ventes: 4100
Codearticle: A002- Total ventes: 350
Codearticle: A003- Total ventes: 555
Codearticle: A004 Total ventes: 2700
S

AII
rights
reserved
b. Testerl&#39;existence
d&#39;un
élément
Le mot clé in permetde tester l&#39;existenced&#39;une
clé dans un tableau associatif.
Cetteexpressionretournevrai si la clé est présente,faux dans le cas contraire:

Editians
ENI
-
cle in tableau
Cette expressionpeut donc être utilisée commeconditiond&#39;une
structurede con-
trôle :
if (cle in tableau) { ... }

s, ksh,bah
Chapitre8
c. Supprimerun élément
ll est possiblede supprimerun élémentd untableauassociatifen utilisantla
syntaxesuivante:
delete tableau[cle]
Lapaire
clé-valeur
est
supprimée.
\
I. Les arguments de la ligne de commande
awk fournit un mécanismequi permetde passerdes argumentsà un script au mo-
mentde sonappel.Lesvariables
ARGCet ARGVsontinitialisées
parawket per-
mettentde traiter les valeurspasséessur la lignede commande.

Exemple
Lescriptagenda.awk
permetde rechercher
desinformations
dansle fichieragen-
daJxt. L&#39;utilisateur
peut rechercherla ligne correspondantau nom d&#39;une
personne
(nom=), à son emai/ (mail=) ou son codepostal (cp=) .-
S cat agenda.txt
Robert 75020 robert@monsite.com
Natacha75012 natacha@monsite.com
Alex 75001 alex@monsite.com

Appelsdu script :
S awk f agenda.awknom=Robertagenda.txt
S awk-f agenda.awkcp=75020agenda.txt
S awk-E agenda.awk
mai1=&#39;robert@monsite.com&#39;
agenda.txt
Récupérationdes arguments.-

Snl agenda1.awk

l #1/bin/awk
Lelangagedeprogrammation
awk
7 l
S awk-f agenda1.awk nom=Robert
agenda.txt
ARGC= 3
ARGV[O]= awk
ARGV[1]= nom=Robert
ARGV[2]= agenda.txt
awk
initialise
letableau/ARGV
avec
lenom
delacommande
(ARGVIOJ),
etles
valeurspasséessur la ligne de commande.Lesoptionsde awk ne se retrouvent
pasdansle tableaudesarguments,afin de ne pasgênerle traitement.
Dansle script ci-dessus,il n&#39;y
a pasencorede sectionintermédiaire.Si celle-ciest
ajoutée,il va y avoir une erreurd&#39;exécution
car la valeurnom=Robertsera inter-
prétéecommeun nom de fichier à traiter. La solution: mémoriserles arguments
de la ligne de commandeet retirerdu tableauARGVceux qui ne correspondent
pasà un fichier.

Exemple

Snl agenda2.auk
1 #!/bin/awk
N BEGIN{
w # Decouperl&#39;argument
a nbChamps=split(ARGV[1],args,"=")
;
w option=args[1] ;
m valeur=args[2] ;

rights
AI/
reserved
7 # Eliminer l&#39;argument
8 delete ARGV[1]
9 t
10 option "nom"&&S1 valeur { prlnt S0 }
11 option = "cp" &&S2 valeur { print S0 }

Edlt/ons
ENI
-
12 option == "mail" &&S3 == valeur ( print S0 }

S awk f agenda2.awk
nom=Rohert
agenda.txt
Robert 75020 robert@monsite.com
©
Chaitre 8

J. Fonctions intégrées
Lelangage
awkdispose
defonctions
intégrées.

1. Fonctionstravaillant sur les chaînes

Fonction Rôle /
gsub(er,remp,[ch]) Remplacedansla chaîne"ch"chaqueoccurence corres-
pondantà l&#39;expression
régulière
"er"parla chaîne"remp".
Retournele nombrede substitutions. Par défaut,"ch"
vautS0.
index(chl,ch2) Retournela positionde la sous-chaîne "ch2"dans la
chaîne"ch1".
length(ch) Retourne la longueurde la chaîne"ch".
match(ch,er) Retournela positiondansla chaîne"ch"de la 1è occu-
rencede l&#39;expression
régulière"er".
split(ch,tab,sep) initialisele tableau"tab"avecles champsde la chaîne
"ch"."sep"représente le séparateur de champ.Retourne
le nombredechamps.
sprintf(fmt,e1, en) Identique à printf,maisretourne la chaîneformatée.
sub(er,remp,[ch]) Remplacedansla chaîne"ch"la l occurence corres-
pondantà l&#39;expression
régulière
"er"parla chaîne"remp".
Retourne le nombredesubstitution. Pardéfaut, ch"vaut
3S0.
substr(ch,pos,lg) Retournela sous-chaîne de "ch"commençant à la posi-
tion"pos" et de longueur"lg".
tolower(ch) Retournela valeurde la chaîne"ch"convertie en minus-
cule.
toupper(ch) Retournela valeurde la chaîne"ch"convertie en majus-
cule.

Programmaion
shell
sousUnix/Linux
Lelangage
deprogrammation
awk

2. Fonctions mathématiques

Fonction Rôle
cos(x) Retourne lecosinus dex
exp(x) Retourne e à la puissancex
int(x) Retourne la valeurentièredex
log(x) Retourne le logarithmenatureldex ,
sin(X) Retourne lesinusdex
sqrt(x) Retourne la racinecarréedex
atan2(x,y) Retourne l&#39;arc
tangeantedey/x
rand() Retourne le nombrealéatoirey tel que0<=y< 1
srand(x) initialisela basedecalculpourrand() enfonctionde la valeurx.
Retourne l&#39;ancienne
base.

3. Autres fonctions

a. Lafonctiongetline
Lafonctiongetline permetde :
lirelalignesuivante
dufluxsansremonter
audébuttraitement à
(contrairement
next).
lireuneligneà partird&#39;un
fichier,
del&#39;entrée
standardoud&#39;un
tube.
Valeurde retour:
- 1 encasdesuccès
- 0 enfin defichier

reserved
- -1 encasd&#39;erreur

r/ghts
AII
0 Malgré
lefaitquegetline estconsidérée
comme
unefonction,
ilnefautpas

-
ENI
Ed/tlons
mettrede parenthèses
lorsde l&#39;appel.

sh,ksh,
bash
Syntaxe
getline [var]
Lecture de la ligne suivante du flux.
getline [var] < "fic"
Lecture d&#39;une
ligne à partir d&#39;un
fichier.
"commande" | getline [var]
Lecture d&#39;une
ligne provenant du résultat d&#39;une
commande du système
d expioitation.
La ligne lue par "getline" est stockée dans la variable "var" ou "S0"
si aucunnomde variable n&#39;est spécifié. Le nomde fichier " "
représente l&#39;entrée
standard.

Premierexemple
Lecturede la lignesuivantedu flux naturelde awk.
Voicile fichier conlîtxt dans lequel une information donnéepeut être écrite sur
plusieurslignes. La fin d&#39;une
informationest représentéepar le caractère"In". Si
ce dernierest précédé d&#39;un "l", cela signifie que la suite de l&#39;information
est
contenuesur la ligne située en dessous.

Snlconf.txt

1 lignel
\J
2 suite lignel \J
3 suite lignelJ fin de la 1ère information
4 ligne2J fin de la 2èmeinformation
5 ligne3 \J
6 suite ligne3J fin de la 3emeinformation
Le rôle du scriptcon awk est de reconstituerchaque informationsur une seule
ligne :
i S hl conE.awk
. 1 (
2 ligne = S0
I 3 # tant que la ligne se terminepar \
4 while (ligne N /\\S/ ) {
5 # retrait de \
Le langage
de Erogrammation
awk
6 sub(/\\S/,"",liqne)
7 # lecture de la ligne suivante du flux
8 getline
9 # concatenation des 2 lignes
10 ligne = ligne S0
11 i
12 # quandla ligne est reconstituee, affichage
13 print ligne
14 )

E ution :
S awk -f conf.awk conf.txt
lignel suite liqnel suite lignel
ligne2
ligne3
suiteligne3
S
En ligne 2, la ligne lue est sauvegardée
dans la variableligne. La bouclewhile
(lignes4 à 11) déclenchela lecturedes lignessuivantes,tant que la ligne lue se
termine par un " \". La ligne 8 permetde lire la ligne suivantedu flux (le fichier
con txt), et de poursuivrele traitementen ligne 10 (reconstitutionde l&#39;intorma
tion).

Deuxièmeexemple

A/I
reserved
rlghts
Lectureclavier,lectured&#39;un
fichier extérieurau flux courant.
Voici le fichier agendaJxt:
S cat agenda.txt

ENI
Editlons
Robert 75020 robert@monsite.com
Natacha75012 natacha@monsite.com
Alex 75001 alex@monsite.com
Le script saisie.awkest composé uniquement d&#39;unesection BEGIN. Ce pro-
grammeouvrele fichier agendaixt pour y rechercherle nom d&#39;une
personnesaisi
© au clavier. Dans cet exemple, le fichier agendaJxt est ouvert par la section
BEGIN,et non passéen argumentsur la ligne de commande.
Chapitre 8

Snlsaisie.awk

l #1/bin/awk
2 BEGIN{
3 # Lire le fichier agenda.txt
4 while (1) (
5 # Saisie du nom
6 printf "Rechercherle nom: "
7 # Si erreur ou fin de fichier (ctrl d) fin du traitement
8 if (lgetline nom< " " ) != 1) break
9 # Si aucunnomsaisi, nouvelledemande
de saisie
10 if (length(nom)== 0) continue
1l # Bouclede lecture du fichier agenda
12 \\ trouve="false"
13 \ while (lgetline < "agenda.txt")== 1) l
14 # Recherche insensiblea la casse
15 if (to1ower(Sl)== tolower(nom))(
16 trouve= "true"
l7 print S0
18 break
19 l
20 l
21 if (trouve== "false") print nom, "n&#39;est
pas dans
l&#39;agenda."

Z2 }
23 print "\nBye"
24 }
Letraitementestcontenudansuneboucleinfinie(ligne4). Enligne8, lectured&#39;un
nomau clavier.Si l&#39;utilisateur
saisit"d ou si une erreurd&#39;entrée
se produit,le
scripts&#39;arrête
(sortiede la bouclewhile avecbreak). En ligne10, si l&#39;utilisateur
tapesurla touche[Entrée],la variablenomestvide,le scriptdéclenche alorsune
nouvelledemandede saisie(continue).En ligne13, bouclede lecturedu fichier
y a corres-
agendaixt.Si uneligneest lue, elleestcomparéeau nomsaisi: s&#39;il
pondance,le scriptaffichele résultat(ligne17) et le traitementdéclencheune
nouvellesaisie.Si le nomn&#39;a
pasététrouvé,affichaged&#39;un
message en ligne21.
Le langagede programmation
awk
Exécutiondu script :
S awk f saisie.awk
Rechercherle nom: robert saisie d&#39;un
nomde l&#39;agenda
Robert 75020 robert@monsite.com
Rechercherle nom: alain saisie d&#39;un
nomabsent de l&#39;agenda
alain n&#39;est
pas dans l&#39;agenda.
Rechercherle nom2 J saisie de la touche Entrée
Rechercherle nom:
Rechercherle nom: d fin de saisie
Bye
S

Troisièmeexemple
Lecture du résultat d&#39;une
commande du système d&#39;exploitation.
La fonction
getline récupèlela sortiestandardde la commandedate et la stockedans la
variableS0 :

Snl cmde.awk
1 BEGIN
l
2 "date &#39;+%d %m
I getline
%Y&#39;"
3 print S0
4 i
S awk -f cmde.awk
26-01-2008
S

b. La fonctionclose
La fonctionclose permetde fermer un fichier ou un tube de communication.Si
l&#39;appel
à cette fonctionest omis, les ressourcessont libéréesà la terminaisondu

Aiir/ma
nnmd
script.
L&#39;ordre
de fermetureest intéressantdans les cas suivants:
- pouvoir se repositionneren début de fichier au sein du même processus
(fermeturepuis réouverture),

m:
Edillanu
- - fermerun tube de communicationpours&#39;en servirà nouveau,
- libérer les ressourcesau fur et à mesuredes besoins(le systèmelimite les
processus, en ce qui concerne le nombre de fichiers/tubes ouverts
simultanément).
o
Chapitre8

Syntaxe
close("fichier")
close("commande")
Exemples
Fermetureindispensablepour pouvoir relire le fichier (l&#39;ouverture
repositionne
l&#39;indicateur
de positionen début de fichier) .-
/

Snlclose_fic.awk
1 BEGIN(
2 nomfic = "/tmp/fic.txt"
3 print "Ligne 1" > nomfic
4 print "Ligne 2" > nomfic
5 print "Ligne 3" > nomfic
m # Fermeturedu fichier pour pouvoir le relire
4 close(nomfic)
8 while ((9etline < nomfic) == 1)(
9 print # affiche S0 par defaut
10 }
ll )

c. Lafonctionsystem
La fonctionsystem permetd&#39;exécuter
unecommandedu systèmed&#39;exploitation.

Sxntaxe
system("commande")
Lafonctionretournele statut renvoyépar la commande.

Exemple
Caractéristiques
du fichier agendaJxt.-
S awk &#39;
BEGIN(system("ls -1 agenda.txt") }&#39;
rw-r -r 1 christie christie 94 jan 26 11:19 agenda.txt
Lelangagede programmation
awk
Mêmechosemaisen seservantd&#39;une
variableawkinitialisésaupréalable
:
S awk &#39;BEGIN{
fic="agenda.txt" ; system("ls -1 " fic))&#39;
rw r- r - 1 christie christie 94 jan Z6 11:19 agenda.txt
S

0 Rappel
: l&#39;espace
estl&#39;opérateur
deconcaténation.

K. Fonctions utilisateur
Syntaxe
Unefonctionpeutrecevoirde O à n argumentset retourner
unevaleurexplicite.
Lesfonctions
peuvent
êtredéfiniesau-dessus
ou au-dessousde leurappel.
Définitiond&#39;une
fonction :
function nom_fonct1on(paraml, paramz..., paramn)(
return valeur
l

0 Lesparamètres
(paraml,paramZ..., paramn)sontdesvariables
locales.
Touteautrevariabledéfiniedans la fonctionest globale.

Appeld&#39;une
fonction:
valeur_retournee=nom_fonction(vall,val2, ., valn)

0 Il nedoitpasy avoird&#39;espace
entrele nomde la fonction
et la parenthèse
ouvrante.
reserved
Exemple
All
righls
LescripttransferLawk
reprend
ENI
-
génère,à partirdu fichiertel3.txt,unesortieécranqui
le formatdu fichiertraité,maisenajoutant "01."devant le numérode
téléphone
desclientslocalisés
enrégion
parisienne
et "99."devant
le numéro
des
clients localisésen province.
Editions
©

h , shv
ChaEitre8
La fonction transfert reçoit en argumentle codepostal et le numérode télé-
phoneactuel et retournela nouvellevaleurdu numérode téléphone:

Snltransfert.awk
1 #Fonction
quifaitpasser
lenodetelephone
de8a10chiffres
function transfert (cp , tel) (
2

4 #Region
5
parisienne
if ( CFN /A(7[578]|9[1&#39;5])/)
6 prefixe="0l."
7 else # Autre region
8 prefixe="99."
9
10 # Les 2 valeurs sont concatenees
11 zeturn prefixe tel
12 }

13 # Section BEGIN
14 BEGIN{
15 FS="|"
16 )

l7 # Section intermediaire
18 {
19 newte1=transfert(S3,S5)
Z0 printf("%S|%S|%S|%SI%s\n",S1,S2.S3,S4,äewte1);
21 }
Résultatde l&#39;exécution
:
S awk-f transfert.awk tel3.txt
Lelangage
deErogrammation
awk

L. Exemples de scripts
1. Analyse d&#39;un
fichier de Iog

Voiciun fichierde logsystème.-


S nl error.1og
l MonSep30 09:33:00 2002 [notice]
Apache/1.3.20(Unix) (Red-Hat/Linux)od_python/2.7.6
Python/1.5.2mod_ss1/2.8.4 OpenSSL/0.9.6b DAV/1.0.2PHP/4.0.6
mod_perl/l.24_01mod_thrott1e/3.1.2configured - resumingnormal
operations
2 MonSep30 09:33:00 2002 [notice] suEXEC mechanism
enabled(wrapper:/usr/sbin/suexec)
3 MonSep30 18:35:34 2002 [notice] caughtSIGTERM,
shuttingdown
4 TueOct 1 10:06:46 2002 [alertl httpd: Could not determine
fully qualified domainname,using10.0.0.66 for ServerName
the server&#39;s
5 TueOct 1 10:06:46 2002 [notice]
Apache/1.3.20(Unix) (Red-Ha:/Linux)mod_python/2.7.6
Python/1.5.2modAssl/2.8.4OpenSSL/O.9.6b DAV/1.0.2PHP/4.0.6
mod_per1/1.24_O1 mod_throttle/3.1.2configured-- resumingnormal
operations
6 TueOct 1 10:06:46 2002 [notice] suEXEC mechanism
enabled(wrapper:/usr/sbin/suexec)
7 TueOct 1 10:12:51 2002 [notice] SIGHUP received.
Attemptingto restart
8 TueOct 1 10:12:52 2002 [alert] httpd: Could not determine
fully qualified domainname,using10.0.0.66 for ServerName
the server&#39;s
9 TueOct 1 10:12:52 2002 [notice]
Apache/1.3.20(Unix) (Red-Hat/Linux)mod_python/2.7.6
Python/l.5.2 mod_ssl/2.8.4OpenSSL/0.9.6b DAV/l.0.2 PHP/4.0.6

reserved
rights
Ail
mod_perl/l.24_01mod_thrott1e/3.1.2Configured- resumingnormal
operations
10 TueOct 1 10:12:52 2002 [notice] suEXEC mechanism
enabled(wrapper:/usr/sbin/suexec)

-
ENI
Editians
Lescripterror_log.awk

typede message
permetde rechercher

à rechercher
un certaintypede message(alert
sousuneformeplusagréablea lire. Le
ou notice) et de les afficherà l&#39;écran
estpasséen argumentsurla lignede commande.

h, h, bas
Chapitre8
Exempled&#39;exécution
du script :
S awk f error_log.awk alert error.loq
LISTEDESMESSAGES DETYPE: alert
Date : TueOct 1 10:06:46 2002
httpd: Couldnot determinethe server&#39;s
fully qualified
demainname,using 10.0.0.66 for ServerName
Date : TueOct 1 10:12:52 2002
httpd: Couldnot determinethe server&#39;s
fully qualified
demainname,using 10.0.0.66 for ServerName
Lescript error_log.awk:
S nl error_1og.awk
l BEGIN(
2 # Tester le nombred&#39;arguments
3 if (ARGC != 3) {
4 printf("Usage : awk-f error_1og.awktype_message
fichier_1og\n") | "cat 1>&2
5 exit 1
6 }
7 typeMessage= ARGV[1]
8 chaineMessage= "\\[" ARGV[1]"\\]"
9 delete ARGV[l]
10 print "LISTEDESMESSAGES DETYPE: " , typeMessage

12 S0 N chaineMessage (
13 # Utiliser le | comme separateur de champ
14 Sub(/"\[/,"")
15 Sub(/\] \[/,"|")
16 sub(/\] /,"|") :
17 split(S0,ligne,"l")
18
19 print "Date : " ligne[l]
20 print ligne[3]
21 }
La sectionBEGINteste le nombred&#39;arguments passésen ligne de commande.Si
ceIui ciest incorrect,un messageest envoyésur la sortie d&#39;erreur
standardet le
script se termine(lignes3 à 6). Le typede messageà rechercherest sauvegardé
et retire de la liste desarguments(lignes7 à 9).

Prgrammation
shellsousUnix/Linux
A_ prormatio awk
La sectionintermédiaireest déclenchéeuniquementsi la ligne du fichier de log
contientle typed&#39;alerte
demandé(ligne 12).
Laligneesttraitéede façonà pouvoirêtredécoupée
(fonctionssub et split),
puislesinformations
souhaitéessontaffichées.

2. Génération d&#39;un
fichier d&#39;étiquettes
Voiciun fichier de contacts,qui doit être formatésousformed&#39;étiquettes
:
S cat contacts.txt
Zerr Marina
75000
01.25.

91000Paris
Deri Robert
01.78.
RemelStephen 45.89.01
45000
04.02.
Bellage Francois Essonne
89000
03.26.
01.25.44
RenaudCasimir
89000
Loire
03.58
25.36.24
reserved
Ail
rights Auxerre

ENI
Editions 59.45.56
©
Auxerre
.69.12.45
ChaEitre8
89000Auxerre
03.58.69.12.45
S
Le script etiq.awk:

Snl etiq.awk

1 BEGIN
{
2 indice_etiquette = 1
3 }
4 # Selectionner la ligne du nom
5 (S0 E" / S/ &&S0 1» / \t/ ) {
6 # Memoriserle nom
7 nom[indice_etiquette] = S0
8 # Lire ligne du code postal / ville
9 # et memoriser
10 getline
11 gsub (/\t/ 1 "" 1 S0)
12 adr[indice_etiquette] = S0
13
14 # Lire ligne du telephone
15 # et memoriser
16 getline
l7 gsub (/\t:/ r "" , S0)
18 te1[indice_etiquette] = S0
19 indice_etiquette++
20 }
22 END{
23 dernierïndice = indice_etiquette il
24 # Affichage
25 for (i=l ; i <= dernierlndice ; i=i+2) (
26 printf("%d\n", i) ;
27 printf( %-305%-3Ds\n",nom[i],nom[i+1D
28 printf("%-305%-30s\n",adr[i],adr[i+1D
29 printf("% 30s% 30s\n\n",tel[i],te1[i+1]
30 )
31 }
Lelangage
de Erogrammation
awk
La section intermédiaireest déclenchéelorsqu&#39;uneligne contenant le nom est
détectée(ligne 5). Les lignescontenantle nom sont mémoriséesdans le tableau
nom (ligne 7). La fonctiongetline (ligne 10) permetde lire la ligne suivante(code
postal et ville). Celle-ciest mémoriséedans le tableau adr (ligne 12). La même
action est exécutéesur les lignescontenantle téléphone.Ce dernierest mémorisé
dans le tableautel (ligne 18). La section END affiche les informationsdes trois
tableaux,en disposantpour chaquetableau,deuxélémentssur la mêmeligne.

reserved
AII
rlghts
Edltlons
ENI
-
©

sh ks, bh
ChaEitre
8

E: Programmation
shellsous
Unix/Linux
Ü Chapitre9 : Lescommandesltres
Introduction . . . . . . . . . . . . . . . . . . . . 328

PTFP
Syntaxed&#39;appel filtres. . . . . . . . . 328
descommandes
Visualisation de données . . . . . . . . . . . . . . . 328

Traitement de données. . . . . . . . . . . . . . . . 340

archivageset conversions. . . . . . . . 351


compressions,
Commandes réseau sécurisées . . . . . . . . . . . . 359

Autres commandes . . . . . . . . . . . . . . . . . 366


.9 ...........,
A. Introduction

Ce chapitre présenteles principalescommandesfiltres d&#39;UNIX. Ces commandes


traitent un flux de données issues de l&#39;entréestandard ou contenuesdans
un fichier. Ellespeuventêtre utiliséesde manièreautonomeou placéesderrièreun
tube de communication.Les filtres s&#39;utilisent
pour la plupart de la mêmemanière
(quelquesexceptionscependant).Les principalesoptions de chaque commande
sont exposées.

B. Syntaxe d&#39;appel
des commandes filtres
commandeAfiltre options ficl fic2 ...
commande_filtre options
commande_filtre options < fichier
commande
| commande_filtre options

C. Visualisation de données

1. Consultation de données, création de fichier : cat

Outre la consultationde fichiers, voici quelquesexemplesd&#39;utilisation


de la com-
mandecat.

Syntaxe
kwnwwmmm
cat [ options ] [ fichier ...]
Principales options
e Matérialise les fins de ligne par un caractère S
t Matérialise les tabulations par un caractère "I
v Matérialise les caractères non affichables

Exemples
Lorsquela commandecat ne reçoit pas de fichier en argument, elle lit ses
donnéessur l&#39;entrée
standard(clavier).lci, les donnéeslues au clavier sont redi-
rigéesdans le fichier f1, ce qui a pour effet de créer le fichier si celui-ci n&#39;existe
pas ou de Pécrasersi celui-ci existe.

APogramationhels nix/Linux
Les commandes ltres

S cat > f1
Lignel
Liqnez
"d
S cat il
Lignel
Ligne2
Le fichier f3 est la concaténationde f1 et f2 :
S cat f1
Lignel
Ligne2
S cat f2
Ligne3
Ligne4
S cat f1 E2> E3
S cat f3

Lignel

Lignez
rights
reserved
EN/
Éditions
- Ligne3
AII

©
Chapitre
9
Affichagedesaliaspermettantle rappelde commandes
avecles flèchesdu clavier.-
S alias I cat -v
__A= P
__B= N

C= F
__D= B
è..

2. Valeur des octets d&#39;un


flux de données : od

La commandeod permetde visualiserla valeurde chaqueoctet d&#39;un fichiertexte


ou binaire.L&#39;option
c permetde demanderune interprétationoctet par octet. li
est ainsi possiblede voir de manièreexactele contenudu fichier, de détecterl&#39;em-
placementdes espaces,tabulations,caractèresde sauts de ligne (CR LF ou LF),
etc.

Exemples
La commandecat ne nouspermetpas de savoirsi le fichier contientdes espa-
cesou destabulations.Avecod, les tabulationssont représentéespar \1:, les es-
pacespar un espace,le caractèreLF est représentépar \n :
S cat fic_od.txt
Isabelle 20
Sophie 12
S
s od -c fic_od.txt
0000000 I s a b e l l e \t 2 0 \n S 0 p h
0000020 i e 1 2 \n \n
0000040
S
Voicile mêmefichier au formatDOS: les fins de lignesCRLFsont matérialisées
par \r\n :
S od -c fic_od.txt
0000000 I s a b e l l e \t 2 0 \r \n S o p
0000020 h i e 1 2 \r
0000040
0000041
S \n

Lacolonne
degauche
représente
laposition
dupremier
caractère
delaligne
dans
lefichier,
exprimée
enoctai.
Cette
information
nefaitpas
partie
ducontenu
du
fichier.

3. Filtrage de lignes : grep


Lacommande
grep recherche de caractèresdans un ou
unechaîne plusieurs
fichiers
textes
etaffiche
à l&#39;écran
leslignes
contenant
cette
chaîne.
Lachaîne
recherchée
estmatérialisée
parune
expression
régulière
basique
(par
défaut)
ou
étendue
(option
E).Ceparagraphe
présente
lesprincipales
options
delacom-
mande
grep.
Lesexpressions
régulières
etleur
utilisation
avec
grep
sont
exposées
auchapitre
Lesexpressions
régulières.
MWMMWVMlNMwW_wM.ww_MNwMiwwmw.w_«m_wmsww__M.wwMw.M
0 Afindebénéficier
detouteslesoptions
degrep
surlessystèmes
Solaris,
il est
recommandé
d utiliser
lacommande /usr/xpg4/bin/grep
comme
alterna-
tive à /usr/bin/grep. W mm-M__Mlm.wwmw_ M_wm.c mm

reserved
Syntaxe
grep [ options ]
rights expreg [ fichier ... ]
grep [ options ] e expregl e expreg2 [ fichier ... ]
AII grep [ options ] -f fichier_expreg [ fichier ... ]
ENI
- -cPrincipales options :
afficher le nombrede lignes trouvées
-e
-Eexpreg permet
despécifier
plusieurs
l&#39;expression
régulière expressions
est interprétée régulières
comme
uneexpression
Edltlons régulière étendue
© -f fichier_expreg

les expressions
régulières
doiventêtreluesà partir de
Chagitre9

Exemples
Voicile fichier teLtxt utilisé dansles exemples:
S cat tel.txt
JoyeuxGiselle|12. rue de la Sourcel89290|Vaux|45.26.28.47
DehautOlivier|3 rue de Pussenvall75020lParis|78..25.96.78
Zanouri Joel)45/48 boulevard du Gard|56100|lorient|85/56/45/58
Grival Zoe|3, rue du chateau|38350|LaMure|78.2l.78.69
Dupontlruelle du bonheur|89000|Auxerre|
89000
Afficher les lignescontenantla chaîne89000 .-
5 grep 89000te1.txt
Dupontlruelle du bonheur\89000\Auxerre|
89000
Utilisation des expressionsrégulièresétendues(-E) et rechercheinsensibleà la
casse(-1) :
S grep -E i &#39;(vaux|auxerre)&#39;
tel.txt
JoyeuxGiselle|12. rue de la Sourcel89290lVauxI45.26.28.47
Dupontlruelle du bonheur|89000|Auxerre|
Afficherles lignesqui ne se terminentpaspar le chiffre 8 :
S grep -v &#39;85
tel.txt
JoyeuxGisellel12. rue de la Sourcel89290|Vaux|45.26.28.47
Grival Zoel3, rue du chateau|38350lLaMurel78.2l.78.69
Dupontiruelle du bonheur)89000|Auxerre]
89000
Rechercherles lignescommençantpar "J"ou finissantpar "9" :
5 gzep e &#39;-e J&#39;95
te1.txt
JoyeuxGiselle|l2. rue de la Sourcel89290|Vaux|45.26.28.47
Grival Zoe|3, rue du chateaul38350]LaMurel78.2l.78.69

Programmation
shellsus Unix/Linux
Les commandes ltres

Rechercherles lignes se terminant par "8", et les afficher précédéesde leur


numéro.-
S grep -n &#39;85
tel.txt
2:DehautOlivier13 rue de Pussenval]7502OIParisi78..25.96.78
3:Zanouri Joell45/48 boulevard du Gardl56100[lorientl85/56/45/58
Le modesilencieux: seul le statut de retour indique si la recherchea été fruc-
tueuse:
S grep q &#39;85
tel.txt
S echo S?
O
Afficher le nombrede lignescorrespondantau motif :
S grep -c &#39;85
tel.txt
2
Lignescontenantle mot "rue"(la ligne contenant"ruelle"ne sort pas à l&#39;écran)
:
S grep -w rue te1.txt
JoyeuxGisellell2. rue de la SourceL89290|VauxL45.26.28.47
DehautOlivier\3 rue de Pussenvall75020lParis|78..25.96.78
Grival Zoei3, rue du chateau|38350lLaMure|78.2l.78.69
Lignescontenantau moinsdeuxcaractères:
S grep &#39;..&#39;
tel.txt
JoyeuxGisellell2. rue de la Source}89290|Vauxl45.26.28.47
DehautOlivier\3 rue de Pussenvall75020IParis|78..25.96.78
Zanouri Joel\45/48 boulevard du Gardl56100|lorient|85/56/45/58
Grival Zoe\3, rue du chateau|383501LaMure|78.2l.78.69

rights
reserved
A/I
Dupontlruelle du bonheur|89000lAuxerre\
89000
Ne pas interpréterle motif commeune expressionrégulière:
S grep -F &#39;..&#39;
tel.txt
ENIDehautOlivier13 rue de Pussenvall75020|Paris|78..25.96.78

Editions
©

sh, ksh, bash


Chagitre9

Utiliser une expressionrégulièreétendue( E) et rechercherles lignes ne conte-


nant que deschiffres ( x).
S grep -E -x [0-9]+&#39;
tel.txt
équivalent à
S grep -E "[0 9]+S tel.txt
89000
Lire les motifs à partir d&#39;un
fichier :
S cat rech.er
95
\.\.
S
S grep -f rech.er te1.txt
DehautOlivier|3 rue de Pussenvall75020|Parisi78..25.96.78
Grival Zoe|3, rue du chateau\38350|LaMure|78.2l.78.69
Utilisationde grep derrièreun tubepour rechercherle processushttpd :
S ps ef | grep httpd
root 2455 1 0 Novlû ? 00:00:01/usr/sbin/httpd
christie 1780417775 0 22:14 pts/l 00:00:00grep httpd
apache 21302 2455 0 DecO9? 00:00:00/usr/sbin/httpd
apache 21303 2455 O Dec09? 00:00:00/usr/shin/httpd

4. Dernières lignes d&#39;un


flux de données : tail

La commandetail permetd&#39;afficher
les"n" dernièreslignesd&#39;un
flux de données.
Parexemple,cette commandeest très pratiquepourvisualiserles dernièreslignes
écritesdansun fichierde log.

Syntaxe
tail[options
] [fichier
...]
Principales options
-f La commande affiche en tempsréel les ajouts en fin de fichier
-n Affichage des n dernières lignes (10 lignes si
l&#39;option
n&#39;est
pas précisée)
+n Affichage à partir de la ligne n jusqu&#39;à
la dernière ligne
Les commandes ltres

Exemples
Affichage des deux dernièreslignes d&#39;un
fichier de log d&#39;Apache,
nommé ici
access_log, quirépertorie
touslesaccèsà unsiteweb:
# tail -2 /etc/httpd/logs/access_1og
xx.xx.xx.xx - - [16/Dec/2007:18:26:O2+0100] "GET/images/fi1ieres/
filiere_java_rl0_c12_f2.gif HTTP/1.1"304 - "http://www.ociensa.com/
formation.php?fi1iere=java&cours=uml""Mozilla/4.0
(compatible; MSIE7.0; WindowsNT5.1; .NETCLR1.1.4322; InfoPath.1)"
xx.xx.xx.xx - [16/Dec/2007:l8:26:O2+0100] "GET/images/filieres/
fi1iere_java_r13_c5_f2.gif HTTP/1.1"404 361 "http://www.ociensa.com/
formation.php?filiere=java&cours=uml""Mozilla/4.0
(compatible; MSIE7.0; WindowsNT 5.1; .NETCLR1.1.4322; InfoPath.l)"
#
Surveillancedu fichier en tempsréel : dès que le fichier grossit, la commande
affiche les dernièreslignesajoutées.Pourterminerla commande,utiliser "c.
# tail -f /etc/httpd/logs/access_log

Ac

5. Premièreslignes d&#39;un
flux de données: head
Lacommandehead permetde visualiserles "n" premièreslignesd&#39;un
flux de don-
nées.Sansoption,la commandeafficheles 10 premièreslignes.

All
rights
reserved
Syntaxe
head [ n ] [ fichier ... ]
Principales options
n Affichage des n premières lignes (10 lignes si

ENI
Editians
-
l&#39;option
n&#39;est
pas précisée)

h, ksh,bash
Chapitre
9
Exemple
Afficher la premièreligne renvoyéepar la commandeod : les premiersoctetsdu
fichier exporLpdfindiquent qu&#39;il
s&#39;agit
d&#39;un
format PDF (informationutiliséepar
la commandefile, qui indique le typede contenud&#39;unfichier).
S od -c export.pdf | head -1
0000000 % P D F 1 . 4 \r %342 343 317 323 \r \n
S file export.pdf
export.pdf: PDFdocument,version 1.4
S

Duplication de la sortie standard : tee

La commandetee récupèreun flux de donnéessur son entréestandard,l&#39;envoie


dansle fichier passéen argumentet sur la sortiestandard.Cecipermetd&#39;avoir
à la
fois le résultatà l&#39;écran
et dansun fichier.

Syntaxe
commande l tee [ options ] fichier
Principales options :
a Ajoute à la fin de "fichier" si celui-ci existe déjà.

Exemple
À partir du fichierde log access_log,
récupérerles lignesqui concernent
le
14 décembre2010, les afficher à l&#39;écran
et les conserverdans un fichier pour
exploitationultérieure.-
S grep &#39;14/Dec/2010
/etc/httpd/logs/access_log | tee /tmp/today
xx.xx.xx.xx - [14/Dec/20l0:OO:O3:l4+0100] "GET/ressourCes.php
HTTP/1.0"200 4845 " " "Mozilla/5.0 (compatible;
Yahoo!Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"

S head-1 /tmp/today
xx.xx.xx.xx [14/Dec/2010:00:O3:l4+0100] "GET/ressources.php
HTTP/1.0"200 4845 "7" "Mozilla/5.0 (compatible;
Yahoo!Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
S

rogrammionshellsousUnix/Linu)?
7. Numérotationde lignes : nl
nl permet
Lacommande d&#39;afficher
unfichiertexteenfaisantprécéder
leslignes
de leurnuméro.Pardéfaut,leslignesvidesnesontpasnumérotées.

Sxntaxe
nl [ options ] [ fichier ... ]
Principales options :
-b a Numérotertoutes les lignes
-b t Ne pas numéroterles lignes vides (défaut)

Exemle
Leslignes
blanches
(symbolisées
parH)nesontpasnumérotées
pardéfaut:
S nl fic.txt
1 valérie français 18
2 francois histoire 12
3 4-
4 valérie francais 11
5 christie arithmétique 12
6 <|
7 4-
8 francois histoire 8

Numérotertoutes les lignes :


S nl ba fic.txt
1 valérie français 18
2 francois histoire 12
3 4-
4 valérie francais 11

AII
reserved
rights
5 christie arithmétique l2
6 0-
7 4-
8 francois histoire

Erlitions
ENI
-
©

sh,ksh,
bash Ë
ChaEitre9

8. Présentationd&#39;un
flux de données : pr
La commandepr afficheun fichier texte de manièreformatée.Par défaut,chaque
pagefait 66 lignes,dont 5 lignesd en-têteet 5 lignesde pied de page.

Syntaxe
pr [ options ] [ fichier ...]
Quelquesoptions :
-c nb Disposition en nb colonnes
-h texte Ecrire un titre en en tête
-1 nb Nombrede lignes d&#39;une
page

Exemples
Formatagesimple du fichier notes.txt :
S pr notes.txt I more
2008-01-2211:03 notes.txt Page1

Robert 12
Simon 20
Romain 15
Nathalie 13
Sylvie 14
Nathan 20
Ernest 15
Antoine 16
Marc 8
Jean-Marc 18
Paola 11
Marie 12
Natacha 7
Christine 10
Olivier 19
Thomas 14
Nicolas 13
Mohamed 15

Programmatin
shellsousnix/Lnux
Les commandes ltres

Autre exemplede formatage: 15 lignespar page, dispositionen 2 colonneset


ajout d&#39;un
titre :
S pr -1 15 -c2

Robert

Simon
Romain
Nathalie
Sylvie -h "Relevé

2008-04-06ll:42

Ail
reserved
Iights
12

20
Paola

Editions
ENI
- Marie 15
©
Natacha
ChaEitre9

D. Traitement de données

1. Comptagede lignes, de mots et de caractères: wc


La commandewc (wordcount)comptele nombrede lignes,de mots et de carac-
tères.

Syntaxe
wc [ options ] [ fichier ... ]
Principales options :
-l compterle nombrede lignes
-w compterle nombre de mots
c compterle nombre d&#39;octets
-m compterle nombrede caractères
C Identique à m

Exemples
Nombrede lignes,motset caractèresdu fichier notesJxt.-

Swcnotes.txt

5 l5 245notes.txt
Nombrede lignesuniquement:
S wc -1 notes.txt
5 notes.txt

Nombrede caractèrescontenusdansun nom de fichier saisi au clavier (attention


au saut de ligne ajoutépar la commandeecho) :
S read nomfic
document.xls
Ad
S echo "Snomfic\c" | wc -c (Linux : S echo n "Snomfic" 1 wc -c
12
S
Voici un fichier encodéen UTF-8 (les caractèresaccentuéssont encodéssur
2 octets),manipulésur un systèmedont l&#39;encodage
est égalementUTF-8:
S echo SLANG
fr_FR.utf8
Le fichier contient2 caractèresaccentués.-
S cat utf8.txt
élève
La commandeod nous montre que chaque caractèreaccentuédu fichier est
encodésur 2 octets.-
5 od -c utf8.txt
0000000303 251 l 303 250 v e \n
0000010
Nombred&#39;octets
du fichier .-
S wc -c utf8.txt
8 utf8.txt
Nombrede caractèresdu fichier :
S wc -m utfB.txt
6 utf8.tXt

0 Lesvariables
d&#39;environnement
qui définissent
l&#39;encodage
sont LC_ALL,
LC_CTYPE et LANG.Ellessont transmisesaux commandespar le shell (elles
doiventêtreexportées)et sontévaluéesdanscet ordre: c&#39;est
la premièrevaleur
luequi est priseen compte.

Ail
rights
reserved
Obtenir la liste des valeursde localisation(valeurliée au pays et à la langue)
disponiblessur le système:
S locale a | grep fr_FR

ENl
Éditions
«fr_FR.iso8859l5@euro
fr_FR
fr_FR@euro
fr_FR.iso8859l

©
fr_FR.utf8
S
Chaitre 9

2. Extraction de caractères : cut

Lacommande
cut sertà récupérer
(couper)descaractères
ou deschampsd&#39;une
ligne.

Syntaxe
Couperparcaractères:
S cut c3 [ fichier ... ] Le 3è caractère
S cut -c3-5 [ fichier ... ] Du3è au 5è caractère
S cut -c 3 [ fichier ... ] Jusqu&#39;au
3è caractère
S cut -c3- [ fichier ... ] A partir du x caractère
S cut c3,10 [ fichier ... ] Le x et le lO e caractère
Couperpar champs:
S cut dsep-f3 [ fichier ... ] Le 3Î champ
S cut edsep-f3-5 [ fichier .. ] Du38" au 5è champ
S cut -dsep-f-3 [ fichier ... ] Jusqu&#39;au
3* champ
S cut dsep f3- [ fichier ... ] A partir du 3è champ
S cut -dsep f3,1O [ fichier ... ] Le 3è et le 10è"champ
L&#39;option
d permetd&#39;exprimer
le caractèreséparateurde champ.Le caractère
séparateur
pardéfautestlatabuiation.

Exemples
Couperles2 premierschiffresd&#39;un
codepostal.-
S echo89000I cut -cl-2
89

Afficherle le ,3ème
et 6ème :
champsdes3 dernièreslignesdu fichierletc/passwd
S tail -3 /etc/passwd| cut d: f1,3,6
christie:505:/home/christie

svn:506:/home/svn

sebastien:507:/home/sebastien
Lescommandes ltres
uam

3. Tri de données : sort


Lacommande detrierleslignes
sort permet fluxde données
d&#39;un textes.

Syntaxe
manne...
sort [ options] -k champ[.car][options],champ[.car][options]
[ fichier ... ]
Principalesoptions
-b Optionà utiliser lorsquele critère de tri est
alphanumérique et queles champs sont
séparéspar unesuite d&#39;espaces/tabulations
variables
-k champ[.car][options],champ[.car][options]
Spécifier le ou les champs à prendreen compte
en tant quecritère de tri. Le critère de tri peut
commencer ou finir à unecertaine position de
caractèredu champ.
Préciser quele critère de tri doit être traité comme
Il valeur numérique
Demander
et noncomme
un tri décroissant
chaînede caractères
Préciser le caractèreséparateurde champs(espace
par défaut)

-r
s
t éparateur
reserved
Exemples
Voiciunfichierinspiré
dufichierletc/passwd,
quenousallonstrieravecla com-
rights
mandesort.
All
- S cat passwd.txt
ENI
root:x:0:O:root:/root:/bin/bash
mail:x:8:l2:mail:/var/spool/mail:/sbin/nologin
Editions
©

ftp:x:l4:50:FTP
User:/Var/ftp:/sbin/nologin
Chapitre9
Par défaut, le critère de tri est considérécommeune chaînealphanumérique.L op-
tion -k permetde spécifierles colonnesqui entrentdans Ia compositiondu critère
de tri (indicedu champdébutet du champfin inclus).

Exemples
Tri sur le 3ème champ (UID) et utilisation de cut pour isoler le critère de tri. Le
critère de tri est traité commeune chaînede caractères:
S sort t: k 3,3 passwd.txt | cut d: f3
0
14
2
502
505
8
S
Pour que le critère de tri soit traité de manièrenumérique,il faut utiliser l&#39;option
n:
S sort -t: k 3n,3 passvd.txt | cut -d: -f3
0
2
8
14
502
505
S
Exemplede critère de tri alphanumériquesur le champ2. Sansl&#39;option
-b, le tri
est mal réalisé.-
S cat notes.txt
christie arithmétique 12
valérie français 18
francois histoire 12
Valérie francais 11
francois histoire 8
S sort -k 2,2 notes.txt
valérie francais ll
valérie français 18

Programmation
sheilsous
Uix/inx
es commandeltres
rua-mucus

christie arithmétique 12
francois histoire 12
francois histoire 8
S sort -k 2b,2 notes.txt
christie arithmétique 12
valérie francais 11
valérie français 18
francois histoire 12
francois histoire 8
Utilisation
dedeux
critères
detri: trisurlamatière
(valeur
alphanumérique),
puissurlesnotes(valeur
numérique)
:
S sort k 2b,2 k 3n,3 notes.txt
christie arithmétique 12
valérie francais 11
valérie français 18
francois histoire 8
Erancois histoire 12

4. paste
Lacommande pasteconcatène
leslignes
desfichiers
passésenargument
: les
lignes
d&#39;indice
"n"dechaque
fichier
sont
concaténées.
Avec
l&#39;option
s, chaque
fichier
esttraité
demanière
indépendante
etverra
toutes
seslignes
concaténées
en
uneseule.
Leséléments
concaténés
sontséparés
parunetabulation.
Syntaxe
wmmwmu
paste [ options ] [ fichier ...]
Principales
-s options
Concaténer toutes les lignes en uneseule
Les caractères cités dans listesep seront
reserved
d listesep utilisés pour séparer les champsen sortie

rights
Ail
ENi
-

Editions
©

sh, ksh, bash


ChaEitre
9
Exemple
Voicideuxfichierscontenantdesnotesd&#39;élèves.
Lesélèvessonttoujoursmen-
tionnésdansle mêmeordre:
S cat francais.txt
Christie 12
François 8
Valérie 18
S
S cat histoire.txt
Christie 11
François 10
Valérie 14
S
Mettreles notessur la mêmeligne :
S paste francais.txt histoire.txt
Christie 12 Christie 11
François 8 François 10
Valérie 18 Valérie 14
S
Retirerla 3ème
colonne:
S paste francais.txt histoire.txt | awk &#39;
{printf("%-10s%5d%5d\n",
51,32 ,50)
Christie 12 11
François 8 10
Valérie 18 14
S

Avecl&#39;option
-s, concaténertoutesles lignesen une seule.-
S cut -dz -f1 passwd.txt
root
mail
ftp
Christie
daemon
Olivier

Programmation
shelsousUni/Linux
Les commandes nwawSm
mmmmmnummmmmumuwmm«summum.mmumuummSmmmwmmnm ltres

S eut -d: -f1 passwd.txt | paste -s


root mail ftp christie daemonOlivier
S
Utilisationde l&#39;option
-s avecdeuxfichierspassésen argument:
S paste -s francais.txt histoire.txt
Christie 12 François 8 Valérie 18
Christie ll François 10 Valérie 14

5. split
Lacommande
split permetd&#39;éc|ater
unfichierenfragments,
chaquefragment
étantstockédans desfichiersnommésPREF|XEaa,
PREFiXEab, PREFIXEayant
pourvaleurpardéfaut"x".Si aucunnomdefichiern&#39;est
spécifié,l&#39;entrée
standard
est utilisée.

Syntaxe
split [ options] [fichier [FREFIXE]]
Principales options
-b nb Le fichier est éclaté tout les "nb" octets.
l nb Le fichier est éclaté tout les "nb" lignes.

Exemples
Voiciun fichier contenant9 lignes:

lignel
S cat 1ignes.txt

reserveci
Al/
rights
ENI
Éditions
-
©
Chapitre9

Le fichier est éclaté en fichiers de 3 lignes chacun.Par défaut les fichiers de


sortiese nommentxaa,xab,xac :
S split -13 1ignes.txt
S ls x*
xaa xab xac
S cat xaa
lignel
ligne2

ligne3
Modifierle préfixe x desnomsde fichiers de sortieen préfixe ligne :
S split -13 lignes.txt ligne
S ls 1igne??
ligneaa ligneab ligneac

6. Transformation de caractères : tr

La commandetr (translate)permetd&#39;appliquer
un traitementsur certainscaractè-
res d&#39;un
flux de données: suppression,substitutions...Cettecommandeexploite
uniquementlesdonnéesarrivantsur l&#39;entrée
standard.

Syntaxe
tr [ options ] ensemblel [ensemble2]
Principales options :
[ d caractères] La liste des caractères qui doivent être
supprimésdu flux de données.

Substitutionde caractères

Deuxensemblesde caractèresdoiventêtrespécifiés.Chaqueensemblecomportele
mêmenombrede caractères.Tout caractèrede ensemble] trouvédans le flux de
donnéesest substituépar le caractèrede mêmepositionsituédansensemble2.
Les commandes ltres
mumqnumumuSununmuuumunamanS_unu m uu mnanSSmmmummnunmum

Exemples
La chaîne abcd est traitée : chaquecaractèreb est transforméen 8, chaque
caractèred est transforméen 9.
S echoabcd | tr bd 89
a8c9
Il est possibled utiliserla notion d&#39;intervalles
de caractères,en utilisant des cro-
chets.Ici chaqueminusculeest transforméeen sa majusculecorrespondante :
5 echo abcd I tr "[a z]" "[A-Z]"
ABCD
Pourtraiter un fichier, il faut utiliser la redirection:
S tr "[a-z]" "[A-Z]" < fic.txt
CHRISTIE 12
VALERIE 18

Suppressionde caractères
L&#39;option
d permetde supprimercertainscaractèresdu flux de données.

Exemples
Transformationd&#39;un
fichier au format DOS (fin de lignes lrln") en un format
UNIX("in").Retraitdu caractère"il" :
S tr -d &#39;\r
< ficdos.txt > ficunix.txt
S od -C ficunix.txt
0000000 c h r i S t i e 1 2 \n V a l 351
reserved
0000020 r i e \t l 8 \n

All
rights
7. Dédoublonnage : uniq

E
ENI
- clitions
©La commandeuniq permetde dédoublonnerles lignesd&#39;un fichier. Seulesles
lignesidentiquesconsécutivessont traitées.Le résultatest stockédans un fichier
de sortie,si celui-ciest spécifié,sur la sortiestandarddansle cascontraire.

sh, ksh, bash


çhagitre9

Syntaxe
uniq [ options ] [ fichier_entree [ fichier_sortie ]
Principales options
d Affichage des doublons
-C Comptage des doublons

Exemples
Dans le fichier contactsJxt,les lignes 1,6,7 d&#39;une
part et 2,5,8 d&#39;autre
pari sont
identiques:
S nl ccntacts.txt
1 JoyeuxGiselle|12. rue de la Sourcel89290|Vaux|45.26.28.47
DehautOlivier|3 rue de Pussenvall75020rParis|78.25.96.78

mqmmSww
KaramaJosette|256 rue de la tempetel56100iLorient|85.26.45.58
Zanouri Joel|45/48 boulevard du Gardl56100\lorient}85/56/45/58
DehautOlivierl 3 rue de Pussenva1i75020|Paris478.25.96.78
JoyeuxGiselle|l2. rue de la Sourcei89290|Vauxl45.26.28.47
JoyeuxGiselle|l2. rue de la Sourcei89290|Vaux|45.26.28.47
DehautOlivier|3 rue de Pussenvall75020iParis!78.25.96.78
Le fichier est trié pour que les lignes identiquessoient consécutives:
S sort contacts.txt
DehautOlivier!3 rue de Pussenval|75020|Paris|78.25.96.78
DehautOlivier|3 rue de Pussenval1750201Paris|78.25.96.78
DehautOliVier|3 rue de Pussenvall750201Paris|78.25.96.78
JoyeuxGiselle|12. rue de la Sourcel89290iVauxy45.26.28.47
JoyeuxGiselle[12. rue de la SourceI89290|Vaux145.26.28.47
JoyeuxGiselle\l2. rue de la Source\89290|Vaux|45.26.28.47
KaramaJosette1256rue de la tempetel56100iLorient|85.26.45.58
Zanouri Joell45/48 boulevard du Gard|56lO0(lorient|85/56/45/58
Dédoublonnage
:
S sort contacts.txt I uniq
DehautOlivier|3 rue de Pussenval|75020|ParisJ78.25.96.78
JoyeuxGisellei12. rue de la Source|89290|Vauxl45.26.28.47
KaramaJosette(256 rue de la tempetel56100[LorientI85.26.45.58
Zanouri JoelI45/48 boulevard du Gardl56100]lorient|85/56/45/58

mmmu
Programmation
shellsousUnix/inux
ltres

Afficherdevantchaqueligne son nombred&#39;occurrences


dansle fichier :
S sort contacts.txt | uniq -c
3 DehautOlivier|3 rue de Pussenvali75020iParisi78.25.96.78
3 JoyeuxGiselle|12. rue de la Sourcel89290lVaux|45.26.28.47
1 KaramaJosette|256 rue de la tempetel56100|Lorienti85.26.45.58
l Zanouri Joel|45/48 boulevard du Gardi56100|lorient[85/56/45/58
Afficher uniquementles lignesayantdesdoublons:
S sort contacts.txt | uniq -d
DehautOlivieri3 rue de Pussenvali75020[Paris|78.25.96.78
JoyeuxGisellellz. rue de la Sourcei89290]Vaux|45.26.28.47
Mêmechose,avecle nombred&#39;occurrences
présentesdansle fichier :
S sort contacts.txt | uniq dc
3 DehautOlivier|3 rue de Pussenval|75020IParisi78.25.96.78
3 JoyeuxGiselle|12. rue de la Source!89290lVaux|45.26.28.47

E. compressions, archivages et conversions


1. Compressions: gzip, bzip2
Les commandesgzip/gunzip, bzip2/bunzip2 compressent/décompressent
chaque fichier passéen argumentsur la ligne de commande.La commande
bzip2 possèdeun meilleurtaux de compression.Cescommandesse trouventen
standardsur les systèmesLinux, et peuvents&#39;insta|ler
sur les systèmesUnix, si
eiies ne sont pas déjà présentes.La commandegzip produitl&#39;extension
.gz et la

rights
Ail
reserved
commandebzip2 produitl&#39;extension .bz2.

Syntaxe
degzlg
Compression:

ENI
Editions
-
gzip [ options ] [ fichier ... ]
Décompression :
gunzip [ options ] [ fichier ... ]
zcat [ options ] [ fichier ... ]
Principales options :
c Envoyerle résultat de la compression/décompressionsur
la sortie standard. La commande
gunzip -c est équivalente
©

sh, ksh, bash


Chapitre
9
à la commande zcat.
t Tester la validité de l&#39;archive
Sile nomdefichierestomis,lesdonnées
à traitersontluessurl&#39;entrée
standard.
Exemple
Compression
du fichierjava.doc:
S gzip java.doc
Lefichieroriginalestremplacé
parle fichiercompresse
:
S ls java*
java.doc.gz

Décompression
: lefichieroriginal
estrestitué
etremplace
lefichiercompressé
:
S gunzip java.doc
S ls java*
java.doc

Compression
avecenvoidu fluxcompressé surla sodiestandardf-c). Cettefa-
çondeprocéder
permetdeconserver
le fichieroriginal:
S gzip -c java.doc > java.doc.gz
S ls java*
java.doc jaVa.doc.gz
Décompresser
sanssupprimer
le fichiercompressé
:
S gunzip -c java.doc.gz > java.doc
Mêmechoseque ci dessusaveczcat .-
5 zcat java.doc.gz > java.dnc

Lescommandes
bzip2, bunzipz,etbzcat fonctionnent
demanière
similaire,
avecunelégèredifférencedansl&#39;utilisation
desoptions.
Syntaxede bzip2
Compression:
bzip2 [ options ] [ fichier ...]
Décompression :

Programmaionhell
ou Uni/Linux
andes ltre
bunzip2 [ fichier ... ]
bzip2 -d [ options ] [ fichier ...]
bzcat [ options ] [ fichier ... ]
Principales options :
c Envoyerle résultat de la compression/décompression sur
la sortie standard. La commande bzip2 -dc est équivalente
à la commande bzcat
-d Décompression
t Tester la validité de l&#39;archive

2. Archives tar
Lacommande
tar permetde créerunearchiveà partird&#39;un
ou plusieurs
fichiers.
Si le fichier est un répertoire,i| seraarchivéavecsa sous-arborescence.

Syntaxe
wmmmmmm
Création d&#39;une
archive
tar c [ zv] f archive fichierska_archiver ...
Vérification d&#39;une
archive
tar t [ zv] -f archive [ fichiers_a_verifier ... ]
Extraction d&#39;une
archive
tar x [ zv] -f archive [ fichiers_a_extraire ... ]
Principales options
-C Création d&#39;archive
t Vérification d&#39;archive
-x Extraction d&#39;archive
-f archive.tar Nomde l&#39;archiveà créer, vérifier ou extraire.
-f Dansle cas d&#39;une
création, le contenu de l&#39;archive
est envoyésur la sortie standard. En extraction et
vérification, le contenu de l&#39;archive
est attendu
sur l&#39;entrée
standard
wv Modeverbeux
ez SousLinux uniquement: permet de gérer la compression
en plus de l&#39;archivage.

reserved
Exemples
Archivage
et compression
du répertoire
docs: le fluxproduitpar la commande
rights
Al/
tar est envoyé
sur la sortiestandard(et par conséquentdansle tube),et récu-

ENI
Éditions
-
péréparla commande gzip quicompresse cefluxet le redirige
dansle fichier
docJangz.
S 1s -R docs
docs:
©
v4 nmaMw«
sh, ksh, bash
Chapitre9
java.doc php.doc shell.doc unix.doc xml.doc
S
5 tar cvf - docs | gzip -c > docs.tar.gz
docs/
docs/shell.doc
docs/java.dcC
docs/xml.doc
docs/unix.doc
docs/php.doc
Décompressionet extraction .- la commandegunzip décompressele fichier
docs.tar.gzet envoiele résultatsur la sortiestandard.La commandeta: exploite
le flux qui arrivedu tubeet en fait l&#39;extraction.
S gunzip c docs.tar.gz I tar xvf
docs/
ducs/shell.doc
docs/java.doc
docs/xml.doc
docs/unix.doc
docs/php.doc

D Dans
lecasci-dessus,
lesnoms
dansl&#39;archive
sontexprimés
enrelatif,
les
fichierssont doncrecréésà partirdu répertoirecourantlorsde la restauration.

3. Archives cpio

La commandecpio permetégalementde faire des archives.Contrairementà la


commandetar, elle n&#39;est
pasrécursive: tous les nomsde fichiersentrantdansla
compositionde l&#39;archive
doiventêtre lus sur l&#39;entrée
standard.L&#39;archive
est envoyée
sur la sortiestandard.Lacommandeest presquetoujoursutiliséederrièreun tube,
lui-mêmeprécédéde la commandefind, qui permetde générerles noms de
fichierssouhaités.
Envérificationet restauration,l&#39;archive
à traiterest attenduesur l&#39;entrée
standard.

Syntaxe
Création d&#39;une
archive 2
find . | cpio -0 [ cv ] > archive
Vérification d&#39;une
archive 2
Les commandes ltres

cpio -it [ cv ] < archive [ fichiers_à_vérifier 1


Extraction d&#39;une
archive :
cpio i [ cdv ] < archive [ fichiers_à_extraire]
Principales options :
Création/vérification/extraction archives ayant un format
-C
d&#39;end&#39;archive
tête portableentre les systèmes
Unix
d Extraction création des répertoires s&#39;ils
n&#39;existent
pas.
-i Extraction d&#39;archive
-it Vérification d&#39;archive
-0 Création d&#39;archive
v Modeverbeux

Exemples
Création
d&#39;une
archive
cpiocontenant
lerépertoire
docsetsasous-arborescenc
:

docs
S find docs

docs/shell.do
reserved
rights
AII
ENI
-
Éditions
©
Chagitre9
-rw r r - 1 christie ociensa 29 Jan 1 22:28 docs/jaVa.doc.gz
2 blocs
Créationet compressionde l&#39;archive
:
S find docs | cpio ocv I bzip2 -c > docs.cpio.bz2
docs
docs/shell.doc
docs/java.doc
docs/xml.doc
docs/unix.doc
docs/php.doc
docs/java.doc.gz
2 blocs

Décompression
et extractionde l&#39;archive
.-
S cd /tmp
S bzipz -de docs.cpio.bz2 | cpio icvd
docs
docs/shell.doc
docs/java.doc
docs/xml.doc
docs/unix.doc
docs/php.doc
Les commandes filtres
m mmmwumm

ëmtaxe
] [
dd [ if=fichier_entree of=fichier_sortie ] [ibs=nboctets]

[seek=nbblocsl
[obs=nboctets] [bs=nboctets] [skip=nbblocs]
[count=nbblocs]
Principales options
if=fichier_entree Fichier à traiter. Si aucun fichier njest
spécifié, l&#39;entrée
standard est traitee
of=fichier;s0rtie Fichier de sortie. Si aucunfichier n&#39;est
spécifié, la sortie standard est utilisée
ibs=nboctets Traiter les donnéesen entrée par blocs de
nboctets octets (défaut : 512 octets)
obs=nboctets Ecrire les donnéesen sortie par blocs de
nboctets octets (défaut : 512 octets)
bs=nboctets Traiter les donnéesd&#39;entrée
et de sortie
par blocs de nboctets
skip=nbblocs Sauter nbblocs en entrée avant de commencer
le traitement
seek=nbblocs En sortie, écrire à partir du bloc nbblocs
count=nbblocs Ecrire uniquementnbblocs de l&#39;entréevers
la sortie

Exemples
Copied&#39;un
disquesur un autre disquepar blocs de 8 kiIo octets:
# dd if:/dev/dsk/c0tOd0s2 oE=/dev/dsk/c0tld0s2bs=8k
Sauvegarde
sur bandedistante (machinesaturne)au format cpio gzippé :
# cd /expert/home
# find . | cpio -ocv I gzip -c | ssh saturne dd of=/dev/rmt/0 bs=1k
Restaurationà partir de la machinedistantesur la machinelocale :

A/l
rlghts
resarved
# cd /export/home
# ssh saturne dd if=/dev/rmt/0 bs=1k | gunzip -c | cpio icvd
Retirer les 3 premiersoctets parasitesdu fichier index.php. Chaquebloc fait l
octet, les 3 premiersblocs ne sont pas traités .-

Editions
ENl
- 5 od -c index.php I head 1
0000000357273277 < :2 p h p \r \n o
S dd bs=1 skip=3 if=index.php of=index2.php
S od -c index2.php | head -1
b _ s c a

© 0000000< ? p h p \r \n o b s t a r t (
Chagître9
Retirerle dernieroctet d&#39;un
fichier de taille 186 073 octets.La taille du bloc est
fixéeà 186 O72octets.Le nombrede blocstraitésest de 1 .-
5 ls -1 f1.txt
rw r- r 1 christie clients 186073Jan 4 18:48 f1.txt
S dd if=f1.txt of=f1tronque.txt hs=186072count=1
1+0records in
1+0records out
S ls -1 f1tronque.txt
rw-r- r 1 christie clients 186072Jan 4 18:49 f1tronque.txt
S

5. Changementd&#39;encodage
: iconv
La commandeiconv permetde transformerl&#39;encodage
d&#39;un
flux de données,typi-
quementde l&#39;encodage
"utf8"vers"iso8859 15"et inversement.

Syntaxe
iconv options [ fichier_à_traiter ]
Principales options :
-f encodage_entrée Encodagedu fichier d&#39;entrée
-t encodage_sortie Encodagedu fichier en sortie

Exemples
Conversiondu fichier utf8.txt (UTF 8)vers iso.txt 080885945) : le fichier
contientla suite de caractères"élève":
S od c utf8.txt
0000000303 251 l 303 250 V e
0000007
S iconv -f UTFB-t 130835915
utf8.txt > iso.txt
S od -c iso.txt
0000000351 1 350 v e
0000005

rogrammatiosell sousUi/Linu
es commandesltres
mamans

F. Commandes réseau sécurisées


Cettesectionprésente la commande à distance"ssh"
de connexion et la commande
transfert
defichierssftp.

1. Connexion à distance : ssh

Lacommande ssh (secureshell)permetde se connecter à unemachinedistante.


Lesdonnéeséchangées entrelesmachines sontcryptées,ce qui rendcettecom-
mandeplus intéressante
que ses homologues telnet et rlogin.L&#39;exécution
d&#39;une
commandeà distanceestégalement possible.

Syntaxe
Connexionà unemachinedistante :
ssh [-1 nonLlogin]nom_macbine
Exécutiond&#39;une
commande sur unemachinedistante :
sshnom&#39;login@nom_machine
[commande]
À la premièreconnexion
surun serveur,celui-cienvoiesa clé publique.Cetteclé
représente
l&#39;identifiant
uniquede la machine.
La commandessh demandeà l&#39;utilisateur
s&#39;il
reconnaît cettevaleurde clé et s&#39;il
acceptela connexion.Dansl&#39;affirmative,
la clé du serveurest stockéedansle
fichierSHOME/.ssh/known_hostsde la machinecliente.

D Théoriquement,
l&#39;utilisateur
delamachinecliente
doit
vérifier
auprès
del&#39;admi
nistrateur
de la machinedistanteque la clé proposée
est correcteavantd&#39;ac-
cepterla première
connexion.

reserved
rights
AIIPremièreconnexionau sen/eurwww.monsite.com : l&#39;utilisateur
étant"root"surla
machinelocale,ssh reprendcetteidentitésurla machinedistante:
# sshwww.monsite.com
- Theauthenticity
EN] of host &#39;www.monsite.com
(62.44.l16.l2)&#39;
can&#39;t
be
established.
RSAkey fingerprint is lf:7b:e4:99:b1:c7:56:59:a0:a8:b1:ed:56:7f:19:a3.
Editions
©
Are yousure youwantto continueconnecting(yes/no)?yes
Warning:Permanently (RSA)to
added&#39;www.monsite.com,62.39.106.10&#39;
wn
Eh,ksh,bash
Chapitre9
the list of knownhosts.
root@www.monsite.com&#39;s
password:*****
#
Seconnectersousl&#39;identité
christie sur la machinewww.monsite.com
:
# ssh -1 christie www.monsite.com
christie@ www.monsite.coms password:*****
Exécuterla commande1s -1 sur la machinedistante:
# sshwww.monsite.com
ls Al
root@www.monsite.coms password:*****

0 Sisshestutilisée
dans
unscript,
il estpossible
detester
sonstatut
deretour.
Si ssh échoue,elle retournele statut 255 (échecde connexionau serveurpar
exemple).Si une autre valeurest retournée,elle représentele statut retourné
par la commandedonnéeen argumentde ssh. Pour rappel, le statut de la
dernièrecommandeexécutées&#39;obtientpar Pintermédiaire
de la variable5?.

2. Transfert de fichier : sftp

La commandesftp (securefile transfer)permetde transférerdesfichiersde ma-


nièrecryptéeentre2 machines.Elle proposeune alternativeà la commandeftp.
la premièreconnexionsur une machinedistante,le comportementobservéest le
mêmeque pour la commandessh (cf. sectionConnexionà distance: ssh de ce
chapitre).
Syntaxe
sftp [ options ] [[nom_login@]nonLmachine[zfichier
[fichier]]
sftp [ options ] [[nonLlogin@]nonLmachine[:repertoire]
Principales options :
-b fichier Modebatch. Les commandes
"sftp" sont lues à partir de
fichier.
eb Modebatch. Les commandes
"sftp" sont lues à partir de
l&#39;entrée
standard.
Dansles exemplessuivants,la machinelocalese nommepluton, la machinedis-
tantevenus.

Programation
shellou UniLin
nnumnmunmumuuwmmummnmmuuùdmnnmmuunmmæ
L?
Exemples
Établir
uneconnexion
surlamachine
venus
envued&#39;un
transfert
defichiers.
Par
défaut,
sftpessaie
deseconnecter
sous
une
identité
identique
àcelle
del&#39;utili-
sateurdela machinelocale(christie).-
christie@pluton S sftp venus
Connectingto venus...
christie@venus&#39;s
password: ******
sftp>
Établir
uneconnexion
surlamachine
venus
sousl&#39;identité
root.-
christie@pluton S sftp rootevenus
Connectingto venus...
root@venus&#39;s
password:******
sftp>
Une
foislaconnexion
établie,
l&#39;utilisateur
seretrouve
auprompt
sftpd&#39;où
ilpour-
ra lancerdescommandessftp.

Aide sur les commandesde sftp

sftp> help
Available commands:
cd path Change
remotedirectory to &#39;path
lcd path Change
local directory to &#39;path&#39;

Quittersftp
sftp> quit
à a. Commandes

desftp
s&#39;executant
,
surlamachine
.
locale
,9Lacommande
2
sftppropose
des
commandes
internes.
.
Laplupart
reproduisent
.
le
Encomportement
decommandes
unix.Lenom
des commandes
commence
parla
ë lettre
"l",cequipermet
demémoriser
facilement
lefaitqu&#39;elles
s&#39;exécuten
sur
E lamachine
locale.
Lu
v:

.5
Chapitre9

Changer
derépertoire
sftp> lcd /tmp

Connaîtrele répertoire
courant

sftp> lpwd
Local workingdirectory: /tmp

Listerlesfichiers
durépertoire
courant
sftp> 11s
sftp> lls -l

Créerun répertoire
sftp> lmkdir /tm/christie

Échappement
versleshell
sftp> !
christieêpluton:/tmpswc-1 fl
christie@pluton:/tmps # . . autres commandes
unix ...
christie@pluton:/tmpsexit #
exit
sftp>
Pourrevenirà la commandesftp, il suffitde lancerla commandeexit au
niveaudushell.

Exécuterunecommande
Unixsurla machinelocale

sftp> ! commande_unix

0 Les
commandes
Unix
non
implémentées
parsftp
eninterne
doivent
êtreexécu-
téesdecettefaçon.

b. Commandes
s&#39;exécutant
surla machinedistante
La commandesftp proposedescommandes
internesqui permettent
d&#39;effectuer
uneactionsurla machinedistante.

Programmation
sellsous
nixinux
Changerde répertoire
sftp> cd ltlp

Listerles chiers

sftp> 1s
sftp> ls -1

Supprimer
unfichier
Sftp> rm /tmp/f1.txt

Créerun répertoire
sftp> mkdir/tmp/christie

Supprimer
unrépertoire
sftp> rmdir /tmp/christie

Renommer
unfichierouunrépertoire
sftp>rename
/tmp/f1.txt/tmp/f1new.txt
c. Commandes
detransfert
Les
commandes
detransfert
permettent
derécupérer
des
fichiers
delamachine
distante
vers
lamachine
locale
(get)
oud&#39;envoyer
des
fichiers
delamachine
iocaie
versla machinedistante(put).

Exemples
reserved
Changement
derépertoire
endistant
etenlocal
.-

rignts
A/I
sftp> cd /tmp
sftp> lcd /tmp
- Remote
ENI
sftp> pwd
workingdirectory: /tmp
sftp> lpwd
Editions
©
Localworkingdirectory: /tmp

sh,ksh,bash
Chapitre
9
Récupérerun fichier de la machinedistante (venus)dans le répertoirecourant
(/tmp)de la machinelocale(pluton):
sftp> get f1.txt
Récupérerdes fichiers de la machinedistantedans un répertoire(ltmp/christie)
de la machinelocale.-

sftp> pwd
Remoteworking directory: /tmp
sftp> get * /tmp/christie
Envoyerdes fichiers de la machine locale (pluton) vers la machine distante
(venus):
sftp> put *.txt

d. Connexionautomatiquesansmot de passe
ll est pratiquede pouvoirfairedestransfertsde fichiersentremachinesde manière
non interactive,et pourcela, l&#39;utilisateur
ne doit pasavoirà saisir le mot de passe
au clavier.La configurationqui permetl&#39;accès
à un compted&#39;une
machinedistante
sans avoir à fournir de mot de passeimpactel&#39;utilisation
des commandesssh,
sftp et scp (copiede fichierentredeuxmachines).

0 Laconnexion
sansmotdepasse
diminue
leniveau
desécurité,
cetteconfigura-
tion est doncà mettreen placeuniquementlorsquecelas&#39;avère
indispensable.

Lesétapesde la configurationsont les suivantes:


- À l&#39;aide
delacommande
ssh-keygen,l&#39;utilisateur
doitgénérer
surlamachine
localeune clé publiqueet une clé privée,sansutiliserde passphrase.Cesdeux
clés sont stockées en local respectivementdans les fichiers SHOME/
.ssh/id_rsa.pubet SHOME/.ssh/id_rsa (fichierspar défaut).Si le protocoleSSH
version2 est utilisé,il est possiblede créerdesclésde type RSAou DSA.
- La clé publique généréesur la machine locale doit être ajoutée au fichier
SHOME/.ssh/authorized_keys de la machine distante. Le répertoireSHOME
représentele répertoired&#39;accueil
du comptesous lequell&#39;utilisateur
souhaitese
connecter.Si le fichier .ssh/authorized_keys n&#39;existe
pas, il suffit de le créer
manuellement.

Programmation shell sous Unix/Linux


Lesommandes filtres
.nSSmwmnaSmmmmmm

Exemple
Créationdes cléspublique et privéede typeRSA:
christie@Pluton S ssh keygen-t rsa
Generatingpublic/private rsa key pair.
Enter file in which to save the key (/home/christie/.ssh/id_rsa): *
Created directory &#39;/home/christie/.ssh&#39;.
Enter passphrase(emptyfor no passphrase): *
Enter samepassphraseagain: *
Your identification has been saved in /home/christie/.ssh/id_rsa.
Your public key has beensaved in /home/christie/.ssh/id_rsa.pub.
The key fingerprint is:
37:57:48:f4:2b:99:4a:33:64:35:60:3l:43:27:78:47 christie@pluton
christie@pluton S Qd .ssh
S 1s -1
total 8
_rw___-

rw r r- 1 christieociensa
S cat id_rsa.pub
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAA
eDdezA/c1VBcrwANBCFZ6rLXm

rights
reserved
A/I
70e/SqjNIsyHWMF6V+jc/0m8XZx
1 christie ociensa 1675jan 9 22:16 id_rsa
399 jan 9 22:16 id_rsa.pub

ENI
Editions
- ZsteHQA2gp4cEhQbW03mYMDctCQHjHjBJiQ/A7
DFNEuuk/MfSyY3RHjYZg5BP57NRU5bIhzeDXtx

©
wiVIg1NLAFe2YQ==
christie@pluton
S
Sur la machine distante, ajout du contenu du fichier id_rsa.pub au fichier
Chapitre
9
L&#39;utilisateur
christie de la machineplutonpeut se connectersur la machine
venussousl&#39;identité
olive, sansavoirà fournir de mot de passe.
christie@plutonS ssh -1 olive venus
Last login: WedJan 9 22:30:33 2008 from xx.xx.xxx.xx
Linux 2.4.34.5.
S
Un exempled&#39;utilisation
non interactivede la commandesftp est fourni au cha-
pitreAspectsavancésde la programmation shell - Scriptd&#39;archivage
incrémentalet
transfertsftp automatique.

G. Autres commandes

1. La commande xargs

La commandexargs, placéederrièreun tube récupèreles chaînesreçuesen


argumentsur l&#39;entrée
standardet exécutecommande2en lui transmettantces
chaînesen tant qwargument.

Syntaxe
commandelI xargs [ options ] commande2
Principales options :
t Affiche la ou les commandesréellement lancées (trace de
l&#39;exécution)
n nbarg commande2 ne prendra que nbarg argumentset sera lancée
autant de fois que nécessaire
Dansles exemptesqui suivent,la commandetime est utiliséepour mesurerle
tempsd&#39;exécution
d&#39;une
commande.
Le résultats&#39;interprète
de la manièresuivante:
user: tempspasséà exécuterdu codeutilisateur
- sys : tempspasséà exécuterdu codenoyau
- reai ; duréed&#39;exécution
totale (user+ sys + inactivité)

Programmation
shll sousUnix/Linux
_ ÀEÏSË
Exemples
Recherchede tousles fichiers .txt et lancementde la commandegrep autant
de fois que de fichiers trouvés:
S cimefind / name"*.txt" -exec grep "php" (1 \; 2>&
real Om23.9lls
user 0mO.547s
sys 0m1.199s
Recherchede tousles fichiers .txt. Tousles nomsde fichiers émispar la com-
mandefind sont passésen argumentà la commandegrep, qui n&#39;est exécutée
qu&#39;une
seulefois :
S time find / -name"*.txt" execgrep "phP" C) \; 2>&-
real Om23.9l1s
user 0m0.547s
sys 0m1.l99s
Si la commandene supportepas un trop grand nombred&#39;arguments,
il est pos-
sible de spécifier le nombred&#39;arguments
maximum.Ici la commandegrep est
appeléeautant de fois que nécessaire,avec6 argumentsà chaqueappel.
S time find / -name"*.txt" I xaxgs -n6 grep "php" 2>&-
real Oml.l95s
user Om0.346s
sys OmO.528s
Tracerl&#39;exécution
de la commandeavecl&#39;option
t .-
S find . -name"*.txt" | xargs -t -nd wc -1
wc -1 ./histoire.txt ./douhle.txt ./who.txt ./contacts.txt
3 ./histoire.txt
3 ./double.txt
reserved7 ./who.txt
8 ./contacts.txt
rights
All 21 total
wc l ./notes_un_espace.txt ./filters/f.txt ./fic.txt ./notes.txt

Éditions
ENI
-
5 ./notes_un_espace.txt
1 ./filters/f.txt
8 ./fic.txt
5 ./notes.txt
19 total
©
muuwmmmmwwummmuuuuammmmnumuwmmmmnmmmmmm
sh, ksh, bash
ChaEitre9

wc l ./passwd.txt ./lignes.txt ./scripts/notes.txt ./francais.txt


6 ./passwd.txt
9 ./lignes.txt
22 ./scripts/notes.txt
3 ./francais.txt
40 total

2. Comparerdeux fichiers : cmp


La commandecmp comparedeuxfichiers textesou binaireset retourneun statut
vrai s&#39;ils
sont identiques,faux dans le cas contraire.Si les fichiers sont différents,
remplacementde la premièredifférenceest affiché.

Syntaxe
cmp [ options ] fichierl fichier2
Principales options
-s Modesilencieux
Si fichierl ou fichier2 sont remplacéspar " ", l&#39;entrée
standard est traitée.

Premierexemple
Comparaison
de deux fichiers différents :
S cmplignes1.txt lignes2.txt
lignesl.txt lignes2.txt sont différents: octet 8, ligne 2
S echo S?
1
Comparaison
de deux fichiers identiques:
S cmp1ignes2.txt lignes3.txt
S echo S?
0

rogrammation
hell sou Unxinux
Les commandes ltres

Deuxièmeexemple
Le script egaLshprend deux fichiers en argumentet les compare.L option s de
cmpfait travaillerla commandeen modesilencieux:

Snl egal.sh

1 if cmp
-s"S1""S2"; then
2 echo "Si et S2 identiques"
3 else
4 echo "S1 et S2differents"
5 fi
Appelavecdeuxfichiersdifférents:
S ega1.shlignes1.txt lignes2.txt
lignes1.txt et lignes2.txt differents
Appelavecdeuxfichiersidentiques:
S ega1.sh1ignes2.txt 1ignes3.txt
1ignes2.txt et lignes3.txt identiques

3. Lignescommunesà deux fichiers : comm


Lacommandecommpermetde connaîtreles lignescommunesà deuxfichiers.

0 Lesfichiers
doivent
êtrepréalablement
triés.
Syntaxe
reserved
comm[ option ] fichierl
Principales options
fichierz

All
rights
41
-2
N&#39;affiche
pas les lignes spécifiques à fichierl
N&#39;affiche
pas les lignes spécifiques à fichierz

Editions
ENI
-
v3 N&#39;affiche
pas les lignes communes aux 2 fichiers
Si fichierl ou fichierz sont remplacés
par "-", l&#39;entrée
standard est traitée.

Exemle
©
La commandecommaffiche trois colonnes: la premièrecolonnereprésenteles
lignesspécifiquesà f1, la secondecolonneles lignesspécifiquesà f2 et la troi-
sièmeIes lignescommunesà f1 et f2.
Chapitre9
S nl f1
l aaaa
hbbb
M
cccc
w
n dddd
Snl E2

1 bbbb
2 cccc
3 dddd
4 eeee
S commf1 E2

aaaa
bbbb
CCCC
dddd
eeee
Mêmechosesansafficher les lignesspécifiquesà f1 :
0 Annexes
A. Caractères dushell. . . . . . . . . . . . . 372
spéciaux
B. Commandes aushell. . . . . . . . . . . . . 373
internes
C. Ordre
d&#39;interprétation
d&#39;une . . . . . . . . . 375
commande
lî"" &#39;
7&#39;

Annexes

A. Caractères spéciaux du shell


Caractères sh (Bourne) ksh 88 bash Signification
espace oui oui oui Séparateurs
de mots sur la ligne
tabu|ation de commande.
saut de ligne
& oui oui oui Arrière-plan.
| < << > >> oui oui oui Tubeet redirections.
>] non oui oui Écrasement
d&#39;un
fichier(option
noclobber).
(cmde1;cmde2) oui oui oui Regroupementde commandes.
{cmde1;cmde2}
, oui oui oui Séparateurde commandes.
* ?[ l oui oui oui Expressions pour nomsde fichier
et case.
* 7[ ] non oui oui Expressions pour la commande
de test [[...]].
?() +0 *() non oui oui Expressions pour nomsde fichier
!() @() [[ ]] et case.
3Set M } oui oui oui Valeurd&#39;une variable.
oui oui oui Substitutionde commandes.
S0 non oui oui Substitutionde commandes.
&#39;...&#39; oui oui oui Caractèresde protection.

\
îlî(()) non oui oui Substitutiond&#39;expression
arith-
métique.
cmdel && cmde2 oui oui oui Opérateurslogiquesdu shell.
cmdel || cmde2
# oui oui oui Commentaire.
N non oui oui Répertoired&#39;accueil
de l&#39;utilisa-
teur.

Programationshell
Æ sos Unix/Linu
Annexes
mSmm

B. Commandes internes au shell

Commande sh (Bourne) ksh 88 bash Signification


! cmde non non oui Négationdu codede retourd&#39;une
commande.
(( )) non oui oui Arithmétique.
. script oui oui oui Faireexécuter
un scriptparle shell
courant.
: oui oui oui Renvoietoujoursvrai.
[...] oui oui oui Tests.
[[..]] non oui oui Tests.
= (var=va|eur) oui oui oui Affectationd&#39;une
variable.
alias non oui oui Création,visualisationd&#39;un
alias.
bg non oui oui Fairepasserun processusen
arrière-pian.
case oui oui oui Structurede contrôle.
cd oui oui oui Changement de répertoire.
echo oui oui oui Affichage.
env oui oui oui Listedesvariablesexportées.
eval oui oui oui Doubléévaluation.
exec oui oui oui Redirections/remplacement du shell
par une commande.
exit oui oui oui Quitterun shell.
export oui oui oui Exportation
d&#39;une
variable.
reserved
expr
f1() oui
oui oui
oui
oui
oui
Arithmétique.
Définitiond&#39;une
fonction.
AII
rights
fc non oui oui Historiquede commandes.
EN/
- fg non oui oui Fairepasserun processusen
avant-plan.

Editions
for
© functionfl
oui
non
oui
oui
oui
oui
Structurede contrôle.
Définitiond&#39;une
fonction.

sh, ksh, bash


Annexes

Commande sh (Bourne) ksh 88 bash Signification


getopts oui oui oui Analysedes optionsd&#39;un
script.
if oui oui oui Structurede contrôle.
jobs non oui oui Listedes processusen arrière-plan.
kill oui oui oui Envoide signal.
let non oui oui Arithmétique.
newgrp oui oui non Changement de groupe.
print non oui non Affichage.
pwd oui oui oui Répertoirecourant.
read oui oui oui Lecture.
readonly oui oui oui Définitiond&#39;une
variableaccessible
en lectureseule.
return oui oui oui Sortied&#39;une
fonction.
select non oui oui Structurede contrôle.
set oui oui oui Listedes variables.
set e1 e2 e3 oui oui oui Affectationdes paramètresposi-
tionnels.
set -o non oui oui Gestiondes options.
shi oui oui oui Décalagedes arguments.
test oui oui oui Tests.
time non oui oui Tempsd&#39;exécution
d&#39;un
pipeline.
cmde|cmde
times cmde oui oui oui Tempsd&#39;exécution
d&#39;une
comman-
de.
trap oui oui oui Gestiondes signaux.
typeset non oui oui Définitiondes propriétésd&#39;une
va-
riable.
ulimit oui oui oui Limitesdes ressources.
umask oui oui oui Gestionde l&#39;umask.
unalias non oui oui Suppressiond&#39;un
alias.

Arogramtio shelsousUni/Linux
Commande
sh(Bourne)
ksh88bash Signification
unset oui oui oui Suppression
d&#39;une
variable.
until oui oui oui Structure
decontrôle.
wait oui oui oui Attente
delamort
d&#39;un
processus.
whence non oui non Indique commande
siune estin-
terne ou externe.
Lwhile oui oui oui Structure
decontrôle.
0 Le"!"quiinverse
lecode
d&#39;une
commande
n&#39;est
pas
décrit
dans
laksh88,
maisdans la pratiqueil fonctionne.

C.Ordred&#39;interprétation
d&#39;une
commande
Leshellinterprète
unecommande
dansl&#39;ordre
suivant
:
- Isolement
desmots
séparés
parlecaractère
espace,
tabulation
ousaut
de
ligne ;
- Traitement
descaractères
deprotection
( , " ", \) ;
- Substitutiondes variables(35);
- Substitution
descommandes
( S0) ;
- Substitution
des caractères
degénération
denoms
defichiers
(*,?,[],etc.)
;
- Traitementdes tubeset redirections;
- Lepremier
motrésultant
dessubstitutions
précédentes
estconsidéré
comme
étantlacommandeà lancer.
Leshell recherche
d&#39;abord
lacommande danssa
liste
d&#39;alias.
Sicelle-ci
n&#39;est
pas
trouvée, leshell
recherche
dans sescommandes
internes.
S&#39;il
netrouvetoujours
rien,
il recherche
danslalistedesfonctions
qui
ontdéjàétédéfinies.
Endernier
lieu,il recherche
unecommande externe
ense
reserved
servantde la variablePATH.
rights
AII
ENI
-

Éditions
©

sh, ksh, bash


Index

l ;,36
commande[[ 1], 159
commande<( )), 167
commandetest, 154
Kexpression)
commande[[ 1], 158
aveccase,180
nomsde fichier, 34
#, 134
dansawk, 296
#!, 127
#?, 246
5B,76
expressionrégulière,266
3l, 142, 254
îiS#,135
paramètrespositionnelsd&#39;une
fonction,216
8S, 141
î expression-arithmétique)), 170
commande), 119
3*, 135
comparaisonavec5C}, 200
paramètrespositionnelsd&#39;une
fonction,216
5?, 139
S@, 135
comparaisonavec5*, 200
paramètrespositionnelsd&#39;une
fonction,216
3S{#variabie},203
R{variab|e##modè|e},204
îii{variable#modele},204
S{variabie%%modèie}, 205
s{variable%modèle},205
Mvariable message},118
S{variab|e:+vaieur},118
3S{variab|e:=va|eur},
117

Programmation sheii sous Unix/Linux


Mvariablervaleur},11 7
Sävariable},116
30, 135
variableawk, 291
S1 S9, 2H10}
paramètrespositionnelsd&#39;une
fonction,216
S1, S52...ElSNF
variablesawk, 291
&,73

dans
sed,
285
&-, 229
&&

commande
[[]],159
commande(( )), 167
opérateurdu shell, 160
&1, 50
&2, 50
(),63
définition
d&#39;une
fonction,
210
((expression_arithmétique)),
166
(erl)
expression
régulière,
269
*
sh,AV sh A case,
179
Index

.kshrc,107, 132
.profi|e,103, 107, 132
faire relireau shell, 105
.sh_history,93
/dev/null,42
/etc/profile,103, 110

commandeinterne,189
opérateurde expr,274

case,1 79
expressionrégulière,269
nomsde fichier, 31
?(expression)
commande[[ l], 158
aveccase,180
nomsde fichier, 33
@(expression)
commande[[ l], 158
aveccase,180
nomsde fichier, 34
\, 122
\(ERb\)
expressionrégulière,269
\\, 28
\{m.\}
expressionrégulière,269
\{m,n\}
expressionrégulière,269
\{m\}
expressionrégulière,269
\<
expressionrégulière,266
\>
expressionrégulière,266
\1, \2,
expressionrégulière,269
\a, 28
\b, 28

Programmation
shellous Unix/Linux
Index
u
\c, 27 - 28
expressionrégulière,267
\f, 28
\h, 82
\n, 26, 28
\oxxx,28
\r, 28
\t, 28
\u, 82
\v, 28
\W, 82
\W, 82
{ }, 63
[]

noms
defichier,
31
[ expressionl, 148
[[1],156

tests
sur
les
chaînes,
156
[labc]. 1 79
[!a z]

noms
defichier,
32
[" liste_de_ca
ractères]
expressionrégulières,266
[abc]

avec
case,
179
[liste_de_caractères]
__D, 97
commande, 119
|, 53
tubesawk, 301
ll
commande[[ ]], 159
opérateurde (( )), 167
opérateurdu shell, 161
N, 28
+
expression
régulière,
269
+(expression)
commande
[[]],158
aveccase,180
nomsde fichier, 33
, 77
>
redirectionawk, 301
>>
redirectionawk, 301
O>, 225
1>, 225
2>, 53, 225
2>&1, 225
-a
commandetest, 154
-e, 27
-0
commandetest, 154

on
Alias,92, 104
définir,92
en bash, 109
en ksh, 107
visualiser,92
x, 104
Alternatives

commande
[[1],158
nomsde fichier, 35
Anti-quote,119
Antislash,122
Apostrophe,120
ARGC,291
Argument
décalage
avec
shift,
137
d&#39;un
script, 135
d&#39;une
fonction,216
lignedecommande
awk,310
ARGV,291
Arithmétique,163
Arrière-plan,
73, 253
atan2, 313
Avant plan,73
awk, 266, 290

B bash,
19
-20de connexion,109
ordinaire,109
BASH_ENV, 109
BEGIN,296
Bloc,235
Iundex
until, 192
while, 187
BourneAgainSheil, 19
sessionutilisant un, 109
BourneSheil, 18
sessionutilisant un, 106
break,196
bzip2, 351

C Calcul,
163
Caractère
de protection,120
d&#39;échappement,
28
Caractèresspéciaux
des expressions régulières,266
du shell, 124
récapitulatif,372
case,178
cat,
328
-v,98
cd, 24
chmod,127
close,317
cmp, 368
Codede retour
d&#39;un
script shell, 140
comm,369
Commande

externe,
22
filtre, 328
Commandeinterne
récapitulatif,373
Commentaire,134
Complétion
dubash,
99
du ksh, 100
continue,196
cos, 313
Critèresde sélection
dansawk, 293
csh, 18, 20
C-shell,18
cut, 58, 342

d (delete)
danssecl,283
dd, 356
Débogguer, 1 71
Découper
une lignede champs,237
delete,310
Descripteur
de fichier, 37
entre 3 et 9, 228
Doubleévaluation,238
do-while
dansawk, 305

sh, ksh, bash


Index

E echo,
26 affichage,26
e, 26 - 27
»n,27
egrep,266
emacs

éditeur
detexte,
96
option du shell, 91, 96
END,296
Entréestandard,37
Entrées/sorties,
225
env, 85
ENV,104, 107
ENVIRON,291
er11er2|er3
expression
régulière,
270
ERb,266
ERe,266
eval, 238 - 239
exec,225
EXINIT,85, 87, 104
exit, 90, 140
dansawk, 306
exp, 313
expert,86
expr, 163, 266
opérateur:, 274
Expressionrégulière,266
avecexpr,274
avecgrep, 272
avecvi, 271
extglob,33, 158, 180
Faux

valeur
devérité
dushell,
139
Fichier

d&#39;environnement,
102
écriture,229
fermeture,229
gestion,228
lecture,229
ouverture,228
traitement,230
file, 22
FILENAME,291
Filtre,56
Fin de fichier
à partir du clavier,44
Flèche
rappel
decommandes,
97
Fonction,209
appelde, 210
exploiterl&#39;affichage,
218
intégréedansawk, 312
statut de retour,211
utilisateurdansawk, 319
for,
184

ËFÏ,
ksh,bash
dans
awk,
304
Index

G getline,
313
getopts,247
grep, 61, 266, 331
statut d&#39;erreur,
140
gsub,312
Guillemet,123
gzip, 351

H head,
335
Historique
de commandes,93
du shell, 18
HOME,77, 86
HUP,240

I iconv,
358
if, 1 74
dansawk, 304
utilisationavectest, 155
IFS,144, 147, 237
ignoreeof,90
index,312
int, 313
INT, 241

..
K KlLL,
241
KornSheli
de connexion,107
ordinaire,108
sessionutilisant un, 107
ksh, 19
x, 172
ksh 88, 19
ksh 93, 19

l length,
312
iet, 169
Lignede commande
ordred&#39;interprétation,
124
Linux,19
iog, 313
LOGNAME, 84, 86
Longueur
d&#39;une
variable,203
Is, 24

M mail,
44,
55
match,312
Mémorisation
expression
régulière,
286
Miseau point, 171
more,60

ÉË,ksh,bash
Index

N Négation
dans
sed,
284
next,303
NF, 291
nl, 337
noclobber,90
NR, 291

0 0d,
147,
330
OFS,290
Opérateur
dans
awk,
298
du shell, 160
Opérateurlogique
commandetest ([, 154, 159
OPTARG,248
OPTIND,248
Option
dusheil,
89,104
d&#39;un
script (analyse),247
en bash,109
passwd
commande,
37
paste,345
PATH,77, 85 - 86, 104
Perl,22
PID

dudernier
processus
lancé
enarrière-pian,
142
du shell interprétantun script, 141
pipe, 53
POSiX,19
pr, 338
print,
222
-u,229
printf, 223
dansawk, 300
Processus
enarrière-plan,
73,
253
Prompt
répertoire
courant
dans,
80,82
PS1,79, 85 - 86,104
PS2,83, 85 - 86
PS3,246
pwd, 25
PWD,79, 86
Index

R rand,
313
Rappelde commandes
en bash,99
en ksh, 94
read,
144
"d,146
caractéristiques de, 230
statut de retour,146
u, 229
Redirection,37
awk, 301
de l&#39;entrée
standard,44
descripteurs1 et 2 vers le mêmefichier, 45
d&#39;un
bloc, 235
éliminerles affichages,42
entréestandardd&#39;unscript, 225
exécutiondu script, 231
fermetured&#39;un
descripteur,53
mécanismeinterne,43
sortied&#39;erreur
standard,40
sortiestandard,39
sortiestandardet sortied&#39;erreur
standard,41
sortiestandardet sortied&#39;erreurstandardd&#39;un
script, 225
Regroupement

decommandes,
62
REPLY,246
return,211
RS,290
Scriptshell
choix de Finterpréteur,127
définition,125
erreursau lancement,128
exécutionpar le shell courant,132
exécutionpar un shell enfant,126
sed, 266, 280
script, 287
select,245
Séparateur
Index
decommandes,
36
set,
76
+0,89
initiaiisationdes paramètrespositionnels,209
-o, 89
-x, 1 71
sftp,
360
automatique,
255
sh, 18 19
Sheli
deconnexion,
102
définition,18
shift, 137
shopt, 33, 158, 180, 206
Signal,240
ignorer,241
sh, ksh, bash modifierle traitementassocié,242
repositionnerle traitementpar défaut,243
Index

Structurede contrôle,174
sub, 312
Substitution

decommandes,
119
de nomsde fichiers,30
de variables,117, 203
d&#39;expressions
arithmétiques,170
substr,312
system,318

l Tableau,
206 assignement global,207
assignerun élément,206
dansawk, 307
longueurd&#39;un
élément,208
nombred&#39;éléments,
208
référencertous les éléments,208
référencerun élément,206
tail, 334
tar, 353
tee, 61, 336
TERM,84 - 86, 241
Terminerun script
dansawk, 306
Test,
148
dans
awk,
295
sur les chaînesde caractères,151
sur les fichiers,148
sur les nombres,153
test expression,148
trap,
240

àpartir
d&#39;un
script
shell,
244
true

commande
interne,
189
Tube,53
dupliquerles sorties,61
envoyerla sortiestandardet la sortied erreur,62
mécanismeinterne,54
type, 24
typeset,214

umask,104
uniq, 349
unset,115
until, 192

Variable
affichagede la valeur,76
dansawk, 296
d&#39;environnement,
76, 103
devantêtre exportée,86
exportation,85
globale,214
indéfinie,115
sh, lGh, bash isoler le nom, 116
Iandex
retirerla définition,115
retirerle plus grandfragmentà droite,205
retirerle plus grandfragmentà gauche,204
retirerle plus petit fragmentà droite,205
retirerle plus petit fragmentà gauche,204
utilisateur,114
vi, 85, 266
optiondu shell, 91, 94
Vrai
valeur
devérité
dushell,
139

w (write)
danssed, 284
wait, 253
wc, 56, 340
while, 187
dansawk, 305
who, 56
write, 55

x xargs,
366
xtrace,92, 171

Vous aimerez peut-être aussi