La programmation en shell

La programmation en shell

Le shell est plus qu’un interpréteur de commandes : c’est également un puissant langage de programmation. Cela n’est pas propre à Linux ; tout système d’exploitation offre cette possibilité d’enregistrer dans des fichiers des suites de commandes que l’on peut invoquer par la suite. Mais aucun système d’exploitation n’offre autant de souplesse et de puissance que le shell Linux dans ce type de programmation. Le revers de cette médaille est que la syntaxe de ce langage est assez stricte et rébarbative. De plus, l’existence de plusieurs shells conduit à plusieurs langages différents. Sous Linux, un fichier contenant des commandes est appelé script et nous n’emploierons plus que ce terme dans la suite. De même nous utiliserons le terme shell pour désigner à la fois l’interpréteur de commandes et le langage correspondant (tout comme “ assembleur ” désigne à la fois le langage assembleur et le compilateur de ce langage). Comme tout langage de programmation conventionnel, le shell comporte des instructions et des variables. Les noms de variables sont des chaînes de caractères ; leurs contenus sont également des chaînes de caractères. L’assignation (Bourne-shell, POSIX-shell et Bash) d’une valeur à une variable se fait par un nom ; la référence à cette variable se fait par son nom précédé du caractère $, comme dans : mavariable bonjour § assignation echo $mavariable § référence Le jeu d’instructions lui-même comporte : ● toutes les commandes Linux, ● l’invocation de programmes exécutables (ou de scripts) avec passage de paramètres, La programmation en shell ● des instructions d’assignation de variables, ● des instructions conditionnelles et itératives, ● des instructions d’entrée-sortie. Et bien entendu, les mécanismes de tubes et de redirections sont utilisables dans un script. Remarques 1) Le shell est un langage interprété ; en conséquence tout changement dans le système sera pris en compte par un script lors de sa prochaine utilisation (il est inutile de “ recompiler ” les scripts). 2) Il est tout à fait possible d’écrire et d’invoquer des scripts dans un certain shell tout en utilisant un autre shell en interactif. En particulier, il est très fréquent (mais non obligatoire) d’utiliser un TC-shell en tant que “login shell” et le Bourne-shell ou un autre shell pour l’écriture des scripts. Les scripts les plus simples (listes de commandes) seront identiques quel que soit le shell, mais dès que des instructions de tests ou d’itérations sont nécessaires, les syntaxes du Bourne-shell, du Bash et du C-shell diffèrent. 3) Si un script commence par la ligne #!/bin/xxx chemin d’accès du shell xxx qui doit interpréter ce script il est interprété par le shell /bin/xxx. Notre objectif ici n’est pas une étude exhaustive de la programmation en shell, mais une introduction à cette technique illustrant les notions et instructions principales.

LA PROGRAMMATION DE BASE EN SHELL 

Dans ce qui suit, on supposera que l’environnement de l’utilisateur est le Bash, et qu’il écrit ses scripts dans le langage de l’interpréteur de commandes Bash. Les bases de programmation exposées dans ce paragraphe peuvent être considérées comme communes à tous les interpréteurs de commandes issus de la famille des Bourne-shell (Bourne-shell, POSIX-shell, Bash). Attention Toujours commencer un shell script par la ligne #!/bin/bash. 

Le premier script 

Création avec l’éditeur vi du fichier listf contenant la ligne ls aCF. Un fichier ordinaire n’a pas le droit x (il n’est pas exécutable) à sa création, donc : xstra> chmod a+x listf § ajoute le droit x § pour tout le monde. Il peut donc être exécuté comme une commande : xstra> listf ./ .kshrc .securite/ bin/ florent/ xavier/ ../ .profile .sh_history dpt/ jerome/ xstra> Exécution du script en mode mise au point : xstra> sh x listf § mode trace ou xstra> sh v listf § mode verbose permettent de demander au shell qui interprète le script de tracer le déroulement du script ou de le commenter (ou les deux). Il est également possible d’inclure dans le script les lignes : set x (pour le mode trace) set v (pour le mode verbose) Le mode trace recopie sur la sortie standard chaque ligne telle qu’elle est interprétée. Le mode verbose recopie sur la sortie standard chaque ligne avant interprétation.

