Ï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.
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
}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
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
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
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
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. . . . . . . . . . . . . . . . . . . . . . .
PPNFN
119
Définition. . . . . . . . . . . . . . . . . . . . . . . . .
Exécutiond'un
script par un shell enfant.
Exécutiond'un
script par le shell courant.
.
.
.
.
. .
. .
.
.
.
.
.
.
.
.
. .
. .
.
.
120
Commentaires . . . . . . . . . . . . . . . . . . . . . . .
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
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
L. Substitutiond'expressions
arithmétiques. . . . . . . . 170
M. Miseau pointd'unscript.
. . . . . . . . . . . . . . 171
1. Option-x . . . . . . . . . . . . . . . . . . . . . . . . . 171
2. Autresoptions. . . . . . . . . . . . . . . . . . . . . . . 174
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.ê
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
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
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
M. Script d'archivage
incrémental et transfert sftp automatique 255
1. Objectif
. . . . . . . . . . . . . . . . . . . . . . . . . . 255
2. LefichieruploadBackup.sh . . . . . . . . . . . . . . . . . 258
3. Lefichierfonctions.inc.sh
. . . . . . . . . . . . . . . . . . 260
A Introduction . . . . . . . . . . . . . . . . . . . . 266
E. Exploitation
desexpressions
régulièrespar lescommandes 271
1. Lacommande vi . . . . . . . . . . . . . . . . . . . . . . 271
2. Lacommande grep. . . . . . . . . . . . . . . . . . . . . 272
3. Lacommande expr. . . . . . . . . . . . . . . . . . . . . 274
4. sedet awk . . . . . . . . . . . . . . . . . . . . . . . . 277
B. Exemples . . . . . . . . . . . . . . . . . . . . . 282
1. Utilisation
deseden lignedecommande. . . . . . . . . . . 282
a. Lacommande d (delete). . . . . . . . . . . . . . . . . 283
b. Lacommande p (print). . . . . . . . . . . . . . . . . . 283
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
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
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
L. Exemplesdescripts. . . . . . . . . . . . . . 321
1. Analysed'un
fichier de log. . . . . . . . . . . . . . . . . . 321
2. Générationd'un
fichier d'étiquettes
. . . . . . . . . . . . . . 323
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
G.Autrescommandes.................366
1. La commandexargs . . . . . . . . . . . . . . . . . . . . 366
2. Comparerdeuxfichiers : cmp . . . . . . . . . . . . . . . . 368
3. Lignescommunesà deuxfichiers : comm . . . . . . . . . . . 369
Annexes
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
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.
/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
-
©
é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.
IPFFP
Affichage à l'écran
. . . . . . . . . . . . . . . . . 26
Le caractère (tilde) . . . . . . . . . . . . . . . . 28
La commande interne cd . . . . . . . . . . . . . . . 30
Séparateur de commandes . . . . . . . . . . . . . . 36
Redirections . . . . . . . . . . . . . . . . . . . . 37
. Tubes de communication. . . . . . . . . . . . . . . 53
Regroupement de commandes . . . . . . . . . . . . 62
Processusen arrière-plan . . . . . . . . . . . . . . 73
Seller .
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
o L'argument
delacommande
file estunnomde chierexprimé
enrelatif
ou
en absolu.
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
É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).
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
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 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).
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.
É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
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
©
D. La commande interne cd
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
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
©
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).
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.
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
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
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
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.
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
-
©
2. Héritage
Ü 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
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.
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
Doubleredirection
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
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).
©
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
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
ksh ksh
PID=2D1
PID=2Ü5
0 î message
Üqîfdevfptsfl
îh fdevfptsll 1
îÿ fdevfptsfl
vrdevrptsr1 2 b fdevf tsïl
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'on
ouvre
deux
foislemêmefichier
(ce
quiestparfaitement
légal
auseind'un
même processus),
maisqu'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'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'as-
socieaudescripteur
1 (1, 2, 3, 4, 5). Lorsqu'un
processus
ouvreunfichier,il y a
toujours
unenregistrement
alloué
danslatabledesfichiers
ouverts
dunoyau(2)
(celle-ci
regroupe
toutes
lesouvertures
defichierdusystèmeà uninstant
donné).
L'enregistrement
contient le moded'ouverture
du fichier(ici écriture),
ainsique
l'emplacement
courantdanslefichier(ici,l'écriture
surledescripteur 1 commence-
raendébutdefichier).
Leposte1 (1)dela tabledesdescripteurs defichiers
du
processus
contient
unpointeur
(p2)versl'enregistrement
delatabledesfichiers
ouverts.
Traitementde la redirection2> resu :
Leshellouvrede nouveau
le fichierresuen écriture(6, 7, 3, 4, 5) (le fichierest
écrasé,
cequin'est
pasgrave
puisque
latailleétaità 0) et l'associe
audescrip-
teur 2. Un nouvelenregistrement
est créé dans la table des fichiersouverts
(p3)(7).Lesopérations
d'é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'é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 ' '
'"°"°,ïïj'îÿÿ"
_. raziezazäï:
F(5)
' F h'
© 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'offset
0 (2). Puis, l'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'erreur
de 10 octets(5) ;
- ceux-ciserontécrits en début de fichier (l'offset
du descripteur2 vaut 0 (7)), et
vont donc écraser le messageécrit précédemment(8). L'offset de la sortie
d'erreur
passeraensuiteà 10 (7).
Conclusion: le fichier est inexploitablepuisqueles messagesd'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'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'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'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'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'y
a pas d'allocation
d'un
nouvelenregistrementdans
la table des fichiersouvertsdu noyau.Lesécrituresultérieures,qu'elles
soientémi-
ses par la sortieou la sortied'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)
Éditions
ENI
- La syntaxe1> resu 2>&1 n'est
cas, la sortied'erreur
pas équivalenteà 2>&1 1>resu. Dansle second
standardest redirigéevers la sortiestandard,c'est-à-dire
vers
le terminal. Puis la sortie standardest associéeau fichier resu. Conclusion: les
messagesd'erreur
sont dirigés vers le terminal et les messagesrésultat dans le
© fichier resu.
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'é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'entrée standard de la
commande.
Exemple
S mail olive <<FIN
Mécanismes essentiels du shell
c. Fermetured'un
descripteur
Descripteurfermé Conséquence
O commande<&- L'entrée
standardde la commandeest
fermée, cette dernièrene pourra donc
pas s'en
servir pour recevoirdes don-
nées.
1 commande>& La sortiestandardde la commandeest
fermée, cette dernièrene pourra donc
pas s'en
servir.Aucunmessagerésultat
ne pourras'afficher
à l'écran.
2 commande2>&- La sortie d'erreur
standardde la com-
mande est fermée, cette dernière ne
pourra donc pas s'enservir. Aucun
messaged'erreur
ne pourras'afficher
à
l'é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
-
©
fork
(1)
ksh ksh
PID=2Ü5 (2) PID=2Ü6
n o
1 (3)
2 (4) 2
1
1ershell 2èmeshell
enfant enfant
Lesshellsenfantsn'ont
rien d'autre
à faire et chacunva se remplaceravecsa com-
mande (5a et 5b). Chaquecommandecommencealors à s'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'extraction
des donnéescontenuesdans le tube.
Quelquesremarquesimportantes
- La sortied'erreur
standardde la commandede gauchene part pas dansle tube.
- Pour que l'utilisation
d'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.
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'a
aucun besoinde le
faire puisqu'elle
a reçu un nom de fichier en argument,c'est
donc le contenude
ce dernier qu'elle
va traiter. Placer cette commandederrière un tube n'est
pas
impossible
maisest inutilecarla commande
n'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'apparaîtra donc pas à
l'écran.
Par contre la commandewc se moque éperdumentde son entrée stan-
dard (puisqu'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.
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'.'
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'ar-
gument [ file . . . ] est facultatif, ce qui est unepremièreindication.
S manwc
SYNOPSIS
All
rights
reserved
wc[-ci-mi-C] [-lw] [file...]
ENl
Éditions
- file A path nameof an input file. If no file operands
are specified, the standard input will be used.
- Uneautrepossibilité
consisteà testerla commande
sansdonnerde nomde
fichier en argument:
Premierexemple
Voiciunecommande
qui traiteun fichier.Ellene déclenche
pasde lecturede
l'entrée
standard:
S cut -d :'
-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':'
-f1,3 letc/passwd
root:0 (Sortie standard)
bin:1 (Sortie standard)
daemon:2 (Sortie standard)
admz3 (Sortie standard)
Programmationsheli sousUnix/Linux
Mécanismes essentiels du sheii
Deuxièmeexemple
Voiciune autre commandequi traite un fichier. Elle ne déclenchepas de lecture
de l'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'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'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'un
tube ou sur un terminal.
C'est
le cas de la commandemore :
Exemples
La commandemore reçoit un nom de fichier en argumentet pagineson contenu
à l'é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'erreur (l'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'un
tube,
Dansce cas, elle lit son entréestandardet pagine les lignesqu'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'utilisateur
christie .-
S who | grep christie | wc -1
3
b. Dupliquerles sorties
La commandetee permet de visualiserun résultatà l'é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'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'erreur
standarddansletube
Exemples
Lacommande
suivanteafficheunmessage
d'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'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'est
ce dernier
qui traite la lignede commande(avecduplicationsultérieuressi nécessaire).
Premierexemple
Ici, l'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'occupe
redirection(2), se duplique ensuite pour l'exécution
d'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'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'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)
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)
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'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'exemple
ci-dessus,il y
a créationd'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'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'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)
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'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
ksh
PID=
2U1
l
Ü
1 et» [devfpts/
1
2
L'association
descripteur1
AII
rights
reserved
"fdev/ptsjl" est sauvegardée (1)
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 '
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'association
descripteur
1 "fdev/ptsfl"(11)
© Ü
EËLËRÊÆLÊ
Deuxièmeexemple
Ici, Penvironnement
du shelldepremierniveauvaêtremodifié,ce qui n'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'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,'
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)
3. Conclusion
All
rights
reserved
J. Processus en arrière-plan
Les notionsd'arrière
et plan
d'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'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'une
nouvellecommande.Comme le shell et la commande
s'exécutent
en parallèle et qu'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'.\np/resu
2 >/dev/nu1l&
[l] 8247
S
Programmation
she||sousUnix/Linx
9 Chapitre
3 : Paramétrage
de l'environnement
de travail
Variables
d'environnement
. . . . . . . . . . . . . . 76
F9997?
dushell. . . . . . . . . . . . . . . . .
Lesoptions 89
Lesalias. . . . . . . . . . . . . . . . . . . . . . 92
Historique . . . . . . . . . . . . . .
decommandes 93
Lesfichiersd'environnement
. . . . . . . . . . . . . 102
gitan"? 3 V.
A. Variables d'environnement
à l'utilisateur
Lesthèmesabordésdansce chapitrepermettront de paramétrer
son
environnement
detravailentenantcomptedushellutilisé.
Un certainnombrede variablessontdéfiniesdansl'environnement
du shell.Elles
contiennent
desinformationsnécessaires
au fonctionnement
de Pinterpréteur
et/ou
descommandes lancéesà partirdecelui-ci.
Exemple
S set
HOME:/home/christie
LOGNAME=christie
PATH=/usr/bin:/bin
'
Ps1='s
PS2=> '
'
TERM=Vt1OO
Paramétrage
del'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'interpréter
ceux-cien entourantla valeuravecdes simplesquotes.
0 Utiliser
dessimples
quotes
estl'une
destroismanières
demasquer
descarac-
tèresen shell. Ce point seradétailléultérieurement.
Exemple
Le symbole">" (redirection)doit être masqué,l'espace
(séparateurde mots sur la
ligne de commande)également:
S variab1e= motl mot2 =>'
S echo Svariable
motl mot2 =>
5
0 ll nefautpasmettre
d'espace
autour
dusigne
=. Leshell
necomprendrait
pas
qu'il
s'agit
d'une
affectation.
4. Principales variables
A/l
rights
reserved
a. HOME
Cettevariablecontient la valeur du répertoired'accueil
pas être modifiée.
de l'utilisateur.
Elle ne doit
Editians
EN/
- b. PATH
La variable PATHcontient une liste de répertoiresqui sont exploréspar le shell
lorsqu'une
commandeexterneest lancée.
©
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'est
pas trouvée:
S ping localhost
ksh: ping: not found
S
La commandeest située dans le répertoire/usr/sbin qui n'est
pas cité dans la
variablePATH:
S find / nameping 2> /dev/null
/usr/sbin/ping
S
Le répertoirecourantn'est
pas explorés'il
n'est
pas cité dansPATH.-
S cd /us:/sbin
Paramétrage
de l'environnement
de travail
Modifier le contenude la variablePATH:
s PATH=SPATH : /usr/shin
S echo SPATH
/usr/bin:/bin:/usr/sbin
S
Rechercher
,.
unecommande
dansle répertoire
courant
Pour
qu'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'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='Entrez
une commande =>
Entrez une Commande => date
Thu Jan 3o 17:27:51 MET2003
Entrez une commande =>
©
Exemple
Ici, le prompt est composede deuxcaractères: le symbole"î" suivi d'un
espace
(cf. Figure1) :
VariableValeur Exportation?
Spwd
Ünome/christie
S
Paramétra e de l'environnement
de travail
s
SPs1='SPWDS' -'
Khome/ christie
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'employer
la mêmetechnique queci-dessus.ll existecependanten
bashdesséquences d'échappement
possédantunesignification
particulière
qu'il
est
pratiqued'utiliser
pourinitialiserPS1.Letableausuivantprésente lesprincipales l
séquences:
Séquence
d'échappement Valeur
\u Nom
del'utilisateur
\h Nom
delamachine
\w Répertoire
courant
\W Partieterminaledu répertoirecourant
0 Lesséquences
d'échappement
doivent
toujours
êtreplacées
entrequotes
(sim-
plesou doubles).
Programmation
shellsousUnix/Linu)?
Paramétrage
de l'environnement
de travail
Exemple
Promptdu bash .-
S
Modificationdu prompt de telle sorte qu'apparaisse
le nom de la machine suivi
du répertoirecourant:
s Ps1='\h@\wS
'
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'accueil
del'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 * '
(Résultat de l'exécution)
ENI
E
©
- ditions
je
dois
fermer maquote
S
{DVVVU}
Salut
Comment vas tu ?
% (Fin de la commande
f. TMOUT
Cettevariablecontientun délai expriméen secondes.Si aucuneinteractionavecle
claviern'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'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'utilisateur
connecté.
S echo SLOGNAME
christie
S
Progratinsell sousUnix/Linux
i. Processus
et variablesd'environnement
Lesvariablesd'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).
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.
c. Exporterune variable
Une variable exportéeau niveaud'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'éditeur.
Progammation
seil sousUnix/Linu
,,Prétrae e "evîot d il
La figure 4 montrequ'une
variablenon exportéen'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='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
Deuxièmeexemple
La figure 5 montre qu'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='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"),'
7}
Exportäzinn?
__
fhome/christie (2)
setnumher
Syntaxe
set -o option
set +0 option
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
3. Principales options
a. ignoreeof
Pourquitter un shell, il existedeuxméthodes:
- la commandeexit ;
- la séquencede touchesAd.
Si l'option
ignoreeof est activée,il devientimpossiblede quitter le shell en ap-
puyantsur d.
L'option
est désactivéepar défaut.
Exemple
S set -o ignoreeof
S Ad (Saisie Ad)
Use exit'
to terminate this shell
b. noclobber
Lorsqu'uneredirectionest faite vers un fichier déjà existant,celui»ciest écrasésans
sommation (sous réservedes permissions).Pour être averti de l'existence du
fichier, il faut activerl'option
noclobber.
Exemple
L'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'environnement
detravail
rw-r r 1 christie christie 8 jan 31 17:04 resu
S cat resu
Bonjour
S
Activationde l'option
noclobber :
S set -o noclobber
Impossibled'écraser
resu:
S echoMerci noclohber > resu
ksh: resu: file already exists
5 cat resu
Au revoir
S
Pour
forcer
l'écrasement,
il faututiliser
laredirection
>| .-
3 echoMerci noclohber >| resu
S cat resu
Merci noclobber
S
L'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'option
emacsestactivéepardéfaut.
C. Les alias
ksh bash
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='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='c1ear'
S alias rm= rm-i
S rm out
rm: removeout (y/n)? n
S
c=clear
functions='typeset
-f
history='fc
l'
integer='typeset
-i'
l='ls
1'
local=typeset
r='fc
-e e
rm='rm
-i'
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'accueil
utilisé.
de l'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'activation
de l'une
désactive
l'autre.
En ksh, elles sont toutes deux désactivéespar défaut. En bash, l'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
0 Lecaractère
représente
enbash
etenkshlerépertoire
d'accueil
del'utilisa
teur.
À partirde maintenant,
il fauts'imaginer
dansl'éditeur
vi. Certaines
actionss'effec-
tuent en modecommande,d'autres
en modeinsertion.Le tableausuivant regroupe
les principalescommandesqui permettentde gérerl'historique.
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'historique k
Descendre l'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'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'utiliser
des commandesidentiquesà celles de l'éditeur
emacs
pour rappeleret éventuellementmodifier les commandesstockéesdans le fichier
/.sh_history.ll faut pour cela activerl'option
:
S set -o emacs
0 Lefaitd'avoir
l'éditeur
emacs installé
ounonsurlesystème
n'a
strictement
aucuneincidencesur le fonctionnementde l'option
emacs, celui-ci étant géré
par le shell.
l'historique.
Action Command
Remonterl'historique
(previous) " p
Descendrel'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'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'utiliser
le modeemacscar avec un paramétrage
supplémentaire,les flèches du clavier peuvent être utilisées pour parcourir
l'historique.
Représentationdes flèches:
AI/
rights
reserved
tenant la touche [Ctrl] enfoncéepuis en appuyantsur p. Etant donnéque le mode
emacs est positionné,le fait d'appuyer
sur "p n'affiche
pas "p, mais remonte
l'historique
(c'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'écran
S alias _A="P
:
h, ksh,bh
Chapitre3
Voici les caractèresqu'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'éditeur
vi,il
faut utiliser "v et non pas \ pour retirer la significationspécialedu caractère
suivant.
Affichagedes alias :
L'affichage
de la liste des alias à l'écran
envoieles caractères"P, "N,"F,"B
sur le terminalet perturbecelui-ci. La figure 6 représentel'effet
obtenu.
_r'
'+.=-
l-="s-'sl-
- -
Exemple
L'option
-v permet d'afficher
de manièrevisible les caractèresnon affichables:
S alias | cat -v
__A="P
_B="N
Paramétrage
de l'environnement
de travail
_C="F
_D=*B
autoload='typeset
fu'
è..
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'un
nom de fichier suivi du caractère tabu/ation
gnllapitre3
Lorsqu'il
y a plusieurspossibilités,le shell ne complètepas :
S ls fic ? Le bash ne fait rien z S ls fic
Si l'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'utilisateur
complète le nom du fichier avec une suite de caractèresdiscrimi-
nants,suivisd'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'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
Exemple
Voicila liste desfichiers du répertoirecourant:
31s
f1 fic2.txtfic3.txtfic.txt prog.c
Praétr . e l v t de travail
Modeemacs
Exemple
Voicila liste des fichiersdu répertoirecourant:
S ls
fl fic2.txt fic3.txt fic.txt prog.c
En tapant la premièrelettre d'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'en
contiennequ'un
seul, ce qui est le cas ici :
S ls p[Echap][Echap]Complétiondu ksh : S ls prog.c
EN/
Editions
-
Lorsqu'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
a. shellde connexion
Environnement
texte
En environnement texte, le shellde connexion
est lancéimmédiatement après
l'identification
de l'utilisateur
parsonnomde loginet sonmotde passe.Ce proces-
susestl'ancêtre
communde touteslescommandes quiserontlancéespendantla
session.
Toutshelllancéultérieurement n'aura
pasle statutdeshelldeconnexion.
Programmationhell
sousnixinu
.Praëtrar.e leinneedt
Environnement
graphique
Enenvironnement
graphique,
leshell
deconnexion
estlancé
entre
labannière
de
connexion
etl'affichage
dubureau.
Cen'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'environnement
graphique
n'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'environneme
misenjeu
neserontpaslesmêmesdanschaquecas.
b. Fichiers
d'environnement
lusparleshell
deconnexion
Leshell
deconnexion
litunscript
shell
système
quisenomme
/etc/profile.
Ce
fichier
estgéré
parl'administrateur
dusystème
etcontient
des
paramétrages
com-
munsà touslesutilisateurs.
llrecherche
ensuite
dans
lerépertoire
d'accueil
del'utilisateur
unscript
d'envi
nement
dontlenom
dépend
dushell
utilisé
(cf.tableau
suivant).
Shell Nom
dufichier
d'environnement
lupar
leshell
de connexion
sh(Bourneet POSIX)- ksh .profile
bash L'un
destroisfichiers
suivants
citésdansl'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'exportation
d'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=
'
SPWDS
'
ENV=SHOME/.kshrc
EXINIT= setnumberautoindent'
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'environn
ment- Sessionutilisant un KornShell,
Cequ'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'est-à-dire
:
- les optionsdu shell ;
les définitionsd'alias.
0 EnKornShell,
unaliasdéfiniavecl'option
x peutêtrehérité
parunscript
shell, mais pas par un shell interactif. g
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'
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
login:
passwd:
4(1) (2)
f'|
Bourne
shell
deconn n jäïïîm
Dmla'
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
reserved
Iighfs
AII
3. Session utilisant un Korn Shell
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'utilisateur
(par convention /.kshrc).
La figure 8 représentele déroulementd'une
sessionde travail utilisant le Korn
Shell.
© gomportement
d'un
KornShellde connexion
- Il est lancéjuste aprèsla phased'identification
(1).
Chapitre3
0 Lavariable
ENVn'est
pasdéfinie
pardéfaut.
Le ksh afficheensuiteson prompt (sauf en environnement graphiqueoù le bureau
est immédiatementlancé). Les variablesd'environnement,
paramètres,options et
alias sont mis en placeau niveaudu shell de connexion(5).
Comportementd'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'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'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 |'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'historique
descommandes)
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'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'initialiser des variables
d'environnement
uniquementpour le contexted'exécution
du script shell. Ce cas
La figure 9 représentela manièredont l'environnement
doit être configurépour que
les variables,paramètres,optionset alias soient pris en comptedanstous les bash
interactifs.
Comportementd'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'environnement,
paramètres,options et alias sont mis en place au
niveaude ce nouveaushell (6, 8).
Programationshell
sousUnix/Linux
Paramétra
e de l'environnement
de traÆÆ
login:
passwd:
Contenu
dufichier Contenu
dufichier
(2) .bash_profile
Ætcfprofile '
(3) 3355H
N/ bashrc alÎôS
?
i='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
ËËPT
Substitution de commandes . . . . . . . . . . . . . 119
ligne de commande . . . . . . . .
Interprétation d'une 124
Écriture
et lancement scriptshell. . . . . . . . . 125
d'un
Variables réservéesdu shell . . . . . . . . . . . . . 135
F5753
. . . . . . . . . . . . . . . . . . .
L'arithmétique 163
arithmétiques . . . . . . . .
Substitution d'expressions 170
script. . . . . . . . . . . . . . .
. Mise au point d'un 171
Exemples
S varlqnotl
S echo Svarl
motl
S
Ü ll nefautpasmettre
d'espace
autour
dusymbole
d'affectation
: dans
l'exemp
suivant, le shell interprètevarl comme la commandeà lancer, = et motl
comme les deux argumentsde la commandevarl. Autrementdit, il n'inter-
prètepas le signe= commesymboled'affectation.
Svarl = motl
ksh: varl: not found
Exemples
S var2='mot1
mnt2mot3'
ËCORRECT
S echo Svar2
motl mot2mot3
S var2=mot1mot2mot3 #INCORRECT
ksh: mot2: not found
S
c. Variableindéfinie
Unevariablequi n'a
jamaisété initialiséeestvide.
0 L'utilisation
d'une
variable
viden'est
pasconsidérée
comme
uneerreur
enshell.
Exemple
S echoSvide
S
AI/
reserved
rights
Définition d'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
©
e. isolerle nomd'une
variable
Il faut faire attentionen concaténantle contenud'une
variableet d'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'intérieur
d'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'attribuer
unevaleurpardéfautauxvariables
noninitia-
lisées,ou au contraire,initialisées.
Expression
Sjvariablm-valeurl;
- Si la variable
n'est
pasvide,l'expression
est substituée
par le contenu
de
celle ci.
- Si la variableestvide,l'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'est
pasvide,l'expression
estsubstituée
parsvariable.
- Si la variable
estvide,variable estaffectée
avecvaleur et l'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
©
/tmp/default.log
S
Expression5{variable:+vaIeur}
- Si la variablen'est
pasvide, l'expression
est substituéepar valeur.
- Si la variableest vide, l'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'est
pasvide, l'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'affi-
chagerésultantde son exécution.Ce mécanismeest utilisé pour insérerdans une
lignede commandeUnix le résultatd'une
autre commande.
Syntaxeéguivalente
ksh bash
commande
argumentl S(commande) argumentn
Exemg/es
Comment faire pour provoquer l'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'une
variablemonuid avecl'uid
de l'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.
Leshell s'attend
à trouverun nomde fichier derrièreuneredirection:
S echo >
bash: syntax error near unexpectedtoken >'
Le caractère> perd sa significationspéciale:
5 echo '>'
>
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 'Bonjour
S(logname)'
Bonjour S(logname)
S
Protectionde plusieurscaractèresspéciaux.-
5 echo '*
? > < >> << | SEOMES(lognama)5'
* ? >< >> << | SHOME S(logname)&
S
La quotene se protègepas elle-même.Pourle shell, la commanden'est
pas ter-
minée. ll affichera le prompt secondaire(PS2) tant que les quotes seront en
nombreimpair :
S echo la quote n'est
pas protegee'
>
2. Le caractère \
L'antis|ash
retirela significationspécialedu caractèrequi le suit.
Exemples
L'é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'étoile
et le dollar redeviennentdes caractèresordinaires.-
S echoVoici une \* et une variable \sHoMR.
Voici une * et une variable SHOME.
L'antislash
seprotègede lui-même:
S echo \\
\
S
Programmaion
shellsousn/iu
Lesbasesdela Brogrammatlon
shell
Uantislashretire la significationspécialede la quote:
S echoL\'anti s1ash
protege la quote
L'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 '
sont protégéspar les guillemets.Les5E,30 et l conser-
ventIeur rôle. L'avant-dernier
guillemetest protégépar l'antislash
:
S echo "> et | sont proteges, SHOME est substituee, S(1ogname)
est executee, l'anti5lash
protège le caractere suivant, ce qui
meperet d'afficher
un \"."
> et l sont proteges, /home/christie est substituee, christie
est executee, l'antislash
protege le caractere suivant, ce qui me
permetd'afficher
un ".
S
0 Enpratique,
il estfréquent
d'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'une
variable
5B0 Substitution
decommandes
'
'
" "\ Caractères
de protection
E. Interprétation d'une
ligne de commande
Lescaractères
spéciaux dansunordreprécis:
dushellsontinterprétés
Séquenced'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
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'un
scriptshell
AII
resen/ed
rights
1 . Définition
-
ENI
Éditions
Il n'y
a pasde convention
interprété
parunexécutable
imposéepourle nomd unscriptshell.Le nomd'un
fichierscriptshelipeutavoiruneextension,
nommé"sh").
maisce n'est
pasobligatoire.Néan-
".sh" (mêmesi le scriptn'est
moins,il estassezfréquentde choisirl'extension pas
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'un
scriptpar un shellenfant
Danslamajorité
descas,lesscripts
doivent
êtreexécutés
parl'intermédiaire
d'un
shellenfant.
Cecia pouravantagedenepasmodi er
l'environnement
dushell
courant.
Pourlancerun scriptshell,il existetroisméthodes
qui produiront
un
résultatéquivalent.
Premièreméthode
S ksh premier.sh
C'est
laméthode
utilisée
précédemment.
Onappelle
lacommande kshenluide-
mandant
d'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'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'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'exécution
sur le fichier.
(si
lescript
est
lancé
àpartir
d'un
Korn
shell,
ilzeïaa
interprété
par
est lancéà partir d'un
_s'il
unKorn
shell,
Par défaut, le script sera interprétépar un shell enf nt identiqueau shell courant
Choixde Pinterpréteur
Sur la premièreligne du fichier, la directive#! permetd'imposer
l'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'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'erreur
se produisantfréquemmentau lancementd'un
script :
Premiermessaged'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'on
nesouhaite
pasmodifier
savariable
PATH,
lescript
peut
êtreexécuté
eri
exprimant
sonemplacement
de manière
explicite(enabsoluou en relatif).
Exemple
L'emplacement
du script est désignéen absolu:
S /home/christie/premier.sh
S
L'emplacement
du script est désignéen relatif :
S pwd
/home/Christie
S ls
premier.sh
S./premier.sh
S
L'autre
alternativeest de modifierla définitionde la variablePATHdans le fichier
.profile(voirla sectionExécution
d'un
scriptparle shellcourantdecechapitre).
Deuxièmemessaged'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'utilisateur
a oubliéde positionnerle droit d'exécution.
Lesbasesde la programmation
sheli
Troisièmemessage
d'erreur
classigue
S vi premier.sh
#! bin/ksh
S
Spremier.sh
ksh: premier.sh:Nosuch file or directory
Lecheminde |'interpréteur
estincorrect.
ici, le/ a étéoubliédevantbin.
Mécanisme
internecommunauxtroissyntaxes
Regardons
de plusprèsl'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'exécution courantn'a
pas
changé.Eneffet,unscriptsheliétantunecommande externe,il estexécutéparun
shellenfant.Lesfigures1, 2 et 3 représentent le détailde l'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'un
script shell - Premièrepartie
Avant de lancerle script, l'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'
t
pwd
cd/trnp p(4)
(6) Dwd
l5 Findu î!
./tmn (5)
(s)
- -v ksh
44 33°i'::"°"
reserved
rights(3)
Ail
- (7)
ENI (7)
Éditions
©
Figure2 : Mécanismeinternemis en Suvre
lorsdu lancementd'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'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
3. Exécution d'un
script par le shell courant
Cette méthodes'utilise
essentiellementdans le cas des scripts d'environnement
(.profile,.kshrc),et de manièreplus généralelorsquel'onsouhaitemodifierl'envi-
ronnementdu shell courant.Pourfaire exécuterun script par le shell courant,il
faut utiliserla commandeinterne".". Il est inutilede positionnerle droit d'exécution
sur le script passéen argument.
Exemple
Affichagede la valeuractuellede la variableEXINIT:
S env | grep EXINIT
EXINIT='set
numbershowmode
0 Lavariable
EXINITestutilisée
parvi etcontient
lalistedesoptions
à posi-
tionnerou dépositionner.Cettevariabledoit obligatoirement
êtreexportée.
Lesbasesde la programmationshell
L'utilisateur
modifie EXINIT danssonfichier .profile .-
S vi .profile
EXINIT='set
numbershowmode
autoindent showmatch'
expert EXINIT
:wq
Tant que le shell courant n'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='set
numbershowmode
autoindent showmatch'
0 L'argument
delacommande
. nepeutêtrequ'un
script
shell.
Messaged'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'argument de
Ail
rights
reserved
la commande.(ici le fichier .profile)est recherchédansles répertoirescitésdansla
variablePATH.Le répertoired'accueilde l'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'emplacement
du script est désignéen absolu:
S . SBOME/.profile
L'emplacement
du script est désignéen relatif .-
S . ./.profi1e
8 Nepasconfondre
tousles. l Lepremier
. représente
lacommande
interne
du
shellet est obligatoirementsuivi d'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'attend
à trouverle nomde l'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
1. Les paramètrespositionnels
Les scripts shell sont capablesde récupérerles argumentspasséssur la ligne de
commandeà l'aidede variablesspéciales,nomméesparamètrespositionnels.
- S# représentele nombred'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'à
S9 qui représentela valeur du neuvièmeargument.Le ksh et le bash
permettentd'utiliser
les variablesspécialesS{10}, H11}, etc. Les accolades
sont obligatoireslorsquele nom de la variablecontientplus d'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
/'
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
©
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'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'exécution
de la commandeshift (2). Les valeurssortantessont per-
dues ; elles devrontdonc être sauvegardéesavant l'opération
de décalagesi cela
s'avère
nécessaire.L'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
Exemple
Le script suivantreçoit en premierargumentle nom d'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'arguments
\S#: 5#\n"
# Sauvegardedu ler argumentdansla variable rep
rep=S1
0 # Decalaged'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
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'intérieur
d'un
scriptsheli,le testdu codede retourd'une
commande
permet
d'orienter
le flux d'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'erreur.
Exemple
Voici,sousformede pseudo-code,
un scriptqui renvoieO ou 1 enfonctiondu
nombred'arguments
reçus:
Si S#est diffèrent de 2
alors
Afficher " Nombred'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'un
scriptqui n'appelle
pasexplicitement
exit a pour
valeurle codede la dernièrecommandeexécutéeà l'intérieur
du script.
ProgrammationshelisousUnix/Linux
Les bases de la rogrammation
shell
4. Autres variables spéciales \\\\\
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'un
messageà l'écran.
- Ligne4 : le contenudu fichier Sficresuest affichéà l'écran.
Si
Premierexempled'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'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
Exemple
Lancementd'une
commandeen arrière-planà partir d'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 '| 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'attend pas
qu'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'exploitation
de cette variable sera vu ultérieurement(cf. chapitre
Aspects avancés de la programmationshell - Gestion d'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'inVite"
2. Lectures au clavier
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
rights
A/l
Ieserved
S echo svarl
Hello
ENI
Editians
-
©
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'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'utilisateur
appuiesur les touches d, il envoiel'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'utilisa-
teur a saisi [Entrée]ou d.
Programmtion
shellso Unx/inux
Lesbasesde la Erogrammationsllgll
4. La variable IFS
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
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'un
espace.Cettesyntaxeest plus
agréableà utiliser.
b. Testssur les fichiers
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-
mé
-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'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
Exemples
/etc/passwd
est unfichierordinaire.-
S test -f /etc/passwd
S echoS?
0
Mêmetest,maisavecl'autre
syntaxe:
S [ -f /etc/passwd ]
S echoS?
0
Testd'un
fichierquin'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'une
variable.-
S fi1e1=/etc/passwd
Le fichier contenudans filel (ietc/passwd)n'est
pas un répertoire:
S test d Sfilel
S echo S?
1
L'utilisateur
n'a
pas le droit d'écriture
sur /etc/passwd:
S test -w Sfilel
S echo S?
1
S
0 li estrecommandé
demettre
lenomdesvariables
entreguillemets.
Eneffet,si
rights
AII
reserved
une variableest vide, les guillemetspermettentde transformerl'expression
en
chaînede longueur0 (voir exemplesci-dessous).Si une variablevide n'est
pas
entouréede guillemets,sa substitutiondonnedu vide (c'est
commes'il
n'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'est
pas vide, le test est donc vrai :
S test -n "schl"
S echo S?
O
S
ch1 n'est
pas vide, le test est doncfaux :
S test -z "schl"
S echoS?
1
d. Testssurlesnombres
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'est
pasindispensable
demettre
desguillemets
autour
desvariables
conte-
nant des chiffrescar un nombrene peut être de longueurnulle (contrairement
à une chaîne).
e. Les opérateurs
Exemples
La commandetest renvoievrai si Sfichier n'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'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'utilisation
La commandetest est utilisée avec les structuresde contrôle. La structurede
contrôleif est présentéeici dans le but d'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'argumentsest correct"
8 exit 0
S testarg.sh fiel fic2
Le nombred'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
D Lesopérateurs
logiques
-a et o ontétéremplacés
par&&et | |.
'° '5
3'
'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?
rights
AII
reserved
chainel > chaine2 Vraisi chainel est lexicographiquement
après
chaineZ
ENI
Éditions
©
*
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'option
Ç
extglob: shopt -s extglob).
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'une
suite de chiffres
5 # eventuellementprecedeed'un
signe + ou
6 if [[ Snombre= ?([+-])+([0-9]) ]]
7 then
8 echo "Snombreest un nombre"
9 exit 0
10 fi
ll echo "Snombren'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'est
pas un nombre
S test_nbre.sh
Entrez un nombre:az78
az78 n'est
pas un nombre
AII
rights
reserved
TestsIogigues
Lesopérateurs-a et -o sont remplacéspar sa et | | ;
- Lesparenthèsesn'ont
ENI
-
pas besoind'être
protégées.
Editians
\( \)
© !
( )
!
Regroupement
Négation
d'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
Opérateur Signification
&& ET logique
|| OU logique
1. Évaluationde l'opérateur
&&
Syntaxe
commandel
&&commande2
- La deuxièmecommandeest exécutéeuniquementsi la premièrecommande
renvoieun codevrai.
- L'expression
globaleest vraie si les deuxcommandesrenvoientvrai.
Exemples
Le répertoireltmp/svgn'existe
pas, la commandecd n'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'opérateur
||
0
Syntaxe
commandel
il commandez
- La deuxièmecommandeest exécutéeuniquementsi la premièrecommande
renvoieun codefaux.
- L'expression
globale est vraie si au moins l'une
des deux commandesrenvoie
vrai.
Exemple
Le répertoireltmp/svgn'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'existe
pas" /
Le repertoire /tmp/svg n'existe
pas
Le répertoireltmp/svgexiste,la commandeecho n'est
doncpas exécutée.
S mkdir /tmp/svg
S [[ -d /tmp/svg ]] || echo "Le repertoire /tmp/svg n'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'existe
pas"
> fi
Le repertoire /tmp/svg n'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'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'est
la
raison pour laquellecertainssymbolesdoivent impérativementêtre précédésd'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)
©
Opérateurs Signification
chainel\] chaine2 Vraisi l'une
deschaînesestvraie(valeurdifférente
dechaînenulleet 0)
Opérateurs
divers
-nbl Opposéde nbl
\( expression
\) Regroupement
Comparela chaîneavecl'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'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'il
nefautpasconfondre
l'affi-
rights
AII
reserved
chagede la commandeet soncodede retour!
Editions
ENI
- S x=1
S expr sx \>= O
1
S echo S?
# Affichage
© 0 # Codede retour
Danscet exemple,l'affichage
de la commandeexpr n'est
pas exploité,donc la
sortiestandardest dirigéevers/dev/null :
Chapitre4
2 # Test du nombred'arguments
3 if [[ 5# -ne 2 ]] ; then
4 echo "Mauvaisnombred'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'ont
pasbesoind'être
séparéspardesespaces
;
Lesvariables
n'ont
pasbesoind'être
préfixées
parS ;
- Lescaractères
spéciaux
dushelln'ont
pasbesoin
d'être
protégés
;
Lesaffectationsse font dans la commande;
Progammation
shelisouUi/Linux
Le basesde la n; t ."
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
Opérateurs Signification
nbl = expression Assignement
(expression) Regroupement
nbl binop: nb2 binopreprésente
l'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
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'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'utilisateurs
Nombred'utilisateurs
connectes: 5
:
Écritureéquivalente
S echo"Nombre
d'utilisateurs
connectes: S(who| wc1)"
Nombred'utilisateurs
connectes: 5
Lacommande( ( )) n'affiche
rien:
S x=2
S ((x+1)) vaut: 3
# L'expression
S ((x=x+1)) vaut 3
# x est affecté avec3 et l'expression
S echoSx
3
Doncla commande( ( ) ) estsubstituée
pardu vide:
S echo"Apresincrementation,x vaut : ((x=x+1)) "
Apresincrementation,x vaut :
Poursubstituer
l'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.
1. Option -x
L'option
-x permet de visualiser les commandestelles qu'elles
sont exécutées,
(fest-à-direaprèstraitementdes caractèresspéciauxdu shell.
Premièresyntaxe
Activerl'option
:
set x
Désactiverl'option
:
set +x
rights
AII
resen/ed
Deuxièmesyntaxe
ksh bash
ENI
Éditions
«
Activerl'option
:
set O XÈIBCE
Désactiverl'option
:
set +0 xtrace
©
Troisièmesyntaxe
invoquerle sheii interpréteuravecl'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'option
x. Ici l'option
estpasséeen argument
au
shellinterpréteur
duscript.Leslignes
affichées
pourla miseaupointsontprécé-
déesd'un
signe"+". Onconstatequela variablefic ([[ f fic ]]) n'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'activation
de l'option
peut égalementse faire à l'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
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'une shellenligne4 (ilmanque
unguillemet),
sans
lancerl'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 : "'
unmatched
S
1. if
Les basesde la Erogrammation
shell
Si la commanderenvoiefaux et qu'il
n'y
a pas de partieelse, le flux d'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'a
pasdefer-
meture.
Autressyntaxes
Lemotcléthenpeutêtreplacé
surla première
ligneà condition
d'utiliser
un;
pourle séparer
de la commande.
if commandel
; then
commande2
fi
ll estégalement
possible
d'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'utilisateur
S1 est defini sur le systeme"
10 else
11 echo "L'utilisateur
S1 n'est
pas defini sur le systeme"
12 fi
13 exit 0
S exist_user.sh christie
L'utilisateur
christie est defini sur le systeme
5 exist_user.sh zoe
L'utilisateur
zoe n'est
pas defini sur le systeme
Ce script analysele nombred'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'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'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'exécution
en fonctionde ce code.
Deuxièmeexemple
A/i
rights
Ieserved
Le script codepos.shdemandeà l'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
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'est
pasun codepostal de FranceMetropolitaine
S codepos.sh
Entrezun codepostal : 78389
78a89n'est
pas un codepostal de FranceMetropolitaine
Cescript
sera
interprété
parunKorn
Shell
(ligne
1).Ilestdonc
possible
d'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'
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'évaluation
est faite de haut en bas). Lorsquela valeur correspondà l'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'exprimer
l'alternative
entre plusieursmodèles.
0 L'oubli
descaractères
;; génère
uneerreur
desyntaxe.
Le tableauci-dessousrappelleles caractèresspéciauxconcernés.
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.
Caractères
spéciaux
pourmodèles Signification
de chaînesde caractères
Caractères
spéciaux
nonvalides
enBourne
Shell(enbash,
activer
l'option
ext
glob : shopt -s extglob):
Kexpression) Oou1 foisl'expression.
*(expression) 0 à n foisl'expression.
+(expression) 1 à n foisl'expression.
@(expression) 1 foisl'expression.
llexpression) 0 foisl'expression.
?(expression1
|expression2
| ...) Alternatives.
*(expression1
|expression2 l ...)
+(expression1|expression2l...)
@(expression1 |expression2 | ...)
!(expression1
|expression2l ...)
c. Utilisation
Premierexemple
Lescript
menu.sh
affiche
unmenu,
saisitlechoix
del'utilisateur
ettesteàl'aide
d'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'un
codepostal
etteste
lavalidité
dece
dernier:
Snl codepos.sh
1 #!/usr/bin/sh
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'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
©
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'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è'
©
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
Troisième
exemple
Lescripttraitusenshtraitetouslesutilisateursdéfinisdansle fichierletc/passwd
dont le nom commence par "compta".La liste de valeursest généréeà partir
d'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'utilisateur
: Suser"
5 # ...
6 done
S
S traituser.sh
Traitementde l'utilisateur
: comptaOl
Traitementde l'utilisateur
: compta02
Traitementde l'utilisateur
: compta03
Traitementde l'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'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'é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'est
pas compatible
7 # Bourneshell
8 if [i "Snombre"!= ?([+ ])+([o 9]) 1]
9 then
10 echo "La valeur saisie n'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'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
c. Boucleinfinie
Le shell proposela commandeinterne : dont l'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'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'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
Résultatde l'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'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'à
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'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'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 '+%Y%m%d_%H%M')
mv S1/S2SHOME/S2.Sdate
© 23
Chapitre4
Résultatde l'exécution
:
Le fichier ltmplresuJogn'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.
&
Programmation
shellsousUnix/Linu
Lesbases
delaErogrammation
shell
Bæmple
5nlattend2.sh
1 #!/bin/bash
2 # Verification du nombre
d'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'est
pasun repertoire
13 exit 2
14 fi
15 # Nomdu fichier temoinpar defaut : "temoin"
16 ficTemoin=S(3: temoin)
17 # Lesarguments
sontcorrects
18 #Jusqu'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
'le fichier
dedonnees
27 exit 1
AI/
rights
reserved
28 fi
29 # Traitementdufichier dedonnees
30 date=S(date'+%Y%m%d_%H%M')
31 mvS1/S2SHOME/S2.Sdate
-
Editions
ENI 32 mail SLOGNAM <<FIN
33 Le fichier SHOME/S2.Sdate
34 FIN
est arrive.
6. break et continue
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
Lesbases
dela Erogrammation
shell
Exemg/e
Lescript
somme2.sh
estunevariante
duscript
somme2.sh.
Cette
version
utilise
unebouc/e
infinie
etaffiche
lemessage
d'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'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'est
pasun nombre"
14 continue
15 fi
AII
rlghts
raserved
25 exit 0
Lescriptsomme2.sh
utilise
uneboucleinfinie
(ligne
4).Àchaquetour
deboucle,
unmessage
d'invite
estaffiché
(ligne
6) et la saisie
d'un
nombre
estdemandée
(ligne
8).Silacommandereadrenvoievrai(l'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'utilisateur
effectuée(ligne 17).
a saisi
necorrespond
4 (grâce
unnombre,
lasomme
pasà un
àlaligne
est
14)pour
©
Chagitre4
Si read renvoiefaux (l'utilisateur
a saisi"d), la commandebreak (ligne20) est
exécutéeet le flux d'exécution
se poursuiten ligne 24.
S some2.sh
Entrez un nombre: 4
Entrez un nombre: a*
La valeur saisie n'est
pas un nombre
Entrez un nombre: 3
Entrez un nombre: Entrée
La valeur saisie n'est
pas un nombre
Entrez un nombre: Ad
La somme est : 7
B
C
D.
3l ?!-
E de la programmation shell
. Comparatif des variables 5* et S@ . . . . . . . . . . 200
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'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'un
script shell. Lors-
qu'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'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'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*"
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*"
U»
for arq in a b c d e f g"
Pourle shellenfant,il y a un seulargument.Voicile résultatde l'exécution
du
script : '
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'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
All
r/nhla
mamd
litésdisponiblesau niveaudesshellsbashet ksh.
Edltlona
EN/
- Syntaxe
5l ltvariable}
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
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
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
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'activer
l'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'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'élément
d'indice
O .-
S echo S(tab[0])
10
Programmati
ell sousUnix/
Asgects
avancés
dela Erogrammation
shell
Affichagede l'élément
d'indice
2:
S echo S(tab[2])
12
Affichagede l'élément
d'indice
1. La casen'ayant
jamais été initialisée, l'expres-
sion est substituéepar du vide :
S echo S{tab[1]}
0 Lesaccolades
sontobligatoires.
3. Assignementglobal d'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'I"_' _ _ __ A A /A)!
SÆE
4. Référencer
tousleséléments
d'un
tableau
Syntaxe
S{nomtableau[*]}
Exemple
5 echoSltab[*]}
10 11 12 13 12
S
5. Obtenirle nombre
d'éléments
d'un
tableau
Syntaxe
5{#nomtableau[*])
Exemple
S echoS(#tab[*])
5
s
6. Obtenir
lalongueur
d'un
élément
d'un
tableau
Syntaxe
S(#nomtableau[indice])
Exemple
Affichagede l'élément O:
d'indice
S echos{tab[O]}
10
Affichage
dunombre del'élément
decaractères O:
d'indice
5 echo5(#tab[0]}
Aspects
avancés
de la programmation
shell
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'être
exécutéesà
plusieursreprisespendantle déroulementd'un
script.
Edltlnns
ENI
- 1. Définition d'une
fonction
La définitiond'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
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'une
autrefonction.
Aspects
avancés
dela programmation
shell
Exemples
Utilisationde la premièresyntaxe:
Snl fonc2.sh
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'une
fonction
estdéfinie,
elleestconsidérée
parleshellcomme
une
commandeinterne.La syntaxeutiliséepour appelerune fonctionou exécuter
Editions
ENI
unecommandeUnixest rigoureusement identique.
Ü 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'erreur
(par exemple,il ne faut pas retour-
ner le résultatd'un
calcul).
Le coded'erreur
retournépar la fonctionest contenudans la variable5?.
Exemple
Le script exist_user.shdemandela saisie du nom d'un
utilisateur et teste si ce
dernierest défini ou non sur le système:
Snl exist_user.sh
1 #! /usr/bin/ksh
AII
resen/ed
Ilghts
L'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'exé-
cution en ligne33 si le codeest vrai, en ligne35 s'il
est faux.
Le shell exécuteraensuitela fonction pause. Le code de retour de cette dernière
ENI
EdIt/ons
n'est
pas exploité.
s, ksh,bash
3. Portée des variables
Variables
globales
ksh bash
Syntaxe
typeset variable
typeset variable=valeur
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'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'arguments
Le shellproposeun mécanisme
qui permetd'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'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'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'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'affichage
d'une
fonction
rogrammation
shellsousUnix/Linux
avancés
Asgects dela grogrammation
shell
« em le
prendenargument
Lescriptget_uid.sh unnomd'utilisateur
et recherche
sonuid .-
Snlget_uid.sh
1 #!/usr/bin/ksh
2 functionget_uid
3 l
4 grep ""S1:" /etc/passwdI cut d':'
-f3
5 l
6 # ------------------------------ --
7 # Definition de variables globales
8 # --
9 UID-"" # UID d'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'utilisateur
20 else
21 S1 n'existe
echo"L'utilisateur pas"
22 fi
S get_uid.sh
Z025
christie a pouruid : 2025
L'utilisateur
S
La ligne14 montreque la fonctionget_uidaffiche|'uid
de l'utilisateur
dontelle
reçoitle nomen argument(elle n'affiche
riensi l'utilisateur pas). Cette
n'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.
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'uid
d'un
utilisateur
13 function get_uid
14 (
15 grep -i "*S1:" /etc/passwd | cut -d':'
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'uid
d'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'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'utilisateur
SUser
est defini"
44
45 fi
echo"L'utilisateur
SUsern'est
pasdefini"
46 I;
47 2)
48 if exist_user Süser ; then
49 Uid=S(get_uid
Süser)
50
51
echo"L'UID
else
del'utilisateur
SUser
est: SUid"
52
53
'
fi
echo"L'utilisateur
SUsern'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
1. La commande print
ksh
a. Utilisationsimple
Exemple
S print Imprimanteen panne
Imprimanteen panne
S
h. Suppressiondu saut de ligne naturel de print
ll faut utiliser l'option
n.
Exemple
S print -n Imrimante en panne
Imprimanteen pannes
c. Afficher des argumentscommençantpar le caractère"-"
Exemple
Dansl'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'est
pasun caractère
spécialdu shell,il nesertdoncà riende le pro-
téger.Il n'est
pasinterprété
parle shell,maisparla commande print.
Programmaion
shellsos Unix/Linux
Aspects
avancés
dela programmation
shell
Avecl'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'option
u permetd'envoyer
un message
surun descripteur
particulier.
print udesc message
où desc représentele descripteurde fichier.
Exemple
Envoyer
un message
surla sortied'erreur
standardavecprint :
S print u2 "Messaged'erreur"
Envoyer
un message
surla sortied'erreur
standardavececho:
5 echo "Messaged'erreur"
1>&2
Comparaison
des deuxcommandes:
- L'option
u2 dela commande
print lui indique
qu'il
fautenvoyer
le message
sur la sortied'erreur
standard.
- Lacommande echoécrittoujours
sursondescripteur
1. ll faudra
doncquela
sortie
standard
aitétéredirigée
verslasortied'erreur
standard (1>&2)avantque
la commandeecho ne s'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'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'écran.
Elle peut contenirdes for-
mats qui serontsubstituéspar la valeur des expressionscitéesà sa suite. ll doit y
avoirautantde formatsque d'expressions.
l-Zxemples
deformatscouramment
utilisés
%20s Affichaged'une
chaîne(string)sur 20 positions(cadrageà droite
par défaut).
%-20s Affichaged'une
chaîne(string)sur 20 positionsaveccadrageà
gauche. A
%3d Affichage
d'un
entier
(décimal)
sur3 positions
(cadrage
à droite).
%O3d Affichaged'un
entier (décimal)sur 3 positions(cadrageà droite)
complétépar des O à gauche.
%-3d Affichaged'un
entier (décimal)sur 3 positions(cadrageà gauche).
%+3d Affichaged'un
entier (décimal)sur 3 positions(cadrageà droite)
avecaffichagesystématiquedu signe(un nombrenégatifest tou-
jours affichéavecson signe).
%10.2f Affichaged'un
nombreflottant sur l0 positionsdont 2 décimales.
%+010.2f Affichaged'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
Redirigerl'entrée
standardd'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'y
aura donc
plus d'interaction
avecle clavier.
Redirigerla sortie standardet la sortie d'erreur
standardd'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'erreur
standardenverrontleurserreursdansfichier2.
Premierexemple
raserved
AII
rlghis
Le script batch1.shenvoiesa sortie standarddans /tmp/resuet sa sortie d'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'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
Snl/tmp/log
1 cp:cannot
access
*.c
2 *.c: No such file or directory
l) ll n'est
paspratique
d'avoir
lesmessages
résultats
etlesmessages
d'er
dansdesfichiersdifférentscar la chronologiedesévènementsn'est
pasfacileà
reconstituer.
Deuxièmeexemple
Le script batch2.shenvoiesa sortie standardet sa sortie d'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'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'un
lignedu fichierte|.'txt
puisquel'entrée
standarddu scripta étéconnectée
sur ce
fichier (ligne 1).
Résultatde l'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
En lecture
exec desc<fichier
En écriture
exec desc>fichier
Prograio sellsousnix/Lnux
Aspects
avancés
dela Erogrammation
shell
b. Lectureà partird'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'un
fichier
Syntaxe
execdasc<E-
execdesc>s-
Exemple
Le scriptIecture2.shlit les deuxpremièreslignesdu fichierteLtxt,lesafficheà
l'é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'ecran
et dansout.txt
È 7 print Sligne
T 8 print -u4 Sligne
Ë .
Chapitre
5
ll # Ecriture de la 2emeligne a l'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'un
fichier
a. Informations
préalables
Rappeldescaractéristiques
de read
La lectured'une
lignede fichierse feraavecla commande read. Voiciun rappel
descaractéristiquesdecettecommande :
- ellelit unelignesurl'entrée
standard(descripteurO) ;
- elleretourne uncodevraisi unelignea étélue(mêmesi la ligneestvide);
- elleretourne uncodefauxlorsqu'elle
rencontre
lafin dufichier.
La lecturedetoutesleslignesd'un
fichierseferaen associant
la commande
read
et la bouclewhile.
Aspects
avancés
de la programmation
shell
La notion de fin de fichier
Lorsquel'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'initiative
de l'utilisa-
teur par l'intermédiaire
des touches d.
Si l'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'exploiter
un fichier
Redirigerl'exécution
du script
Les redirectionspeuventêtrefaites au momentde l'appel
du script.
Exemples
Le script Iitfic1.sh utilise les commandesread et print et ne fait aucuneredi-
rection. Le fichier d'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'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
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'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'entrée
(O)et de sortie(1) standardspeuventêtre faitesà l'in-
térieurdu script.
AsEects
avancés
delaprogrammation
shell
Exemple
Lesredirections
del'entrée
etdelasortie
standard
sontfaitesà l'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'autres
descrigteurs
En ksh et bash, il est possibled'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'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'un
bloc
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
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'arguments"
5 echo "Usage: S0 fichier"
6 exit 1
7 fi
8 if [[ ( ! -f "S1" ) Il ( ! -r "S1" ) ]
9 then
10 echo "S1 n'est
pas un fichier ordinaire ou n'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'à
tester la valeurdu codepostal(ligne 16) et à
réassembler la ligne en y insérantl'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'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'utiliser
la commandeeval :
S eval echo \ssva:
christie
S
0 L'ordre
d'évaluation
dushellestdonné
auchapitre
Lesbases
delaprogramma-
tion shell - Interprétationd'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.
1. Principaux signaux
Programmation
shllsousUnix/Liu
Asectsavancés
delaprogrammation
shell
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'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'utilisateur
demandeau shelld'ignorer réceptiondessignauxHUP et
l'éventuelle
TERM:
S trap '
'
HUPTERM
0
Lessignaux
sontignorés, shellnemeurtdoncpas:
leprocessus
S echoSS
18033
S
3. Modifier
le traitement à un signal
associé
Syntaxe
trap 'cmd1;cmd2;
...; cmdn'
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
S ps
PID TTY TIMECMD
17924pts/2 0:00 ksh
S echo S3
17924
Syntaxe
trap - sigl sig2 ... sign
Exemple
Créationd'un
fichier /tmp/fic :
s > Itmp/fic
Si le shell reçoit SIGINTou SIGTERM,
il doit détruirele fichier .-
5 trap ':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
Exemple
Le script attrape_signo.shreçoit l'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'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
Syntaxe
select var in iteml item2 ... itemn
AI/
rlghts
merved
do
commandes
done
La commandeinterneselect est unestructurede contrôlede type bouclequi
-
ENI
Edltlons
permetd'afficher
de manièrecycliqueun menu. La listedes items, iteml
item2 itemn seraaffichéeà l'écran
à chaquetourde boucle.Lesitems
sont indicésautomatiquement.
La variablevar serainitialisée
avecl'item
corres-
pondantau choixde l'utilisateur.
sh,ksh,
bash
Chapitre5
Cettecommandeutilise égalementdeuxvariablesréservées :
- La variable PS3 représentele prompt utilisé pour la saisie du choix de
l'utilisateur.
Sa valeurpar défautest #?. Elle peut être modifiéeà la convenance
du développeur.
- La variableREPLYqui contientl'indice
de l'item
sélectionné.
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'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 _'.°atl°5e'
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'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'item
Fin du traitement
A bientôt ...
Syntaxe
Ail
rlghts
reserved
getopts liste-options attendues option
La commandeinternegetopts permetà un script d'analyser les options qui lui
ont été passéesen argument.Chaqueappel à getopts analysel'option suivante
Edltlons
ENI
de la ligne de commande.Pourvérifier la validité de chacunedes options, il faut
appelergetopts à partir d'une
boucle.
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'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'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'une
derrièrel'autre.
Une option
suivied'un
":" signifiequec'est
uneoptionà argument.
- Deuxièmeargument: option est une variable utilisateurqui sera initialisée
avecl'option
en coursde traitement.
Un appelà getopts récupèrel'option
suivanteet retourneun codevrai tant qu'il
restedesoptionsà analyser.Lorsqu'une
optionestassociéeà un argument,ce der-
nier estplacédansla variableréservéeOPTARG.
LavariableréservéeOPTINDcontientl'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'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'option
c
Archivage
Indice de la prochaine option a traiter : 2
getopts a trouve l'option
u
Liste des utilisateurs a traiter: christie,bob,olive
Indice de la prochaine option a traiter : 4
getopts a trouve l'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'erreur
est affiché à l'écran.
Puis les options
ENI
Edïtians
-
suivantessont analysées.
Gestiondeserreurs
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'erreur
généréautomatiquementpar getopts n'apparaît
plus et
SOPTARG a été substituéepar la valeurde l'option
incorrecte:
S gestuser.sh -y -c
y: OPTIONINVALIDE A Bye
0 Enligne18,le"?"doitêtreprotégé
pournepasêtreinterprété
parleshell.
OEtionvalideavecargument
manquant
Lorsquel'argument
d'une
option est absent, la variableoption est initialisée
avecle caractère":" et OPTARG contientla valeurde l'option
concernée(ligne14).
Exemple
Ici, la structurede contrôlecase traite le casde l'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'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'argument
de l'option
-u :
S gestuser.sh -c u
Archivage
L'option
urequiert
unargument
Bye
S
Lesoptionssontstockéesdansles paramètrespositionnels(S1, S2, ...). Unefois
que celles-cisont analysées,il est possiblede s'en
débarrasseravecla commande
shift (cf. chapitreLesbasesde la programmationshell - Variablesréservéesdu
shell).Ceciest intéressants'il
restedesargumentsà traiterderrièreles options.
Exemple
Leslignesajoutéesderrièrela boucle while permettentde retirer les optionsde
la liste des arguments(ligne 26). L'expression
OPTIND-l représentele nombre
d'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'1'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'un
processusen arrière-plan
Lacommande wait permetau shelld'attendre
la terminaison
d'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'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.
Snl attendproc.sh
1 #1/usr/bin/ksh
# Lancementd'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'endort
La sauvegarde est terminee.
Verification de la sauvegarde
M.Scriptd'archivage
incrémental
et transfert sftp automatique
1. Objectif
ll s'agit
d'écrire
un scriptqui sauvegarde
de manièreincrémentale
le contenud'un
d'une
répertoire machinede production.Lesfichiersde sauvegarde(archives
cpio
compressées)seronttransféréssurunserveurde sauvegarde
(serveurvenus),dans
unrépertoire
dontle nomdépenddumoiset de l'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'exemple
présentéici, cesrépertoires
sontcréésparavance.Ce n'est
pasle
scriptdesauvegarde
quilefait (maiscelaestfacilementréalisable).
Lafigure2 représente
l'arborescence
des2 serveurs.
-
ENI
Éditions
La sauvegarde incrémentale
utiliseraautantde niveaude sauvegarde y a de
qu'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'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'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'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'un
nouveaufichier témoin "niveauO"et sau-
vegardede tous les fichiers situés sous /home/document.Transfertde l'archive
sur le serveurde sauvegarde.
etc.
Ü Lasauvegarde
incrémentale
permet
d'avoir
unesauvegarde
journalière,
en
archivantuniquementles fichiers modifiésou ajoutésdepuis la veille. En cas
de perte d'un
fichier, il suffit de restaurerla dernièrearchive contenantce
fichier. Si l'utilisateur
souhaite restaurertout le répertoireIhome/document,il
faut restaurertoutes les archives du mois en cours en commençantpar
l'archive
de niveau0.
rappom.doc
rapportldoc
niveauù
niveaui
2011_[11_U1_n'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'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'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'environnement courant (via la commande.) des
fonctionsdéfiniesdans le fichier fonctions.inc.sh.La variableglobaleSCRlPTDlR
est utilisée pour l ordre d'inclusion,il faut donc qu'elle
ait été définie
antérieurement: il faut faire attentionà l'ordre
des instructions.
4D
- Ligne 17 : Définitiond'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'option
newer de la commandefind permet de
réalisercette opération.
Reprisedu traitementcommun.-
- Ligne 51 : Vérificationde la validité de l'archive
par la fonction isZ-Xrchive-
Invalide.
- Ligne 56 : Transfertde l'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'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 # '-
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'entrée standard (option b et double
redirectionen lecture).L'environnement
de travail a été paramétrépour que le
mot de passen'ait
pas besoind'être
fourni (cf. la commandesftp au chapitre
Les commandesfiltres Commandesréseau sécurisées).L'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'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'archive
est valide.
- Ligne29 .-Si le coderetourvaut 255, ssh a échoué.
- Ligne33 : Si le code retourn'est
ni 0, ni 255, l'archive
est invalide.
La fonction isArchivelnvalide
Cette fonction reçoit une archivede type bz2 en argument,retournevrai si l'ar-
chiveest invalide,faux dansle cas contraire.
41 # --
42 # Argument:nomde l'achive
43 # Verification de la validite de l'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 '+%Y_%m_%d'
57 }
LafonctiongetYear «\
LafonctiongetYear affichel'année au formataaaa.
courante, a
58 # ----------------------------- --
59 # FonctiongetYear
60 # Fabriquel'année au formataaaa
61 # --
62 functiongetYæar(
63 date '+%Y'
64 )
LafonctiongetMonth
La fonctiongetMonth affichele moiscourantau formatmm.
65 # ----------------------------- --
66 # FonctiongetMonth
67 # Fabriquele moisau formatmm
68 # --
69 functiongetMonth{
70 date '+%m'
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'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 '+%e'
l sed 's/
//'
78 ]
0 Lacommande
sedestprésentée
auchapitre
Lacommande
sed.Lescomman-
des ssh et sftp sont présentéesau chapitreLescommandesfiltres.
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'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);
'
915F;
'
eXPr ;
- sed.
Les EResont utiliséespar les commandessuivantes:
- grep avec l'option
-E, egrep ;
- awk.
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'est
pascité dans la liste
* 0 à n fois le caractèreou regroupement précédent
\< Débutd'un
mot. Caractèrespouvantfaire partie
d'un
mot : [A Za-z0-9 ]
\>expressionrégulière> Fin d'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'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'un début de lignesuivi immédiate-
ment d'une
fin de ligne. C'est
donc une chaînevide.
ENI
Edltlons
"L4? ]*S Chaînecontenantentre O (chaînevide) et n caractères
(espaceou tabulation) espaceou tabulation.
0 Les AetSperdent
marqueurs leursignification
s'ils
nesont
pasplacés
respec-
tivementendébutet enfin de l'expression
régulière.
rogramatioshl sous
Uni/Linux
Lesexpressions
régulières
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.
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'un
antislash.
Exemples
ER Signification
[+ ].7[0 9] +5 Chaîne
représentant
un nombreentierlau moins1
chiffre)éventuellement
précédéd'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
Syntaxe
Recherche
(mode
commande)
:
AII
riant:
rasarved
/expression-régulière'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'éditeur
vi.
0
Chapitre
6
2. La commande grep
Ce paragrapheillustre l'utilisation
des expressionsrégulièresau traversde la com-
mandegrep normaliséepar POSlX.Utiliséeavec l'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'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'
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 'K'
.-
S grep 'tel2.txt
K'
KaramaJosette[256 rue de la tempetel56l00lLorientl85.26.45.58
Lesexgressions
régulières
Recherchedeslignesse terminantpar 8 :
S grep '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 'rr
tel2.txt
GronPierre|89A9Orue du chateau|38350|LaMurei78.21.23.69
Mêmechoseen utilisant une ERb.-
S grep r\{2\)'
te12.txt
GronPierre|89-90 rue du chateau\38350|LaMurel78.21.23.69
Mêmechoseen utilisant une ERe.-
S grep 'r\(2\l'
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 '*[-çâ]*S'
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 'lorient|vaux'
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'opérateur
":" :
Le nombrede caractèresde chaîne-de-caractères correspondantà I ERb
expression-régulière-basique est affichéà l'é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'expression
est implicitedans I ERb).
- Si une partie de l'expression
régulièreest mémoriséeavec\( \), la commande
affichesur le terminalla portionde la chaînecorrespondante.
Exemples
Vérifierque l'utilisateur
a saisi un nombre:
S read nbl
250
Sread
nb2
a8
Lesexgressions
régulières
La variablenbl contientuniquementdeschiffres :
S expr "Snbl" : # équivalent à ' [0
[O 9]
9]*S'
3
'[0'9]
[0-9]*S'
Secho
S?
0
La variablenb2 contient au moins 1 caractèrequi n estpas un chiffre. L'ERb
n'est
pas satisfaite:
S expr "Snb2" : '[0 9][O-9]*S'# équivalent à ' [0 9][0-9]*S'
Ü
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" : '.*'
57
Afficherla partiedela chaînecorrespondant
à la mémorisation
(ici le codepos-
tal) :
S expr "Sligne" I '-*|\([0-9]\{5\}\)'
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" : '\(.*\)
l '
ENI
Éditions
- JoyeuxGiselle|l2 rue de la Source|89290lVaux
© JoyeuxGise||e|12rue de la Source|89290hlau><
I __|
\<,*\> '
Chaitre 6
Solutionpermettantde s'arrêter
au premier"l" (cf. Figure2) :
S expr "Sliqne" = '\(["|]*\)|'
JoyeuxGiselle
S
Sexwîligne" : '\(["l]*\)l'
JoyeuxGise||e|12ruedelaSource|89290|Vaux
ure:
\([ l]*\) l
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'
Il \
expr "Snombre": '-[0-9][0-9]*S')
> /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'antislash
enfindeligne8 permet
demasquer
lecaractère
"saut
deligne"
pour pouvoirécrire la commandesur deux lignes.L'affichage
de la commande
expr est éliminécar ici, c'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
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'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'option -e.
0 Lacommande
sednemodi epaslefichierd'origine.
Syntaxe
d'une
action
[adresse[,adresse]]commande[arguments]
Uneactionest syntaxiquement composéede :
une partie adressequi permetde spécifiersur quelles lignesdoit s'effectuer
la
commande;
- la commandeà exécuter;
- les argumentsde la commande.
Yêyntaxe
d'une
adresse
Typed'adresse Lignestraitées
Aucuneadresse Toutesles lignes.
Adressesde type 1
n Lignen.
æ Dernièreligne.
/ERb/ Lignescorrespondant
à l'expression
régulière.
Typed'adresse Lignes
traitées
Adresses
detype2
n1,n2 Lignen1 jusqu'à
lignen2.
/ERb1/,/ERb2/ Lapremière
lignetraitée
serala première
trouvée
corres-
pondantà ERb1. Letraitement
se poursuivra
surtoutes
leslignesjusqu'à
ce quesedrencontre
unelignecorres-
à ERb2.Cettedernière
pondant seraégalement
traitée.
Syntaxede la commande
reserved
rlghts
All
sible,cequipermet
depouvoir
spécifier
plusieurs
lignes
detexte.Ledernier
saut
delignen'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
B. Exemples
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
Proammionhellsous
Unix/Linux
La commande sed
a. La commanded (delete)
La commanded permetde ne pas afficherà l'écran
les lignessélectionnées
par la
partieadresse.
Exemple
Ne pas afficher les lignes blanches:
s sed '/A[_*°*s/a'
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'espaces
ou de tabulations.
b. La commandep (print)
La commandep permet d'afficher à l'é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'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 'l,2p'
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
c. La commandew (write)
La commandew permet d'écriredans un fichier les lignes sélectionnéespar la
partie adresse.Comme pour la commandep, sed affiche égalementtout le
contenudu fichier à l'écran.
Pour modifierce comportement,il faut utiliser l'option
n.
Exemple
Stockerdans le fichier dpt_56 toutes les personneshabitant le Morbihanet dans
le fichier dpt_89, toutesles personneshabitant dans I'Yonne.
L'option
e précède
chaqueaction :
S sed -n -e '/AiA|]*|["l]*l56/w
dpt_56
-e / [ l]*|["|]*l89/w dpt_89'
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'une
commande(l)
Le caractère! placédevantla commandepermetd'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 '/A[._.° >]*S/!p'
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'une
variable:
S echo sarg
userl,user2,user3
S echo Sarg | sed 's/,/
/9'
userl user2 user3
S 1iste_users=S(echoSarg | sed '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'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)/'
(JoyeuxGiselle!12. rue de la Sourcel89290|Vaux|45.26.28.47)
S
0
s echoÇligne| sed'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)
( & )
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'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 's/"\([ |]*|["i]*|56---|[Ai]*|\)\(.*\)S/\102.\2/' 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
's/"\(["|]*
i["l] |56---l["|]* |\)\(-*\)515/\102.\2/'
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'une
chaîneentredeuxsous-chaînes
2. Script sed
Unscriptsedestunfichiertextecontenant
unesuited'actions
sed quiserontexé-
cutéessur les lignesd'un
fichier de données(ou sur les donnéesde l'entrée
stan-
dardle caséchéant).
Toutesles actionsserontexécutéesd'abord
sur la premièreiigne du fichier, puis
sur la deuxième,etc. Lorsquela partieadressen'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 ...
FPFF
. . . . . . . . . . . . . . . . . . . . . 298
Opérateurs
La fonctionprinlf . . . . . . . . . . . . . . . . . . 300
Redirections . . . . . . . . . . . . . . . . . . . . 301
F?!
Fonctions utilisateur. . . . . . . . . . . . . . . . . 319
A. Principe
Le langagede programmationawk est un outil adapté au traitement de fichiers
textes. Il permetd'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'interpréteur
gawk (GNUAwk).
1. Syntaxe
awk [ F] '
(action-awk) [ ficl . . . ficn ]
awk [ F] f script-awk [ ficl ficn ]
La commandeawk prenden argumentla liste des fichiers à traiter. En l'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.
rogramaon Vshellsousnxinux
Le langage
de programmation
awk
0 Lorsque
lavariable
FSestinitialisée
avecunminimum
de2 caractères,
cette
valeurest interprétéecommeune expressionrégulière.
b. Variablesinitialiséeslors du traitementd'une
ligne
Lesenregistrements sont traités successivement.
L'enregistrement
courantest auto-
matiquementdécoupéen champset un certain nombrede variablesinternesawk
sont alors initialisées.Le tableausuivantdonnela liste des principalesvariables.
reaervod
NR
remplacépar sa valeur).
Number: indicede l'enregistrement
courant(NR vaut
AII
rlghta 1 quand la 1ère ligneest en coursde traitement,puis
Ed/t/ons
ENI
-
s'incrémente
dès que awk changed'enregistrement).
FNR File Number: Indicede l'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 '{print
51,58)
lci awk travaillesur le résultatde la commandeps -ef. La partie écrite en ita-
lique représentel'action
que awk doit exécutersur chaqueligne. Les simplesquo-
tes sont indispensablespour empécherle shell d'interpréter
les caractèresdestinés
à la commandeawk. Les instructionsdoivent être placéesentre accolades.La
fonction intégréeprint va afficher à l'écran
les champs 1 et 8 de chaqueligne
(correspondant ici au propriétaireet nom de chaqueprocessus).
Résultatde la commande.-
S ps -ef | awk '{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 '{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'|'
'{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'argument,
elleaffiche
S0.
ENI
Éditions
-
3. Critères de sélection
ll estpossible
desélectionner
lesenregistrements
surlesquels
l'action
doitêtreexé-
cutée.
©
sh,h, bash
Chapitre8
Syntaxe
awk [ F] critère {action-awk}'
[ ficl ... fion 1
Le critèrede sélectionpeut s'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'|'
'/[/]/
{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'opérateur
de concordance(N) ou de
non-concordance (b).
Deuxièmeexemple
Afficher les clients localisésdans le Morbihan:
S awk -F'l'
S3 N / 56/ {print S0}'
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'l'
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
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'égalité
!= Test d'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'|'
'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'|'
'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'un
script awk
Lorsqu'il
y a un certain nombre d'actions
à réalisersur les données,il est plus
confortabled'é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'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'elle
est initialiséeet n'a
pas besoind'être
typée. L'utilisation
d'une
variablequi
n'a
jamais été définie a pour valeur 0 dans un contextenumériqueet chaînevide
dansun contextede chaîne.
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'lsère
puis du nombretotal de clients résidantdans l'Yonne
(nb_89).
Résultatde l'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'enregistrements
: 6
Nombrede clients localisés dans l'Isere
: 2
Nombrede clients localises dans l'Yonne
: l
S
B. Opérateurs
Le tableausuivantregroupeles opérateursdisponiblesdans le langage.
shellsousUniLinux
ÿProgammatio
Le langage
de programmation
awk
reserved
Iights
A/I
&& Binaire Et logique.
|_] Binaire Ou logique.
Divers
ENI
Editions
-
= V Binaire Affectation.
el ? e2 : e3 Ternaire L'expression
globalevaut e2 si el est vrai, e3 dans
le cas contraire.
el e2 (opérateur Binaire concaténationde e1 et e2.
© espace)
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'écran.
Ellepeutcontenir
desfor
mats qui serontsubstituéspar la valeur des expressionscitéesà sa suite. ll doit y
avoirautantde formatsque d'expressions.
gemmesdeformatscouramment
utilisés
%20s Affichaged'une
chaîne(string)sur 20 positions(cadrageà droite
par défaut).
% 20s Affichaged'une
chaîne(string)sur 20 positionsaveccadrageà
gauche.
%3d Affichaged'un
entier(décimal)sur 3 positions(cadrageà droite).
%03d Affichaged'un
entier (décimal)sur 3 positions(cadrageà droite)
complétépar des 0 à gauche.
% 3d Affichaged'un
entier (décimal)sur 3 positions(cadrageà gauche).
%+3d Affichaged'un
entier (décimal)sur 3 positions(cadrageà droite)
avecaffichagesystématiquedu signe(un nombrenégatifest tou-
jours affichéavecson signe).
%10.2f Affichaged'un
nombreflottant sur 10 positionsdont 2 décimales.
%+010.2f Affichaged'un
nombreflottant sur 10 positionsdont 2 décimales,
cadrageà droite,affichagesystématiquedu signe,complétionpar
des zérosà gauche.
Desexemplesd'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'exploitation.
Syntaxe ' ,
r
r
instruction > "fichier" Au premieg'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'instruction print est
transmise sur l'entrée
standard de la com-
mandepar l'intermédiaire
d'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'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'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 '
NRÆZ( print S1 I "sort" } END(close("sort") )'
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'est
exécutéequ'une
seulefois. Dansla sectionEND,le tubeest fermé.
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'enregistrement
suivant
7 next
s '
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'|Ie
de
France.Dèsque le traitement estterminé,l'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'on
retrouveclassiquement
dansles
langages
de programmation.
Lasyntaxeesthéritéedu langageC.
1. if
Lapartieelse estfacultative.
Sxntaxe
if (condition) i
instruction
l
else {
instruction
}
Lorsqu'une
seuleinstruction
estprésente,
lesaccolades
sontfacultatives
:
if (condition)
instruction
else
instruction
2. for
Premièresyntaxe
for (initialisation ; condition; incrementation)(
instruction
amaîon.
l
Lorsqu'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'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
Principe
while (1) (
if (condition) break ; # sortie de la boucle
instruction ;
i
# Ici après break
6. continue
Principe
while (1) {
if (condition) continue ; # remonteimm'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'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
L'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'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'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'élément
correspondant
est nommévaleur.
Exemple
Le fichier venteslxt contient des informationssur les entes d'une
société. Les
informationssont classéespar ville. A001:1 00 représen le code d'un
article et
le nombred'exemplaires
vendus.
S cab ventes.txt
Codearticle:Nombre d'articles
vendus
#Paris
AOOl:l0O
AO02:300
A003:50O
A001:1000
#Nice
A002:30
A0O3:5
Le langage
de Erogrammation
awk
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'articles
vendus(ajout de
5B2à la valeurdéjà présentedans le tableau).La sectionEND(ligne 10) affichele
tableauà l'aide
d'une
bouclefor (ligne 12). La variablearticle représentela
clé et l'expression
ventes [articles] la valeur.
Résultatde l'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'existence
d'un
élément
Le mot clé in permetde tester l'existenced'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'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'utilisateur
peut rechercherla ligne correspondantau nom d'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='robert@monsite.com'
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'y
a pasencorede sectionintermédiaire.Si celle-ciest
ajoutée,il va y avoir une erreurd'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'argument
a nbChamps=split(ARGV[1],args,"=")
;
w option=args[1] ;
m valeur=args[2] ;
rights
AI/
reserved
7 # Eliminer l'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.
Fonction Rôle /
gsub(er,remp,[ch]) Remplacedansla chaîne"ch"chaqueoccurence corres-
pondantà l'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'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'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'arc
tangeantedey/x
rand() Retourne le nombrealéatoirey tel que0<=y< 1
srand(x) initialisela basedecalculpourrand() enfonctionde la valeurx.
Retourne l'ancienne
base.
3. Autres fonctions
a. Lafonctiongetline
Lafonctiongetline permetde :
lirelalignesuivante
dufluxsansremonter
audébuttraitement à
(contrairement
next).
lireuneligneà partird'un
fichier,
del'entrée
standardoud'un
tube.
Valeurde retour:
- 1 encasdesuccès
- 0 enfin defichier
reserved
- -1 encasd'erreur
r/ghts
AII
0 Malgré
lefaitquegetline estconsidérée
comme
unefonction,
ilnefautpas
-
ENI
Ed/tlons
mettrede parenthèses
lorsde l'appel.
sh,ksh,
bash
Syntaxe
getline [var]
Lecture de la ligne suivante du flux.
getline [var] < "fic"
Lecture d'une
ligne à partir d'un
fichier.
"commande" | getline [var]
Lecture d'une
ligne provenant du résultat d'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'est spécifié. Le nomde fichier " "
représente l'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'une
informationest représentéepar le caractère"In". Si
ce dernierest précédé d'un "l", cela signifie que la suite de l'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'intorma
tion).
Deuxièmeexemple
A/I
reserved
rlghts
Lectureclavier,lectured'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'unesection BEGIN. Ce pro-
grammeouvrele fichier agendaixt pour y rechercherle nom d'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'est
pas dans
l'agenda."
Z2 }
23 print "\nBye"
24 }
Letraitementestcontenudansuneboucleinfinie(ligne4). Enligne8, lectured'un
nomau clavier.Si l'utilisateur
saisit"d ou si une erreurd'entrée
se produit,le
scripts'arrête
(sortiede la bouclewhile avecbreak). En ligne10, si l'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'il
pondance,le scriptaffichele résultat(ligne17) et le traitementdéclencheune
nouvellesaisie.Si le nomn'a
pasététrouvé,affichaged'un
message en ligne21.
Le langagede programmation
awk
Exécutiondu script :
S awk f saisie.awk
Rechercherle nom: robert saisie d'un
nomde l'agenda
Robert 75020 robert@monsite.com
Rechercherle nom: alain saisie d'un
nomabsent de l'agenda
alain n'est
pas dans l'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'une
commande du système d'exploitation.
La fonction
getline récupèlela sortiestandardde la commandedate et la stockedans la
variableS0 :
Snl cmde.awk
1 BEGIN
l
2 "date '+%d %m
I getline
%Y'"
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'appel
à cette fonctionest omis, les ressourcessont libéréesà la terminaisondu
Aiir/ma
nnmd
script.
L'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'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'ouverture
repositionne
l'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'exécuter
unecommandedu systèmed'exploitation.
Sxntaxe
system("commande")
Lafonctionretournele statut renvoyépar la commande.
Exemple
Caractéristiques
du fichier agendaJxt.-
S awk '
BEGIN(system("ls -1 agenda.txt") }'
rw-r -r 1 christie christie 94 jan 26 11:19 agenda.txt
Lelangagede programmation
awk
Mêmechosemaisen seservantd'une
variableawkinitialisésaupréalable
:
S awk 'BEGIN{
fic="agenda.txt" ; system("ls -1 " fic))'
rw r- r - 1 christie christie 94 jan Z6 11:19 agenda.txt
S
0 Rappel
: l'espace
estl'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'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'une
fonction:
valeur_retournee=nom_fonction(vall,val2, ., valn)
0 Il nedoitpasy avoird'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'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'exécution
:
S awk-f transfert.awk tel3.txt
Lelangage
deErogrammation
awk
L. Exemples de scripts
1. Analyse d'un
fichier de Iog
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'écran
estpasséen argumentsurla lignede commande.
h, h, bas
Chapitre8
Exempled'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's
fully qualified
demainname,using 10.0.0.66 for ServerName
Date : TueOct 1 10:12:52 2002
httpd: Couldnot determinethe server'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'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'arguments passésen ligne de commande.Si
ceIui ciest incorrect,un messageest envoyésur la sortie d'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'alerte
demandé(ligne 12).
Laligneesttraitéede façonà pouvoirêtredécoupée
(fonctionssub et split),
puislesinformations
souhaitéessontaffichées.
2. Génération d'un
fichier d'étiquettes
Voiciun fichier de contacts,qui doit être formatésousformed'é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'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'appel filtres. . . . . . . . . 328
descommandes
Visualisation de données . . . . . . . . . . . . . . . 328
B. Syntaxe d'appel
des commandes filtres
commandeAfiltre options ficl fic2 ...
commande_filtre options
commande_filtre options < fichier
commande
| commande_filtre options
C. Visualisation de données
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'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'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
è..
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.
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'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 '(vaux|auxerre)'
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 '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 '-e J'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
rights
reserved
A/I
Dupontlruelle du bonheur|89000lAuxerre\
89000
Ne pas interpréterle motif commeune expressionrégulière:
S grep -F '..'
tel.txt
ENIDehautOlivier13 rue de Pussenvall75020|Paris|78..25.96.78
Editions
©
La commandetail permetd'afficher
les"n" dernièreslignesd'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'option
n'est
pas précisée)
+n Affichage à partir de la ligne n jusqu'à
la dernière ligne
Les commandes ltres
Exemples
Affichage des deux dernièreslignes d'un
fichier de log d'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'un
flux de données: head
Lacommandehead permetde visualiserles "n" premièreslignesd'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'option
n'est
pas précisée)
h, ksh,bash
Chapitre
9
Exemple
Afficher la premièreligne renvoyéepar la commandeod : les premiersoctetsdu
fichier exporLpdfindiquent qu'il
s'agit
d'un
format PDF (informationutiliséepar
la commandefile, qui indique le typede contenud'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
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'écran
et les conserverdans un fichier pour
exploitationultérieure.-
S grep '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'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
AII
reserved
rights
5 christie arithmétique l2
6 0-
7 4-
8 francois histoire
Erlitions
ENI
-
©
sh,ksh,
bash Ë
ChaEitre9
8. Présentationd'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'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
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
Syntaxe
wc [ options ] [ fichier ... ]
Principales options :
-l compterle nombrede lignes
-w compterle nombre de mots
c compterle nombre d'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
0 Lesvariables
d'environnement
qui définissent
l'encodage
sont LC_ALL,
LC_CTYPE et LANG.Ellessont transmisesaux commandespar le shell (elles
doiventêtreexportées)et sontévaluéesdanscet ordre: c'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
Lacommande
cut sertà récupérer
(couper)descaractères
ou deschampsd'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'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'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'option
d permetd'exprimer
le caractèreséparateurde champ.Le caractère
séparateur
pardéfautestlatabuiation.
Exemples
Couperles2 premierschiffresd'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
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'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'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'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'indice
"n"dechaque
fichier
sont
concaténées.
Avec
l'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
©
Avecl'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
5. split
Lacommande
split permetd'éc|ater
unfichierenfragments,
chaquefragment
étantstockédans desfichiersnommésPREF|XEaa,
PREFiXEab, PREFIXEayant
pourvaleurpardéfaut"x".Si aucunnomdefichiern'est
spécifié,l'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
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'appliquer
un traitementsur certainscaractè-
res d'un
flux de données: suppression,substitutions...Cettecommandeexploite
uniquementlesdonnéesarrivantsur l'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'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'option
d permetde supprimercertainscaractèresdu flux de données.
Exemples
Transformationd'un
fichier au format DOS (fin de lignes lrln") en un format
UNIX("in").Retraitdu caractère"il" :
S tr -d '\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'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.
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'une
part et 2,5,8 d'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
rights
Ail
reserved
commandebzip2 produitl'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
©
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'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'archive
2. Archives tar
Lacommande
tar permetde créerunearchiveà partird'un
ou plusieurs
fichiers.
Si le fichier est un répertoire,i| seraarchivéavecsa sous-arborescence.
Syntaxe
wmmmmmm
Création d'une
archive
tar c [ zv] f archive fichierska_archiver ...
Vérification d'une
archive
tar t [ zv] -f archive [ fichiers_a_verifier ... ]
Extraction d'une
archive
tar x [ zv] -f archive [ fichiers_a_extraire ... ]
Principales options
-C Création d'archive
t Vérification d'archive
-x Extraction d'archive
-f archive.tar Nomde l'archiveà créer, vérifier ou extraire.
-f Dansle cas d'une
création, le contenu de l'archive
est envoyésur la sortie standard. En extraction et
vérification, le contenu de l'archive
est attendu
sur l'entrée
standard
wv Modeverbeux
ez SousLinux uniquement: permet de gérer la compression
en plus de l'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'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'archive
sontexprimés
enrelatif,
les
fichierssont doncrecréésà partirdu répertoirecourantlorsde la restauration.
3. Archives cpio
Syntaxe
Création d'une
archive 2
find . | cpio -0 [ cv ] > archive
Vérification d'une
archive 2
Les commandes ltres
Exemples
Création
d'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'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'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'entrée
standard est traitee
of=fichier;s0rtie Fichier de sortie. Si aucunfichier n'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'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'entréevers
la sortie
Exemples
Copied'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'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'encodage
: iconv
La commandeiconv permetde transformerl'encodage
d'un
flux de données,typi-
quementde l'encodage
"utf8"vers"iso8859 15"et inversement.
Syntaxe
iconv options [ fichier_à_traiter ]
Principales options :
-f encodage_entrée Encodagedu fichier d'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
Syntaxe
Connexionà unemachinedistante :
ssh [-1 nonLlogin]nom_macbine
Exécutiond'une
commande sur unemachinedistante :
sshnom'login@nom_machine
[commande]
À la premièreconnexion
surun serveur,celui-cienvoiesa clé publique.Cetteclé
représente
l'identifiant
uniquede la machine.
La commandessh demandeà l'utilisateur
s'il
reconnaît cettevaleurde clé et s'il
acceptela connexion.Dansl'affirmative,
la clé du serveurest stockéedansle
fichierSHOME/.ssh/known_hostsde la machinecliente.
D Théoriquement,
l'utilisateur
delamachinecliente
doit
vérifier
auprès
del'admi
nistrateur
de la machinedistanteque la clé proposée
est correcteavantd'ac-
cepterla première
connexion.
reserved
rights
AIIPremièreconnexionau sen/eurwww.monsite.com : l'utilisateur
étant"root"surla
machinelocale,ssh reprendcetteidentitésurla machinedistante:
# sshwww.monsite.com
- Theauthenticity
EN] of host 'www.monsite.com
(62.44.l16.l2)'
can'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'www.monsite.com,62.39.106.10'
wn
Eh,ksh,bash
Chapitre9
the list of knownhosts.
root@www.monsite.com's
password:*****
#
Seconnectersousl'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'obtientpar Pintermédiaire
de la variable5?.
Programation
shellou UniLin
nnumnmunmumuuwmmummnmmuuùdmnnmmuunmmæ
L?
Exemples
Établir
uneconnexion
surlamachine
venus
envued'un
transfert
defichiers.
Par
défaut,
sftpessaie
deseconnecter
sous
une
identité
identique
àcelle
del'utili-
sateurdela machinelocale(christie).-
christie@pluton S sftp venus
Connectingto venus...
christie@venus's
password: ******
sftp>
Établir
uneconnexion
surlamachine
venus
sousl'identité
root.-
christie@pluton S sftp rootevenus
Connectingto venus...
root@venus's
password:******
sftp>
Une
foislaconnexion
établie,
l'utilisateur
seretrouve
auprompt
sftpd'où
ilpour-
ra lancerdescommandessftp.
sftp> help
Available commands:
cd path Change
remotedirectory to 'path
lcd path Change
local directory to 'path'
Quittersftp
sftp> quit
à a. Commandes
P»
desftp
s'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'elles
s'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'exécutant
surla machinedistante
La commandesftp proposedescommandes
internesqui permettent
d'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'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'utilisateur
ne doit pasavoirà saisir le mot de passe
au clavier.La configurationqui permetl'accès
à un compted'une
machinedistante
sans avoir à fournir de mot de passeimpactel'utilisation
des commandesssh,
sftp et scp (copiede fichierentredeuxmachines).
0 Laconnexion
sansmotdepasse
diminue
leniveau
desécurité,
cetteconfigura-
tion est doncà mettreen placeuniquementlorsquecelas'avère
indispensable.
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 '/home/christie/.ssh'.
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'utilisateur
christie de la machineplutonpeut se connectersur la machine
venussousl'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'utilisation
non interactivede la commandesftp est fourni au cha-
pitreAspectsavancésde la programmation shell - Scriptd'archivage
incrémentalet
transfertsftp automatique.
G. Autres commandes
1. La commande xargs
Syntaxe
commandelI xargs [ options ] commande2
Principales options :
t Affiche la ou les commandesréellement lancées (trace de
l'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'exécution
d'une
commande.
Le résultats'interprète
de la manièresuivante:
user: tempspasséà exécuterdu codeutilisateur
- sys : tempspasséà exécuterdu codenoyau
- reai ; duréed'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'est exécutée
qu'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'arguments,
il est pos-
sible de spécifier le nombred'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'exécution
de la commandeavecl'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
Syntaxe
cmp [ options ] fichierl fichier2
Principales options
-s Modesilencieux
Si fichierl ou fichier2 sont remplacéspar " ", l'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
0 Lesfichiers
doivent
êtrepréalablement
triés.
Syntaxe
reserved
comm[ option ] fichierl
Principales options
fichierz
All
rights
41
-2
N'affiche
pas les lignes spécifiques à fichierl
N'affiche
pas les lignes spécifiques à fichierz
Editions
ENI
-
v3 N'affiche
pas les lignes communes aux 2 fichiers
Si fichierl ou fichierz sont remplacés
par "-", l'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'interprétation
d'une . . . . . . . . . 375
commande
lî"" '
7'
Annexes
\
îlî(()) non oui oui Substitutiond'expression
arith-
métique.
cmdel && cmde2 oui oui oui Opérateurslogiquesdu shell.
cmdel || cmde2
# oui oui oui Commentaire.
N non oui oui Répertoired'accueil
de l'utilisa-
teur.
Programationshell
Æ sos Unix/Linu
Annexes
mSmm
Editions
for
© functionfl
oui
non
oui
oui
oui
oui
Structurede contrôle.
Définitiond'une
fonction.
Arogramtio shelsousUni/Linux
Commande
sh(Bourne)
ksh88bash Signification
unset oui oui oui Suppression
d'une
variable.
until oui oui oui Structure
decontrôle.
wait oui oui oui Attente
delamort
d'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'une
commande
n'est
pas
décrit
dans
laksh88,
maisdans la pratiqueil fonctionne.
C.Ordred'interprétation
d'une
commande
Leshellinterprète
unecommande
dansl'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'abord
lacommande danssa
liste
d'alias.
Sicelle-ci
n'est
pas
trouvée, leshell
recherche
dans sescommandes
internes.
S'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
©
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'une
fonction,216
8S, 141
î expression-arithmétique)), 170
commande), 119
3*, 135
comparaisonavec5C}, 200
paramètrespositionnelsd'une
fonction,216
5?, 139
S@, 135
comparaisonavec5*, 200
paramètrespositionnelsd'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
dans
sed,
285
&-, 229
&&
commande
[[]],159
commande(( )), 167
opérateurdu shell, 160
&1, 50
&2, 50
(),63
définition
d'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'un
script, 135
d'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'é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'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
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'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'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'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'interprétation,
124
Linux,19
iog, 313
LOGNAME, 84, 86
Longueur
d'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'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'entrée
standard,44
descripteurs1 et 2 vers le mêmefichier, 45
d'un
bloc, 235
éliminerles affichages,42
entréestandardd'unscript, 225
exécutiondu script, 231
fermetured'un
descripteur,53
mécanismeinterne,43
sortied'erreur
standard,40
sortiestandard,39
sortiestandardet sortied'erreur
standard,41
sortiestandardet sortied'erreurstandardd'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'expressions
arithmétiques,170
substr,312
system,318
l Tableau,
206 assignement global,207
assignerun élément,206
dansawk, 307
longueurd'un
élément,208
nombred'é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'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'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