c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Programmation « orientée système » :
c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Programmation « orientée système » : C, Unix shell, Perl PROGRAMMATION SHELL Jean-C´ edric Chappelier Laboratoire d’Intelligence Artificielle Facult´ e I&C Programmation Orient´ ee Syst` eme – Programmation Shell– 1/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Objectifs du cours d’aujourd’hui ◮apprendre à écrire des programmes en shell Unix : ◮variables ◮structures de contrôle ◮expressions logiques ◮fonctions Programmation Orient´ ee Syst` eme – Programmation Shell– 2/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Shell scripting On peut écrire des programmes en shell : succession de commandes Mais attention aux différents « dialectes » : sh, csh, ksh, tcsh, zsh, ... Dans ce cours, nous allons voir la « base » : sh Les programmes Shell (ou « scripts ») sont utiles pour ◮écrire très rapidement des petits programmes (système essentiellement) ◮factoriser des tâches répétitives ◮traiter beaucoup de fichiers/répertoires ◮connecter plusieurs programmes (filtres et « Glue Code ») ◮faire des installations ◮plus largement : configuration/maintenance du système Programmation Orient´ ee Syst` eme – Programmation Shell– 3/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Qu’est-ce qu’un programme shell ? C’est un fichier texte ◮contenant une suite de commandes Unix ◮exécutable (chmod +x ...) On appelle de tels programmes des scripts Un script peut lui-même devenir une commande, pour peu que ◮le répertoire où il se trouve soit contenu dans le PATH ◮le script soit auto-suffisant, c’est-à-dire contiennent la description de son interpréteur. Reprenons ces 2 aspects. Programmation Orient´ ee Syst` eme – Programmation Shell– 4/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier le PATH On a vu que la plupart des commandes Unix sont en fait des petits programmes extérieurs au shell lui-même. Ces programmes sont « cachés » dans différents endroits du système. Comment l’interpréteur de commandes fait-il pour les trouver ? Il possède pour cela une variable d’environnement, c’est-à-dire une variable faisant partie du shell, dont la portée est le processus shell lui-même et ses fils, et qui décrit les endroits possibles où chercher les commandes à exécuter. Cette variable s’appelle PATH echo $PATH /bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin Il est sage, dans un script « sensible » (i.e. important pour la sécurité du système), de limiter le PATH au minimum (e.g. /bin) en redéfinissant cette variable au début du script Programmation Orient´ ee Syst` eme – Programmation Shell– 5/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Interpréteur par défaut Pour donner un fichier à exécuter à un shell, il suffit de le passer en argument à l’interpréteur. Exemple : sh macommande ...mais ce n’est pas très pratique ! On peut, dans des fichiers programmes de langages interprétés (tous les shells, mais aussi perl, sed, awk, python, tcl, ...), donner au shell appelant l’indication de l’interpréteur à lancer pour exécuter le fichier courant Cela se fait en indiquant le nom de l’interpréteur ◮sur la première ligne du fichier ◮après les deux caractères #! Exemples : #!/bin/sh #!/usr/local/bin/perl #!/bin/awk Programmation Orient´ ee Syst` eme – Programmation Shell– 6/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Exécution interne Au lieu de l’exécution externe présentée précédemment (nouveau processus), il est également possible d’exécuter le fichier en interne. L ’exécution interne ne crée pas de nouveau processus mais exécute les commande au sein même du processus shell courant. D’utilisation plus rare, elle permet surtout de configurer le shell courant (variables d’environnement, alias, ...) Pour exécuter un script en interne dans un shell, il faut utiliser la commande source (en tcsh) ou . (en sh) : source macommande (tcsh) . macommande (sh) Programmation Orient´ ee Syst` eme – Programmation Shell– 7/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Configuration Il existe justement un certain nombre de fichiers usuels de configuration qui sont automatiquement exécutés de façon interne lors du démarrage d’un shell. Ces fichiers dépendent du shell utilisé (voire du système) mais pour tcsh : $HOME/.login est exécuté dans le shell de login $HOME/.tcshrc est exécuté au début de chaque shell tcsh $HOME/.logout est exécuté avant de quitter le système Programmation Orient´ ee Syst` eme – Programmation Shell– 8/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Bases de l’écriture de script (sh) ◮Commencez par l’indication de l’interpréteur #!/bin/sh ◮Une instruction par ligne, ou plusieurs instructions par ligne séparées par des ; ◮Commentaires : depuis # jusqu’à la fin de la ligne Exemple : ls > ../content # ceci est un commentaire ◮Le script se termine ◮soit à la fin du fichier ◮soit quand l’exécution rencontre l’instruction exit Programmation Orient´ ee Syst` eme – Programmation Shell– 9/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Listes d’instructions Une liste d’instructions est une séquence d’une ou plusieurs commandes séparées par ;, && ou || et terminée par ;, & ou un retour à la ligne. Si une commande se termine par &, la commande est exécutée en tâche de fond dans un processus shell fils. Le shell père n’attend pas la fin de la commande. Les commandes séparées par des ; sont exécutées une après l’autre ; le shell attendant la fin de l’exécution de chacune. && représente le ’ET’ logique entre (statut de) commandes. commande1 && commande2 : commande2 n’est exécutée que si commande1 se termine et son statut est 0 || représente le ’OU’ logique entre (statut de) commandes. commande1 || commande2 : commande2 n’est exécutée que si commande1 se termine et son statut est différent de 0 (i.e. normalement un code d’erreur) Le statut d’un ET ou d’un OU est le statut de la dernière commande exécutée. Programmation Orient´ ee Syst` eme – Programmation Shell– 10/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Variables En shell de base (Bourne shell, sh), les variables ◮ne sont pas typées (sont toutes des chaînes de caractères) ◮se désignent par un nom constitué exclusivement de caractères alphanumériques ou _ et ne commençant pas par un chiffre ◮affectation : nom=valeur Attention ! PAS D’ESPACE autour du signe = ! Exemples : suffixe=.tex noms="Pierre Paul Jacques Jean" ◮Utilisation de la valeur : $nom Note : il faut souvent protéger cette valeur par des guillemets afin d’éviter une mauvaise inter- prétation des blancs qu’elle pour- rait éventuellement contenir. Exemples : echo $PATH ls -l "$fichier" Programmation Orient´ ee Syst` eme – Programmation Shell– 11/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Variables – portées Il existe 2 sortes de variables, en fonction de leur portée : variables locales : portée limitée au processus courant Convention : noms en minuscules variables d’environnement : portée comprenant le processus courant et tous les processus fils (et, par récurrence, autres descendants) Convention : noms tout en MAJUSCULES Exemple : PATH Pour déclarer une variable comme variable d’environnement, utiliser export Exemple : MYOWNPGM_HOME=/usr/share/myownpgm export MYOWNPGM_HOME Notez qu’il y a pas de $ Programmation Orient´ ee Syst` eme – Programmation Shell– 12/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Variables d’environnement usuelles Pour connaître toutes les variables d’environnement : env variable contenu Exemple de valeur PATH lieux de recherche des com- mandes /bin:/usr/bin:.... HOME chemin absolu du répertoire principal de l’utilisateur /home/chaps SHELL l’interpréteur shell exécuté /bin/tcsh USER le nom d’utilisateur (du shell courant) chaps DISPLAY adresse de l’écran :0.0 HOSTNAME nom de la machine insunrays3 HOSTTYPE type de CPU x86_64 OSTYPE quel système d’exploitation linux-gnu Programmation Orient´ ee Syst` eme – Programmation Shell– 13/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Variables particulières Dans les scripts, il existe un certain nombre de variables déjà prédéfinies (en plus des variables d’environnement héritées du processus père) ◮les arguments (récupérés de la ligne de commande) : $0 : le nom du script courant $1 : la valeur du premier argument $2 etc... : autres arguments dans l’ordre (la commande shift permet de les décaler : · · · →$3 →$2 →$1, voir transparent suivant) ◮$# : le nombre d’arguments ◮$? : la valeur de retour de la dernière commande exécutée Exemple : resultat=‘ls $fichier‘ if [ $? -ne 0 ]; then ... ◮$$ : PID du process courant Programmation Orient´ ee Syst` eme – Programmation Shell– 14/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Variables particulières (suite) Gestion des arguments ◮$* : concaténation de tous les arguments ($1, $2, ...), mais mauvaise gestion des blancs ! ne pas utiliser. ◮"$@" : tous les arguments, « protégés » en cas de blancs Il y a donc deux bonnes façons de faire une boucle sur les arguments : ◮soit une boucle tant que $# est positif et utilisant shift : while [ $# -ne 0 ]; do arg=$1 shift ... # utilisation de $arg done ◮soit dans une itération sur "$@" (attention à bien mettre les guillements !) : for arg in "$@"; do ... # utilisation de $arg done Programmation Orient´ ee Syst` eme – Programmation Shell– 15/34 c ⃝EPFL 2003–2007 Jean-C´ edric Chappelier Gestion des arguments : Exemple Le programme suivant (stocké dans le fichier args.sh) : #!/bin/sh echo "\$#=\"$#\"" ; echo "\$0=\"$0\"" echo "\$1=\"$1\"" ; echo "\$2=\"$2\"" echo "\$*=\"$*\"" echo "boucle 1 :" ; for x in $* ; do echo "\"$x\""; done echo "boucle 2 :" ; for x in $@ ; do echo "\"$x\""; done echo "boucle 3 :" ; for x in "$@" ; do echo "\"$x\""; done uploads/Industriel/ 2-programmation-orientee-system-e-shell.pdf
Documents similaires










-
29
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Fev 19, 2021
- Catégorie Industry / Industr...
- Langue French
- Taille du fichier 0.1562MB