Le passage des paramètres

 Le script listf ne s’applique qu’au répertoire courant. On peut le rendre plus général en lui transmettant le nom d’un répertoire en argument lors de l’invocation. Pour ce faire, les variables 1, 2, …, 9 permettent de désigner respectivement le premier, le deuxième, …, le neuvième paramètre associés à l’invocation du script. a) Premier script avec passage de paramètres Avec vi, modifier le fichier listf de la façon suivante : echo ”contenu du repertoire $1 ” ls aCF $1 L’exécution donne : xstra> listf /tmp contenu du repertoire /tmp  ./ ../ df_file xstra> b) Généralisation Le nombre de paramètres passés en argument à un script n’est pas limité à 9 ; toutefois seules les neuf variables 1, …, 9 permettent de désigner ces paramètres dans le script. La commande shift permet de contourner ce problème. Après shift, le ième paramètre est désigné par $i 1. Exemple 1 Le script echopara contient : echo $1 $2 $3 P1 $1 shift echo $1 $2 $3 echo $P1 L’exécution donne : xstra> echopara un deux trois un deux trois deux trois un xstra> Cet exemple montre le comportement de shift, l’affectation d’une valeur à la variable P1 (P1=$1) et la référence à cette variable (echo $P1). Exemple 2 Le script echopara1 de décalage des paramètres contient : echo shift echoL’exécution donne : xstra> echopara xstra>

Les variables spéciales 

En plus des variables 1, 2, …, 9, le shell prédéfinit des variables facilitant la programmation. 0 contient le nom sous lequel le script est invoqué, – La photocopie non autorisée est un délit. # contient le nombre de paramètres passés en argument, * contient la liste des paramètres passés en argument, ? contient le code de retour de la dernière commande exécutée, $ contient le numéro de process (PID) du shell (décimal). Exemple 1 Exemple 2 Le script echopara2 contient : echo $0 a ete appele avec $# parametres echo qui sont : $* L’exécution donne : xstra> echopara2 a b c d ./echopara2 a ete appele avec 4 parametres qui sont : a b c d xstra> Attention, la variable # n’est pas une variable numérique (qui n’existe pas) mais une variable de type chaîne de caractères (de même pour $). 0 permet de savoir sous quel nom ce script a été invoqué. Dans le cas où le script porte plusieurs noms (par des liens), cela permet de prendre telle ou telle décision suivant le nom sous lequel le script a été invoqué. $ numéro de process (PID) du shell, est unique dans le système : il est fréquemment utilisé pour générer des noms de fichiers temporaires. Exemple tempfil /tmp/infile_user_$$ § utilisation du fichier temporaire rm $tempfil 

Les caractères spéciaux 

Attention Ces caractères sont générateurs des noms de fichiers et sont utilisés dans le passage des paramètres. echopara alpha beta gamma • La programmation en shell Selon un mécanisme général (voir le paragraphe 3.2 et 7.7), le shell peut générer une liste des noms de fichiers correspondant à un certain modèle (grâce aux caractères * et ?). Cette génération a lieu avant l’invocation de la commande (et donc du script) concernée. Par exemple, si le répertoire courant contient uniquement les fichiers fich1 et fich2, lors de la commande ls fi*, le shell génère la liste fich1 fich2 et la passe en argument à la commande ls. La commande effectivement lancée par le shell est donc : ls fich1 fich2.

Les instructions de lecture et d’écriture

 Ces instructions permettent de créer des fichiers de commandes interactifs par l’instauration d’un dialogue sous forme de questions/réponses. La question est posée par l’ordre echo et la réponse est obtenue par l’ordre read à partir du clavier. read variable1 variable2… variablen read lit une ligne de texte à partir du clavier, découpe la ligne en mots et attribue aux variables variable1 à variablen ces différents mots. S’il y a plus de mots que de variables, la dernière variable se verra affecter le reste de la ligne. Exemple Le script affiche contient : echo n ”Nom du fichier a afficher : ” read fichier more $fichier

Cours gratuitTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *