Le Shell
Transcription
Le Shell
Travaux Pratiques d'Unix DESS E&A 2003/2004 Le Shell • Après une entrée en session (login) sur un système Unix/Linux vous êtes pris en charge par un interpréteur de commande (shell) (le Bourne-shell (sh), le C-shell (csh), le Korn-shell (ksh), le Bash (bash),…). L'interpréteur de commande est l'interface entre l'utilisateur et le système d'exploitation. Il a pour rôle de traduire les commandes saisies par l'utilisateur afin que le système puisse les exécuter. • Il est possible de créer des fichiers contenant une suite de commandes. Ces fichiers sont appelés des scripts et peuvent être exécutés, ce qui évite la réécriture de ces commandes. De surcroît les interpréteurs de commandes possèdent un véritable langage de programmation interprété permettant de réaliser des programmes de commandes complexes. Par extension, ce langage est aussi appelé Shell. La programmation en Shell 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 d'une valeur à une variable se fait par un nom ; la référence à cette variable par son nom précédé du caractère $, comme dans : mavariable=bonjour echo $mavariable assignation référence Question Donner la réponse du Shell lorsque vous tapez les commandes suivantes dans une console : A=numero; echo $A echo $A1 echo ${A}1 B=`pwd`; echo $B echo le chemin est `pwd` echo le chemin est $B echo le chemin est `hostname`:`pwd` C=le chemin est `pwd`;echo $C C='le chemin est `pwd`';echo $C C="le chemin est `pwd`";echo $C Le jeu d'instructions lui-même comporte : • toutes les commandes Unix, • l'invocation de programmes exécutables (ou de scripts) avec passage de paramètres, • 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. DESS Electronique & Automatique 1/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 Remarque : le Shell est un langage interprété ; en conséquence, il n'y a pas besoin de "recompiler" les scripts. Exemple : le premier script ; création avec un éditeur (vi par exemple) 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 : user> chmod a+x listf ← ajoute le droit d'accès x pour tout le monde il peut donc être exécuté comme une commande dans une console : user> listf Le passage des paramètres Premier script avec passage de paramètres : le script lisf ne s'applique qu'au répertoire courant. On peut le rendre plus général en lui transmettant le nom du 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. Question Modifier le fichier listf de la façon suivante : echo "contenu du repertoire $1" ls -aCF $1 puis l’exécuter : user> listf /tmp 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é, contient le nombre (décimal) de paramètres passés en argument, contient le liste des paramètres passés en argument, contient le code retour de la dernière commande exécutée, contient le numéro (PID) du Shell (décimal). Exemple 1 : Le script echopara contient : echo $1 $2 $3 P1=$1 shift echo $1 $2 $3 echo $P1 echo $0 a ete appele avec $# parametres echo qui sont : $* Question Ecrire le fichier echopara en lui passant 4 paramètres, puis l'exécuter. En déduire la fonction de la commande shift. Exemple 2 : Le script echopara2 contient : echo $1 $2 $3 $4 DESS Electronique & Automatique 2/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 set un deux trois quatre echo $1 $2 $3 $4 set `ls -a` echo $1 $2 $3 $4 Question Ecrire le fichier echopara2 en lui passant 4 paramètres, puis l'exécuter. En déduire la fonction de la commande set. Question Ecrire un script Shell affichedate pour afficher la date dans un ordre différent de l'ordre standard. Par exemple, si la commande date affiche : Fri May 1 15:46:57 GMT 2003 votre commande devra afficher : Fri 1 May 2003 15:46:57 Les structures de contrôle Le Shell possède des structures de contrôle telles qu'il en existe dans les langages de programmation d'usage général : • instructions conditionnelles (if..then else, test, case), • itérations bornées, • itérations non bornées. 1. LES INSTRUCTIONS CONDITIONNELLES L'instruction if. Elle présente trois variantes qui correspondent aux structures sélectives à une, deux ou n alternatives. a) if commande then commandes fi Les commandes sont exécutées si la commande condition commande renvoie un code retour nul ($? = 0). b) if commande then commandes1 else commandes2 fi c) if commande1 then commandes1 elif commande2 then commandes2 elif commande3 then commandes3 ... else commandes0 fi DESS Electronique & Automatique 3/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 La commande test. Elle constitue l'indispensable complément de l'instruction if. Elle permet très simplement : • de reconnaître les caractéristiques des fichiers et des répertoires, • de comparer des chaînes de caractères, • de comparer algébriquement des nombres. Cette commande existe sous deux syntaxes différentes : test expression ou [ expression ] La commande tes répond à l'interrogation formulée dans expression, par un code retour nul en cas de réponse positive et différent de zéro sinon. La deuxième forme est plus fréquemment rencontrée et donne lieu à des programmes du type : if [ expression ] then commandes fi Les expressions les plus utilisées sont : -d -f -s -r -w -x -z -n c1 c1 n1 nom nom nom nom nom nom chaîne chaîne = c2 != c2 - eq n2 vrai si le répertoire nom existe, vrai si le fichier nom existe, vrai si le fichier nom existe et est non vide, vrai si le fichier nom existe et est accessible en lecture, vrai si le fichier nom existe et est accessible en écriture, vrai si le fichier nom existe et est exécutable, vrai si la chaîne de caractères chaîne est vide, vrai si la chaîne de caractères chaîne est non vide, vrai si les chaînes de caractères c1 et c2 sont identiques, vrai si les chaînes de caractères c1 et c2 sont différentes, vrai si les entiers n1 et n2 sont égaux. Question Ecrire un script Shell pour afficher le type (fichier ou répertoire) d'un fichier passé en paramètre. 2. L'INSTRUCTION CASE L'instruction case est une instruction très puissante et très commode pour effectuer un choix multiple dans un fichier de commande. case chaîne in motif1) commandes 1;; motif2) commandes 2;; .... .... motifn) commandes n;; esac Exemple : le script comptepara contient : DESS Electronique & Automatique 4/8 Travaux Pratiques d'Unix case $# 0) echo 1) echo 2) echo *) echo esac in $0 $0 $0 $0 DESS E&A 2003/2004 sans arguments;; possede un argument;; possede deux arguments;; a plus de deux arguments;; Question Modifier le script Shell affichedate pour afficher le jour de la semaine en français (Mon devient Lun, ou vis et versa). 3. LES ITERATIONS Itération bornée : la boucle for. Trois formes de syntaxe sont possibles : 1) for variable in chaine1 chaine2 ... chainen do commandes done 2) for variable do commandes done 3) for variable in * do commandes done Pour chacune des trois formes, les commandes placées entre do et done sont exécutées pour chaque valeur prise par la variable du Shell variable. Ce qui change c'est l'endroit où variable prend ses valeurs. Pour la forme 1), les valeurs de variable sont les chaine1 à chainen. Pour la forme 2) variable prend ses valeurs dans la liste des paramètres du script. Pour la forme 3), la liste des fichiers du répertoire constitue les valeurs prises par variable. Exemples : • le script echofor1 contient : for i in un deux trois do echo $i done • le script echofor2 contient : for i do echo $i done • le script echofor3 contient : for i in * do echo $i done DESS Electronique & Automatique 5/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 Question Ecrire les fichiers echofor1, echofor2 et echofor3. Quels sont les résultats obtenus ? Question Ecrire un script Shell pour afficher les types (fichier ou répertoire) de tous les fichiers du répertoire courant. Question subsidiaire Adapter le script précédent pour explorer toute une arborescence à partir d'un répertoire passé en paramètre. Ceci nécessite d'utiliser le script récursivement (en faisant appel à lui même via $0). Itération non bornée : while et until. 1) while commandealpha do commandesbeta done 2) until commandealpha do commandesbeta done Les commandes commandesbeta sont exécutées tant que (while) ou jusqu'à ce que (until) la commande commandealpha retourne un code nul (la condition est vraie). Exemple : le script until_while contient : while [ $1 != debut ] ; do shift done shift until [ $ 1= fin ]; do echo $1 shift done Question Ecrire le script until_while et l’exécuter en l'appelant de la manière suivante : user> until_while 1 2 3 debut 4 5 6 fin 7 8 9 Arithmétique entière sur des variables Toutes les variables Shell sont de type chaîne de caractères, mais si le contenu de cette chaîne représente un nombre entier, les opérateurs -eq (=) -ne (!=) -lt (<) -le (≤) -gt (>) ge (≥) peuvent s'appliquer. La commande expr permet en outre d'évaluer une expression arithmétique sur des variables. Le résultat de cette évaluation est une chaîne de caractères dirigée sur la sortie standard. Le backquoting `expr...` permet d'en récupérer le résultat. DESS Electronique & Automatique 6/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 Les opérations permises sont les quatre opérations arithmétiques + - * / et % représentant le reste de la division entière. Attention : le caractère * génère des noms de fichiers et doit donc être précédé de \ qui le neutralise. Exemple : le script arithm contient : #!/bin/sh # le caractère diese represente la mise en commentaire # du reste de la ligne # Ce script illustre l'arithmétique entiere sur des variables # Calcul de (a*a)+(b*b) echo -n a= # ecriture du message a= # sans retour chariot (option -n) read a # lecture de la valeur de la variable a echo -n b= read b d=`expr $a \* $a` # le caractere * doit etre precede de \ e=`expr $b \* $b` # sinon il genere la liste # de tous les fichiers c=`expr $d + $e` echo a\*\*2 + b\*\*2 = $c if [ $c -ge 100 ]; then echo "Ca fait beaucoup..." fi # Fin du script arithm Question Ecrire le script arithm et l’exécuter. Exercices Exercice 1 : on désire gérer un petit carnet téléphonique. Après étude, on conclut que le plus simple est de mémoriser le carnet dans un fichier (nommé carnet par exemple), avec chaque ligne contenant le nom (sans espace, pour simplifier), un espace et le numéro de téléphone (lui aussi sans espace). Par exemple le fichier carnet peut contenir : tata 0918533666 titi 0166745518 toto 0683505075 1. Ecrivez un script ajouter qui prend en argument un nom, un numéro de téléphone et qui l'ajoute au carnet si le nom n'existe pas déjà. 2. Ecrivez un script chercher qui prends en argument un nom pour afficher la ligne correspondante dans le carnet 3. Ecrivez un script effacer qui prend en argument un nom, et qui l'efface du carnet. 4. Ecrivez un script modifier qui prend en argument un nom, un nouveau numéro de téléphone, et qui remplace l'ancien numéro de téléphone par le nouveau dans le carnet. NB Utiliser la commande grep Exercice 2 : Ecrivez un programme Shell permettant de renommer une liste de paramètres de la commande (à partir du deuxième). Les nouvelles références seront obtenues à partir d’un préfixe DESS Electronique & Automatique 7/8 Travaux Pratiques d'Unix DESS E&A 2003/2004 commun donné en premier paramètre, et d’un suffixe qui est un entier (numéro d’ordre du paramètre correspondant à ce fichier +1). Exemple : la commande renomme fic toto tata titi aura pour effet d’avoir les nouveaux noms fic1, fic2 et fic3. Notes : • votre commande ne doit renommer que les fichiers ordinaires, • s’il n’y a qu’un paramètre, tous les fichiers de répertoire seront traités, • on suppose qu’aucun nouveau nom ne correspond à une référence déjà existante. Vous penserez à faire les tests d’erreur nécessaires. Lors d’une erreur d’usage, vous afficherez un message rappelant l’usage correct du script à l’utilisateur. Dans ces cas, vous pouvez utiliser la commande exit pour sortir du script, en envoyant une sortie (décimale) non-nulle (cf. exemple ci-dessous). Exemple : le script cdrep contient : # script qui utilise la commande cd avec le premier paramètre # seulement si le premier paramètre est un repertoire # sinon il affiche un message d’erreur. if [ $# != 1 ] then echo $0 ne fonctionne qu avec un seul parametre. exit 1 elif [ ! –d $1 ] # le caractere ! indique la negation de # l’expression qui le suit then echo $1 n est pas un repertoire exit 2 fi cd $1 Exercice 3 : Encore ? Demandez à l'enseignant, il en a toujours quelques uns en réserve. DESS Electronique & Automatique 8/8
Documents pareils
Partie 1 ) Arguments d`un shell script 1.1) les variables d`un
N.B. : si variable n'est pas définie, son contenu, lors de son appel, sera mis à 0, sauf si le shell est lancé
avec l'option u (dans ce cas toute utilisation de variable non définie mettra fin au s...