UNIX STATION
La programmation "Shell"
Version 2.0
LA PROGRAMMATION
"SHELL"
Edition novembre 2008
Fr d ric Lang ([email protected])
1/89
UNIX STATION
La programmation "Shell"
Version 2.0
Licence de ce document
Permission est accord e de copier, distribuer et/ou modifier ce document selon les
termes de
la "Licence de Documentation Libre GNU" (GNU Free Documentation
License), version 1.1 ou toute version ult rieure publi e par la Free Software
Foundation.
En particulier le verbe "modifier" autorise tout lecteur ventuel apporter au document
ses propres contributions ou corriger d' ventuelles erreurs et lui permet d'ajouter son
propre copyright dans la page "Registre des ditions" mais lui interdit d'enlever les
copyrights d j pr sents et lui interdit de modifier les termes de cette licence.
Ce document ne peut tre c d , d pos ou distribu d'une autre mani re que l'autorise
la "Licence de Documentation Libre GNU" et
type annule
automatiquement les droits d'utiliser ce document sous cette licence. Toutefois, des
tiers ayant re u des copies de ce document ont le droit d'utiliser ces copies et
continueront b n ficier de ce droit tant qu'ils respecteront pleinement les conditions
de la licence.
tentative de ce
toute
La version actuelle de ce document est la 2.0 et sa version la plus r cente est
disponible en t l chargement l'adresse http://fr.lang.free.fr
Copyright 2007 Fr d ric Lang ([email protected])
Edition novembre 2008
Fr d ric Lang ([email protected])
2/89
UNIX STATION
La programmation "Shell"
Version 2.0
Registre des ditions
Version
1.0
Date
30 juillet 2004
Description des modifications
Mise en place du registre des ditions
Corrections mineures (syntaxe, etc)
Auteur des modifications
Fr d ric Lang ([email protected])
1.1
1.2
26 ao t 2004
Relecture Corrections mineures
Fr d ric Lang ([email protected])
24 novembre 2004 Rajout du test de la num ricit d'une variable en "r el"
Fr d ric Lang ([email protected])
V rification et corrections majeures de tous les exercices
1.3
24 f vrier 2005
Rectification sur le paragraphe des fonctions
Corrections mineures
Fr d ric Lang ([email protected])
1.4
15 septembre 2005 Rajout de la variable "REPLY" dans le "select" et dans la
Fr d ric Lang ([email protected])
Fr d ric Lang ([email protected])
2.0
26 juin 2007
liste des variables internes
Corrections mineures
Rajout d'un paragraphe dans l'introduction
Prise en compte de nouveaux shells
R criture compl te du chapitre des fonctions
Correction sur les substitutions de variables
Rajout de la variable "REPLY" dans le "read"
Correction sur la commande "test"
Cr ation du chapitre sur les outils avanc s
R vision de l'instruction "set"
Rajout de l'instruction "source"
Rajout de l'instruction "trap"
Rajout de l'instruction "let"
Rajout des instructions "typeset" et "declare"
Rajout des instructions "locale""
R vision de l'instruction "getopts"
Correction sur la commande "expr"
Correction sur la commande "exec"
Rajout de la commande "seq"
Rajout de la commande "xargs"
Rajout de la commande "getopt"
R vision majeure des exemples "division" et "r solution
polyn mes"
Rajout de l'exemple "tours de Hano "
Remplacement de ladresse email "[email protected]"
par "[email protected]"
Edition novembre 2008
Fr d ric Lang ([email protected])
3/89
UNIX STATION
La programmation "Shell"
Version 2.0
SOMMAIRE
I)
INTRODUCTION_________________________________________________________________________ 7
1) POURQUOI PROGRAMMER EN SHELL ? _________________________________________________________ 8
2) PRESENTATION __________________________________________________________________________ 8
3)
IMPERATIFS ____________________________________________________________________________ 10
4) CONVENTIONS DU SUPPORT DE COURS _______________________________________________________ 10
II) ELEMENTS DE BASE DU LANGAGE______________________________________________________ 11
1) L'AFFICHAGE___________________________________________________________________________ 11
2) LES COMMENTAIRES _____________________________________________________________________ 11
3) LE DEBOGUEUR _________________________________________________________________________ 11
4) QUI EXECUTE ? _________________________________________________________________________ 12
a)
b)
c)
III) LES VARIABLES________________________________________________________________________ 13
1) L'AFFECTATION L'ACCES ________________________________________________________________ 13
Advertisement
Les variables simples__________________________________________________________________ 13
Les tableaux (shells volu s) ____________________________________________________________ 14
Remarque___________________________________________________________________________ 14
2) LA SUBSTITUTION _______________________________________________________________________ 15
a)
Tous types de Shell ___________________________________________________________________ 15
b) Uniquement en Korn Shell et Bourne Again Shell (et shells descendants) _________________________ 16
c) Uniquement en Bourne Again Shell (et shells descendants) ____________________________________ 16
Remarque___________________________________________________________________________ 16
d)
3) LA SAISIE EN INTERACTIF _________________________________________________________________ 17
4) LA PROTECTION ________________________________________________________________________ 17
5) LA SUPPRESSION ________________________________________________________________________ 18
6) LA VISIBILITE __________________________________________________________________________ 18
7) LE TYPAGE ("KORN SHELL" ET "BOURNE AGAIN SHELL" ET SHELLS DESCENDANTS) ___________________ 20
8) LES VARIABLES PREDEFINIES ______________________________________________________________ 21
IV) LA "SOUS-EXECUTION" ________________________________________________________________ 22
V) LES PARAMETRES _____________________________________________________________________ 24
1) RECUPERATION DES PARAMETRES___________________________________________________________ 24
2) DECALAGE DES PARAMETRES ______________________________________________________________ 25
3) RE AFFECTATION VOLONTAIRE DES PARAMETRES_______________________________________________ 26
4) LE SEPARATEUR DE CHAMPS INTERNES _______________________________________________________ 26
VI) NEUTRALISATION DES META CARACTERES ____________________________________________ 27
1) RAPPEL SUR LES META CARACTERES_________________________________________________________ 27
2) LE "BACKSLASHE"_______________________________________________________________________ 28
3) L'APOSTROPHE OU "QUOTTE SIMPLE" ________________________________________________________ 28
4) LE DOUBLE GUILLEMET___________________________________________________________________ 28
VII) LES CONTROLES BOOLEENS ___________________________________________________________ 29
1)
INTRODUCTION _________________________________________________________________________ 29
2) LA COMMANDE "TEST" ___________________________________________________________________ 30
a)
Test simple sur les fichiers______________________________________________________________ 30
b) D'autres test simple sur les fichiers ("Korn Shell" et "Bourne Again Shell" et shells descendants) ______ 30
Test complexe sur les fichiers ("Korn Shell" et en "Bourne Again Shell" et shells descendants) ________ 31
c)
Test sur les longueurs de cha nes de caract res _____________________________________________ 31
d)
Test sur les cha nes de caract res ________________________________________________________ 31
e)
f)
Test sur les num riques ________________________________________________________________ 32
g) Connecteurs d'expression ______________________________________________________________ 32
3) LES COMMANDES "TRUE" ET "FALSE" ________________________________________________________ 33
4) LA COMMANDE "READ" ___________________________________________________________________ 33
VIII) LES STRUCTURES DE CONTROLES ______________________________________________________ 34
INTRODUCTION _________________________________________________________________________ 34
1)
Edition novembre 2008
Fr d ric Lang ([email protected])
4/89
UNIX STATION
La programmation "Shell"
Version 2.0
2) L'ALTERNATIVE SIMPLE __________________________________________________________________ 34
3) L'ALTERNATIVE COMPLEXE________________________________________________________________ 35
4) LE BRANCHEMENT A CHOIX MULTIPLE _______________________________________________________ 36
5) LA BOUCLE SUR CONDITION _______________________________________________________________ 37
6) LA BOUCLE SUR LISTE DE VALEURS__________________________________________________________ 38
INTERRUPTION D'UNE OU PLUSIEURS BOUCLES _________________________________________________ 39
7)
INTERRUPTION D'UN PROGRAMME___________________________________________________________ 40
8)
9) LE GENERATEUR DE MENUS EN BOUCLE (KORN SHELL ET BOURNE AGAIN SHELL ET SHELLS DESCENDANTS)_ 40
IX) LES FONCTIONS _______________________________________________________________________ 41
INTRODUCTION _________________________________________________________________________ 41
1)
2) PASSAGE DE VALEURS____________________________________________________________________ 42
3) RETOUR DE FONCTION____________________________________________________________________ 43
4) RENVOI D'UNE VALEUR PAR UNE FONCTION ___________________________________________________ 44
5) PORTEE DES VARIABLES __________________________________________________________________ 45
IMBRICATION DE FONCTIONS_______________________________________________________________ 46
6)
7) LA TRACE DE L'APPELANT _________________________________________________________________ 48
X) LES INSTRUCTIONS AVANCEES _________________________________________________________ 49
1) L'INCLUSION DE SCRIPT DANS UN SCRIPT______________________________________________________ 49
2) LA PROTECTION CONTRE LES SIGNAUX _______________________________________________________ 50
3) TRANSFORMER UNE EXPRESSION EN ORDRE "SHELL" ____________________________________________ 51
4) ARITHMETIQUE SUR LES VARIABLES ("KORN SHELL" ET "BOURNE AGAIN SHELL" ET SHELLS DESCENDANTS) 51
5) CREER DE NOUVEAUX CANAUX D'ENTREES/SORTIES _____________________________________________ 52
6) GERER LES OPTIONS _____________________________________________________________________ 53
XI) LES COMPLEMENTS____________________________________________________________________ 55
1) EVALUER DES EXPRESSIONS REGULIERES AVEC LA COMMANDE "EXPR" ______________________________ 55
Arithm tique ________________________________________________________________________ 55
a)
b) Comparaison ________________________________________________________________________ 56
Travail sur cha nes de caract res ________________________________________________________ 56
c)
2) RECHERCHER DES CHAINES AVEC LA COMMANDE "GREP"_________________________________________ 57
3) DECOUPER DES LIGNES AVEC LA COMMANDE "CUT" _____________________________________________ 58
4) TRIER LES INFORMATIONS AVEC LA COMMANDE "SORT"__________________________________________ 58
5) FILTRER LES INFORMATIONS AVEC LA COMMANDE "SED" _________________________________________ 59
6) TRANSFORMER LES INFORMATIONS AVEC LA COMMANDE "TR" ____________________________________ 59
7) COMPTER LES OCTETS AVEC LA COMMANDE "WC" ______________________________________________ 60
8) AFFICHER UNE SEQUENCE DE NOMBRES AVEC LA COMMANDE "SEQ" ________________________________ 60
9) AFFICHER DES DONNEES FORMATEES AVEC LA COMMANDE "PRINTF"________________________________ 60
10) DECOUPER LES NOMS AVEC LES COMMANDES "BASENAME" ET "DIRNAME" ___________________________ 61
11) FILTRER LES ARGUMENTS AVEC LA COMMANDE "XARGS"_________________________________________ 61
12) MATHEMATIQUES EN VIRGULE FLOTTANTE AVEC LA COMMANDE "BC" ______________________________ 62
13) GERER LES OPTIONS AVEC LA COMMANDE "GETOPT" ____________________________________________ 62
14) GERER SON AFFICHAGE A L'ECRAN AVEC LES CODES "ESCAPE" ____________________________________ 64
XII) EXEMPLES DIVERS_____________________________________________________________________ 66
1) AFFICHER UNE PHRASE SANS QUE LE CURSEUR PASSE A LA LIGNE SUIVANTE __________________________ 66
2) VERIFIER L'EXISTENCE D'UN FICHIER QUEL QUE SOIT SON TYPE ____________________________________ 66
3) VERIFIER LA NUMERICITE D'UNE VARIABLE EN TERME DE "NOMBRE ENTIER" __________________________ 66
4) VERIFIER LA NUMERICITE D'UNE VARIABLE EN TERME DE "NOMBRE REEL" ___________________________ 67
5) NOM DE BASE DU REPERTOIRE COURANT _____________________________________________________ 67
6) VERIFICATION DE L'AUTORISATION D'ACCES D'UN UTILISATEUR QUELCONQUE_________________________ 68
7) MEMBRES D'UN GROUPE __________________________________________________________________ 69
8) SERVEURS GERES PAR "INETD" _____________________________________________________________ 70
9) RECHERCHE D'UNE COMMANDE ____________________________________________________________ 71
10) ARBORESCENCE D'UN REPERTOIRE __________________________________________________________ 72
11) FACTORIELLE D'UN NOMBRE _______________________________________________________________ 74
12) PGCD DE DEUX NOMBRES ________________________________________________________________ 76
13) DIVISION EN NOMBRES REELS ______________________________________________________________ 78
2
14) RESOLUTION DE POLYNOME DU SECOND DEGRE : AX
+ BX + C = 0 ________________________________ 83
Advertisement
15) TOURS DE HANO _______________________________________________________________________ 86
Edition novembre 2008
Fr d ric Lang ([email protected])
5/89
UNIX STATION
La programmation "Shell"
Version 2.0
INDEX ______________________________________________________________________________________ 88
Edition novembre 2008
Fr d ric Lang ([email protected])
6/89
UNIX STATION
La programmation "Shell"
Version 2.0
I)
INTRODUCTION
Le Shell est un "INTERPRETEUR DE COMMANDE". Il ne fait pas partie du syst me
d'exploitation UNIX; et c'est la raison pour laquelle il porte ce nom "coquille", qui indique son tat
d tach du "noyau" Unix. Son r le est d'analyser la commande tap e afin de faire r agir le syst me
pour qu'il r ponde aux besoins de l'utilisateur. C'est le premier langage de commandes d velopp
sur Unix par Steve Bourne.
Une comparaison rapide pourrait l'apparenter au DOS (Disc Operating System) d velopp par
Microsoft, mais cette comparaison n'est l que pour illustrer le r le du Shell par rapport Unix.
De par sa qualit de "programme externe", il n'est pas unique. En effet, rien n'emp che n'importe
quel programmeur de programmer une boucle qui attend une cha ne au clavier, analyse cette cha ne
et appelle ensuite le syst me pour ex cuter l'ordre demand . C'est la raison pour laquelle il existe
plusieurs shells. Nous trouvons entre autres (liste non-exhaustive) :
(cid:1) le Bourne Shell ("/bin/sh")
(cid:1) le Korn Shell ("/bin/ksh")
(cid:1) le c Shell ("/bin/csh") pour les utilisateurs pr f rant un langage apparent au "C"
(cid:1) le Job Shell ("/bin/jsh")
(cid:1) le Shell r seau ("/bin/rsh")
(cid:1) le Bourne Again Shell ("/bin/bash") qui a repris le Bourne Shell mais qui l'a agr ment de
nouvelles fonctionnalit s (rappel de commandes, compl tion automatique, etc.)
(cid:1) le c Shell am lior ("/bin/tcsh") am liorant le c Shell tout en lui restant compatible
(cid:1) l'Almquist Shell ("/bin/ash") am liorant le Bourne Shell tout en tant plus compact que le
Bourne Again Shell
(cid:1) le z Shell ("/bin/zsh")
(cid:1) et d'autres encore venir&
C'est un langage de commandes mais aussi un langage de programmation. Il permet donc :
(cid:1) l'utilisation de variables
(cid:1) la mise en s quence de commandes
(cid:1) l'ex cution conditionnelle de commandes
(cid:1) la r p tition de commandes
Un programme shell appel aussi "script" est un outil facile utiliser pour construire des
applications en regroupant des appels syst mes, outils, utilitaires et programmes compil s.
Concr tement, le r pertoire entier des commandes Unix, des utilitaires et des outils est disponible
partir d'un script shell. Les scripts shell conviennent parfaitement pour des t ches d'administration
du syst me et pour d'autres routines r p titives ne r clamant pas les particularit s d'un langage de
programmation structur .
Edition novembre 2008
Fr d ric Lang ([email protected])
7/89
UNIX STATION
La programmation "Shell"
Version 2.0
1) Pourquoi programmer en shell ?
Aucun langage de programmation n'est parfait. Il n'existe m me pas un langage meilleur que
d'autres ; il n'y a que des langages en ad quation ou peu conseill s pour des buts particuliers.
(Herbert Mayer).
Une connaissance fonctionnelle de la programmation shell est essentielle quiconque souhaite
devenir efficace en administration syst me car toute l'administration dans Unix est crite en shell.
Une compr hension d taill e des scripts d'administration est importante pour analyser le
comportement du syst me, voire le modifier. De plus, la seule fa on pour vraiment apprendre la
programmation des scripts est d' crire des scritpts.
Quand ne pas programmer en shell ?
(cid:1) Pour des t ches demandant beaucoup de ressources ou beaucoup de rapidit
(cid:1) Pour une application complexe o une programmation structur e est n cessaire (typage des
variables, prototypage de fonctions, tableaux multi dimensionels, listes cha n es, arbres, etc.)
(cid:1) Pour des situations o la s curit est importante (protection contre l'intrusion, le vandalisme)
(cid:1) Pour des applications qui acc dent directement au mat riel
(cid:1) Pour des applications qui devront g n rer ou utiliser une interface graphique utilisateur (G.U.I.)
(cid:1) Pour des applications propri taires (un script est forc ment lisible par celui qui l'utilise)
Pour toutes ces situations, Unix offre une gamme de langages de scripts plus puissants comme le
Perl, Tcl, Python, Ruby ; voire des langages compil s de haut niveau comme le C et le C++.
2) Pr sentation
Il existe deux moyens de "programmer" en Shell.
Le premier, est dit en "direct". L'utilisateur tape "directement" la ou les commandes qu'il veut
lancer. Si cette commande a une syntaxe qui l'oblige tre d coup e en plusieurs lignes, le Shell
indiquera par l'affichage d'un "prompt secondaire" que la commande attend une suite et n'ex cutera
r ellement la commande qu' la fin de la derni re ligne.
Exemple :
Prompt> date
Tue Jan 16 17:26:50 NFT 2001
Prompt> pwd
/tmp
Prompt > if test 5 = 5
Prompt secondaire> then
Prompt secondaire> echo vrai
Prompt secondaire> fi
vrai
Edition novembre 2008
Fr d ric Lang ([email protected])
8/89
UNIX STATION
La programmation "Shell"
Version 2.0
Le second, est dit en "script" ; appel aussi "batch" ou "source Shell". L'utilisateur cr e un fichier
texte par l' diteur de son choix (ex : "vi"). Il met dans ce script toutes les commandes qu'il voudra
lui faire ex cuter ; en respectant la r gle de base de ne mettre qu'une seule commande par ligne.
Une fois ce script fini et sauvegard , il le rend ex cutable par l'adjonction du droit "x" (cf. Gestion
des fichiers). Il peut ensuite lancer l'ex cution de ce fichier comme n'importe quelle autre
commande Unix (attention donc au contenu de la variable "PATH" qui indique o aller chercher
une commande lorsqu'on la lance sans pr ciser o elle se trouve).
Toutes les commandes inscrites dans le fichier texte seront ex cut es s quentiellement.
Exemple :
Contenu du fichier "prog" :
date
pwd
if test 5 = 5
then
echo "vrai"
fi
Lancement de l' diteur
Prompt> vi prog
Mise jour du droit d'ex cution
Prompt> chmod a+x prog
Ex cution du script pris dans le
Advertisement
r pertoire courant
Prompt> ./prog
Tue Jan 16 17:26:50 NFT 2001
/tmp
oui
Remarque :
L'adjonction du droit "x" n'est pas obligatoire, mais l'utilisateur devra alors demander
sp cifiquement un Shell quelconque d'interpr ter le "script".
Exemple : L'utilisateur demande d'interpr ter
le script par l'interm diaire du "Bourne Shell"
Exemple : L'utilisateur demande d'interpr ter
le script par l'interm diaire du "Korn Shell"
Prompt> sh prog
Tue Jan 16 17:26:50 NFT 2001
/tmp
oui
Prompt> ksh prog
Tue Jan 16 17:26:50 NFT 2001
/tmp
oui
Edition novembre 2008
Fr d ric Lang ([email protected])
9/89
UNIX STATION
La programmation "Shell"
Version 2.0
3) Imp ratifs
Comme il l'a t dit, le Shell est un "interpr teur". C'est dire que chaque ligne est analys e,
v rifi e et ex cut e. Afin de ne pas trop limiter la rapidit d'ex cution, il y a tr s peu de r gles
d'analyse. Cela implique un grande rigidit d' criture de la part du programmeur. Une majuscule
n'est pas une minuscule ; et surtout, deux l ments distincts sont toujours s par s par un
espace& une exception pr s qui sera vue plus tard.
Enfin, le premier mot de chaque ligne, si la ligne n'est pas mise en commentaire, doit tre une
instruction Shell "correcte". On appelle "instruction" soit
(cid:1) l'appel d'une commande "Unix" (ex : date)
(cid:1) l'appel d'un autre script "Shell" (ex : ./prog)
(cid:1) une commande interne du langage (ex : cd&)
Exemple :
Prompt> echoBonjour
sh: echoBonjour: not found
Prompt> echo Bonjour
Bonjour
4) Conventions du support de cours
Il est difficile d' crire un support de cours en essayant de faire ressortir des points importants par
l'utilisation de caract res sp cifiques (guillemets, parenth ses, etc.) sur un langage utilisant certains
caract res comme instructions sp cifiques (guillemets, parenth ses, etc.). De plus, le lecteur ne sait
pas forc ment distinguer les l ments provenant de l'ordinateur des l ments qu'il doit taper au
clavier. C'est pourquoi, il est n cessaire de d finir des conventions
(cid:1) La cha ne "Prompt>" ou "Prompt2>" pr sente dans les exemples de ce cours est une "invite" ;
appel e aussi "prompt". C'est une cha ne affich e par l'interpr teur dans lequel travaille l'utilisateur
afin de lui indiquer qu'il attend une instruction. Cette cha ne n'est pas forc ment la m me pour des
utilisateurs diff rents. Dans ce support, sa pr sence signifie que l'exemple propos peut tre tap
directement en ligne, sans obligatoirement passer par un fichier script.
(cid:1) La cha ne "#!/bin/sh" pr sente dans les exemples de ce cours est expliqu e plus tard. Dans ce
support, sa pr sence signifie qu'il vaut mieux crire l'exemple propos dans un fichier "script" afin
de pouvoir ex cuter l'exemple plusieurs fois pour mieux analyser son fonctionnement.
(cid:1) Les syntaxes pr sentes en d but de paragraphe donnent la syntaxe exacte d'une commande. Elles
sont donc pr sent es sans prompt ni ligne "#!/bin/sh".
(cid:1) Des l ments mis entre crochets " " signifient qu'ils sont facultatifs. L'utilisateur peut les
utiliser ou pas, mais ne doit en aucun cas mettre de crochets dans sa frappe ou son programme.
(cid:1) Le caract re n employ dans la syntaxe signifie "nombre entier quelconque positif ou, parfois,
nul".
(cid:1) Le caract re "|" employ dans la syntaxe signifie "choix entre l' l ment situ gauche ou droite
du |".
(cid:1) Les points de suspension "&" signifient que l' l ment plac juste avant eux peut tre r p t
autant de fois que l'on d sire.
Edition novembre 2008
Fr d ric Lang ([email protected])
10/89
UNIX STATION
La programmation "Shell"
Version 2.0
II) ELEMENTS DE BASE DU LANGAGE
1) L'affichage
L'affichage est la premi re commande qu'un programmeur d butant pourra tre tent de faire. Cela
lui permet en effet de visualiser directement l' cran le r sultat de ses actions.
L'affichage en Shell se fait avec la commande "echo".
Exemple :
Prompt> echo Hello World
2) Les commentaires
Un commentaire sert am liorer la lisibilit du script. Il est plac en le faisant pr c der du caract re
di se ("#"). Tout ce qui suit ce di se est ignor jusqu' la fin de la ligne ; ce qui permet de mettre un
commentaire sur une ligne d'instructions. Il ne faut pas oublier alors l'espace s parant la fin de
l'instruction et le d but du commentaire.
Exemple :
#!/bin/sh
Ce programme affiche la date
date
Cette ligne est la ligne qui affiche la date
3) Le d bogueur
Une proc dure longue et difficile peut ne pas r ussir du premier coup. Afin de d tecter l'erreur, le
Shell offre un outil de d bogage. Il s'agit de l'instruction "set" agr ment e d'une ou plusieurs
options suivantes :
(cid:1) v : affichage de chaque instruction avant analyse => il affiche le nom des variables
(cid:1) x : affichage de chaque instruction apr s analyse => il affiche le contenu des variables
(cid:1) e : sortie imm diate sur erreur
Chaque instruction "set -&" active l'outil demand qui sera d sactiv par l'instruction "set +&". On
peut ainsi activer le "traqueur" sur une portion pr cise du programme source.
Exemple :
#!/bin/sh
set x
date
set +x
Activation du d bogage partir de maintenant
Cette ligne est la ligne qui affiche la date
D sactivation du d bogage partir de maintenant
Remarque : Compte tenu du flot important d'informations produit par ces outils, il peut tre
avantageux de lui pr f rer un affichage des variables pouvant causer l'erreur (commande "echo").
Edition novembre 2008
Fr d ric Lang ([email protected])
11/89
UNIX STATION
La programmation "Shell"
Version 2.0
4) Qui ex cute ?
Rappelons qu'il existe plusieurs shells et que chacun d'eux poss de des caract ristiques diff rentes.
De plus, chaque utilisateur Unix peut demander travailler dans le Shell de sa convenance. Il
s'ensuit qu'un script crit par un utilisateur travaillant en Bourne Shell ne fonctionnera pas
Advertisement
forc ment s'il est ex cut par un utilisateur travaillant en C-Shell.
L'utilisateur peut visualiser le Shell dans lequel il travaille en tapant la commande suivante:
Prompt> echo $0
Cependant, Unix cherche assurer la portabilit de ses programmes. Il est donc n cessaire qu'un
script crit par un utilisateur travaillant en Bourne Shell puisse tre ex cut par tous les utilisateurs,
quels que soient leurs shells de travail.
Pour cela, il convient d'indiquer dans le script quel interpr teur utiliser pour ex cuter ledit script. Si
cette indication n'existe pas, le syst me utilisera l'interpr teur de travail affect l'utilisateur pour
analyser et ex cuter le script en question, interpr teur pas forc ment compatible avec la syntaxe du
script.
Cette indication se porte en d but de script avec la ligne "#!interpr teur".
Exemple en Bourne Shell :
#!/bin/sh
date
Ce script sera trait par le programme "/bin/sh" (Bourne Shell)
Demande l'interpr teur "/bin/sh" de lancer le programme "date"
Exemple en Korn Shell :
#!/bin/ksh
date
Ce script sera trait par le programme "/bin/ksh" (Korn Shell)
Demande l'interpr teur "/bin/ksh" de lancer le programme "date"
Ici, cas particulier, le caract re "#" (di se) de la premi re ligne combin au caract re "!" (point
d'exclamation) n'est plus pris comme un commentaire mais comme une instruction indiquant quel
programme a la charge d'analyser le script.
Remarque:
Ce cours proposera globalement une syntaxe Bourne Shell avec quelques l ments sp cifiques aux
shells de m me famille dits "plus volu s" (Korn Shell ou Bourne Again Shell) qui seront indiqu s
au moment o cela sera n cessaire. Le Bourne Shell tant int gralement support par le Korn Shell
et le Bourne Again Shell (et leurs descendants) ; cela permet une compatibilit ascendante (un script
en Bourne Shell fonctionnera toujours en environnements Korn Shell ou Bourne Again Shell ou
shells descendants).
Autre exemple (ne fonctionne qu'une seule fois) :
#!/bin/rm
Le script s'efface donc lui-m me - Ici le script est d j effac
Quoi que l'on mette ici, cela ne sera pas ex cut , cela n'existe d j plus&
Ce script sera trait par le programme "/bin/rm" (effacement)
Edition novembre 2008
Fr d ric Lang ([email protected])
12/89
UNIX STATION
La programmation "Shell"
Version 2.0
III) LES VARIABLES
Il n'est pas de langage sans variable. Une variable sert m moriser une information afin de la
r utiliser ult rieurement. Elles sont cr es par le programmeur au moment o il en a besoin. Il n'a
pas besoin de les d clarer d'un type particulier et peut en cr er quand il veut, o il veut.
Leur nom est repr sent par une suite de caract res commen ant imp rativement par une lettre ou le
caract re _ (soulign ou underscore) et comportant ensuite des lettres, des chiffres ou le caract re
soulign . Il ne doit pas correspondre un des mots clefs du Shell.
Leur contenu est interpr t exclusivement comme du texte. Il n'existe donc pas, en Bourne Shell,
d'instruction d'op ration sur des variables ou sur du nombre (addition, soustraction, etc.). Il n'est pas
non plus possible d'avoir des variables dimensionn es (tableaux). Mais cela est possible en
Korn Shell et Bourne Again Shell (et shells descendants).
Il est important de noter que le Shell reconna t, pour toute variable, deux tats :
(cid:1) non d finie (non-existence) : elle n'existe pas dans la m moire
(cid:1) d finie (existence) : elle existe dans la m moire ; m me si elle est vide
1) L'affectation L'acc s
a) Les variables simples
Syntaxe :
variable=cha ne
L'affectation d'une variable simple (il n'y a pas de possibilit de cr er de tableau en Bourne Shell )
se fait par la syntaxe "variable=cha ne".
C'est la seule syntaxe du Shell qui ne veuille pas d'espace dans sa structure
sous peine d'avoir une erreur lors de l'ex cution.
Dans le cas o on voudrait entrer une cha ne avec des espaces dans la variable, il faut alors encadrer
la cha ne par des guillemets simples ou doubles (la diff rence entre les deux sera vue plus tard). A
partir du moment o elle a t affect e, une variable se met exister dans la m moire, m me si elle
a t affect e avec "rien".
L'acc s au contenu de la variable s'obtient en faisant pr c der le nom de la variable du caract re "$".
Exemples :
Prompt> nom="Pierre"
Prompt> objet="voiture"
Prompt> coul=bleue
Prompt> echo "Il se nomme $nom"
Prompt> txt="$nom a une $objet $coul" # M lange de variables et texte dans une variable
Prompt> echo txt
Prompt>echo $txt
Affectation de "Pierre" dans la variable "nom"
Affectation de "voiture" dans la variable "objet"
Affectation de"bleu" dans la variable "coul"
Affichage d'un texte et d'une variable
Attention ne pas oublier le caract re "$"
Affichage de la variable "txt"
Edition novembre 2008
Fr d ric Lang ([email protected])
13/89
UNIX STATION
La programmation "Shell"
Version 2.0
b) Les tableaux (shells volu s)
Syntaxe :
variable =cha ne
variable=(cha ne1 cha ne2 &)
Le Korn Shell, Bourne Again Shell et shells descendants) permettent de cr er des tableaux une
seule dimension. L'affectation d'un l ment d'un tableau se fait par la syntaxe "variable =cha ne".
Dans ce cas pr cis, les crochets ne signifient pas " l ment facultatif" mais bien "crochets" et le
programmeur doit les mettre dans sa syntaxe.
L'indice "n" que l'on sp cifie entre les crochets doit tre imp rativement positif ou nul; mais il n'a
pas de limite maximale. De plus, rien n'oblige le programmeur remplir le n me l ment avant
d'aller remplir le (n + 1) me.
Il est possible de remplir en une seule instruction les "n" premiers l ments du tableau en utilisant la
syntaxe "variable=(cha ne1 cha ne2 &)". Dans cette syntaxe o l'utilisation de parenth ses "( )" est
obligatoire, le texte "cha ne1" ira dans la variable "variable[0]"; le texte "cha ne2" ira dans la
variable "variable[1]"; etc. Cette syntaxe remplace tout le tableau par les seules cha nes situ es
entre parenth ses. L'ancien contenu ventuel dispara t alors pour tre remplac par le nouveau.
L'acc s au contenu de la variable d'indice "n" s'obtient en encadrant le nom de la variable indic e
par des accolades "{ }" et en faisant pr c der le tout du caract re "$".
Si on remplace la valeur de l'indice par le caract re "*"; le Shell concat nera tous les l ments du
tableau en une cha ne unique et renverra cette derni re. Et si on remplace la valeur de l'indice par le
caract re "@"; le Shell transformera chaque l ment du tableau en cha ne et renverra ensuite
l'ensemble de toutes ces cha nes concat n es. Visuellement; il n'y a aucune diff rence dans le
r sultat entre l'utilisation des caract res "*" ou "@".
Dans des environnements de shells acceptant
automatiquement transform e en tableau un seul l ment d'indice "[0]".
...