La programmation 'Shell'

Programming · course

Browse all programmation documents

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

...