Polycopié sur le shell
Transcription
Polycopié sur le shell
Shell Auteur : Dominique Bouillet Frédérique Silber-Chaussumier, mastère IPISO Novembre, 2009 Shell Plan 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Interpréteur de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3 Langage de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 2/68 Shell 1 Introduction ¥ Tout utilisateur doit être "déclaré" cad enregistré avec un compte → nom (connexion) & mot de passe ¥ Connexion ==> interpréteur de commandes (interface de dialogue Homme/Machine) ¥ Interpréteur UNIX est appelé shell ¥ C’est un outil −→ il existe plusieurs shells : ¨ shell de Bourne (sh) AT&T ¨ Korn Shell (ksh) (D. Korn) : interactivité (contrôle des jobs, alias), programmation (variables, arithmétique) ¨ C_Shell (csh) (Berkeley) : interactivité (history) ¨ le Tenex Shell (tcsh) ¨ Bash (Bourne-Again shell) (ksh et csh) ¥ Le shell a un double rôle : ¨ interpréteur de commandes ¨ langage de programmation Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 3/68 Shell 2 Interpréteur de commandes 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Tubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Métacaractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 4/68 Shell 2 Interpréteur de commandes 2.1 Algorithme ¥ Principe : Boucle_infinie affichage du prompt ($) d’attente clavier lecture d’une commande (RETURN) analyse syntaxique (découpe en mots) substitution (caractères spéciaux) exécution de la commande Fin_de_Boucle ¥ Exemple : ¨ le shell affiche $ et lit le clavier ¨ l’utilisateur tape ls -l /usr ¨ le shell reconnaît 3 mots : ls (nom de commande), -l et /usr (arguments) ¨ il crée un processus qui exécute la commande ls avec ses arguments ¨ il attend la fin avant de ré-afficher $ ¥ Sortie de la boucle (déconnexion) par exit, ou CTRL D (à éviter) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 5/68 Shell 2 Interpréteur de commandes 2.2 Redirections 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Redirection de la sortie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Redirection double. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Redirection de l’entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Autres redirections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 Here document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Traitement des redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 6/68 2 Interpréteur de commandes 2.2 Redirections 2.2.1 Redirections ¥ À la connexion, le shell dispose de : 3 flots de communication ¨ l’entrée standard : stdin (0) ¨ la sortie standard : stdout (1) ¨ la sortie des erreurs : stderr (2) ¥ Ces 3 flots sont associés par défaut avec : ¨ l’écran pour stdout et pour stderr ¨ le clavier pour stdin ¥ Redirection = modification de l’une ou de l’autre de ces associations ¥ Une redirection n’est valable que le temps de la commande sur laquelle elle porte Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 7/68 2 Interpréteur de commandes 2.2 Redirections 2.2.2 Redirection de la sortie ¥ Permet de récupérer le résultat d’une commande dans un fichier commande > nom_de_fichier $ who domy paul clode # sortie sur l’écran console Aug 2 09:45 ttyp2 Aug 2 12:17 (celia) ttyp3 Aug 3 1152 (:0.0) $ who > qui $ ls qui # rien à l’écran # le fichier ‘‘qui’’ a été créé $ cat qui domy console Aug 2 09:45 paul ttyp2 Aug 2 12:17 (celia) clode ttyp3 Aug 3 1152 (:0.0) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 8/68 2 Interpréteur de commandes 2.2 Redirections ¥ Fichier de redirection créé avant exécution de la commande (donc même si celle-ci échoue) ¥ Si le fichier de redirection existe, son contenu initial est perdu $ date > qui $ cat qui Fri Sep 13 17:11:22 MET DST 1996 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 9/68 2 Interpréteur de commandes 2.2 Redirections 2.2.3 Redirection double ¥ On peut éviter de détruire le contenu initial du fichier de redirection en utilisant une "double redirection" ¥ L’écriture se fait en mode ajout en fin de fichier commande >> nom_de_fichier $ pwd >> qui $ cat qui Fri Sep 13 17:11:22 MET DST 1996 /mci/inf/domy/public ¥ Si le fichier n’existe pas, il est créé, comme pour une redirection simple Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 10/68 2 Interpréteur de commandes 2.2 Redirections 2.2.4 Redirection de l’entrée ¥ commande < nom_de_fichier ¥ Exemple : write $ write paul un petit bonjour ^D # message reçu par paul Message from domy@bromo un petit bonjour EOF $ cat message Un autre Bonjour $ write paul <message # message reçu par paul Message from domy@bromo Un autre Bonjour EOF # texte lu au clavier # touche CTRL D : on ttyp0 at 10:14 ... # redirection : on ttyp0 at 10:16 ... ¥ Remarque : en entrée, le fichier de redirection doit exister, alors qu’en sortie, il est créé automatiquement Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 11/68 2 Interpréteur de commandes 2.2 Redirections 2.2.5 Autres redirections ¥ Redirection des erreurs : commande 2> fichier ¨ Exemple : compilation $ cc prog.c "prog.c", line 4: j undefined "prog.c", line 7: syntax error at or near symbol } $ cc prog.c 2>prog.err $ cat prog.err "prog.c", line 4: j undefined "prog.c", line 7: syntax error at or near symbol } ¥ Combinaison des redirections ¨ Redirection de l’erreur vers la sortie standard : commande > fichier 2>&1 I Notation &> équivalente à 2>&1 ¨ Traitement des redirections de gauche à droite I L’ordre des redirections est important I « commande > fichier 2>&1 » n’est pas équivalent à « commande 2>&1 > fichier » Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 12/68 2 Interpréteur de commandes 2.2 Redirections 2.2.6 Here document ¥ Autre redirection de l’entrée : Here document (texte joint) ¥ Utiliser << et un séparateur quelconque : commande << séparateur texte passé à la commande séparateur ¥ Principale utilisation : exécution d’une commande interactive dans un shell-script ¥ Exemple : avec un éditeur ed fichier << MARK 1,5s/ab/AB/ w q MARK # # # # # appel ed commandes d’édition pour ed fin redirection ¥ Séparateur = 1 caractère ou une chaîne ¥ Il doit être seul sur une ligne après le texte ¥ Le shell interprète le texte redirigé (variables...) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 13/68 2 Interpréteur de commandes Exemple: 1,\$s/ab/AB/ 2.2 Redirections $s = contenu variable s ¥ Pour l’éviter, soit écrire le séparteur ’MARK’ au début (entre simple quotes), soit annuler la signification du $ avec \$ Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 14/68 2 Interpréteur de commandes 2.2 Redirections 2.2.7 Traitement des redirections ¥ Le shell lit les commandes, les analyse, effectue les substitutions et exécute les actions ¥ Mais il traite les redirections en tout premier ¨ Exécution de « commande > fich » : le fichier fich est créé (ou vidé s’il existait) même si la commande n’existe pas ou échoue ¨ « commande > fich » est équivalent à « > fich commande » ¥ De plus, le shell n’interprète pas les noms de fichiers lorsqu’il traite les redirections ¥ Exemple : soit un répertoire rep contenant les fichiers fic1, fe2, fr3 et fe4 write fred < fr* --> erreur: fr* n’existe pas cat fe2 fe4 > fe* --> création fichier fe* cat f* > f* --> création f* (f*= fic1+fe2+fr3+fe4+fe*) ¥ Redirection possible avec &n (n : descripteur) ¨ Exemple : cmde > f1 2>&1 (stdout et stderr dans f1) ¨ Possibilité de fermeture avec <&- (stdin), >&- (stdout), 2>&- (stderr)... Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 15/68 Shell 2 Interpréteur de commandes 2.3 Tubes ¥ Tube (pipe) = zone mémoire permettant à deux processus de communiquer tout en étant synchronisés : ¨ écrivain attend une place disponible ¨ lecteur attend une information prête ¥ En shell, cela permet de faire agir une commande sur le résultat d’une autre sans passer par des fichiers intermédiaires ¥ Symbole | placé entre deux commandes redirige la sortie de la 1ère sur l’entrée de la deuxième $ who | wc -l 3 # Nombre d’utilisateurs ¥ Le tube évite des E/S disques plus coûteuses : $ who > qui # Création d’un fichier temporaire $ wc -l qui # Traitement de ce fichier 3 $ rm qui # Suppression du fichier Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 16/68 Shell 2 Interpréteur de commandes 2.4 Métacaractères 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 Suppression de l’interprétation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Résultat d’un commande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Guillemets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Interprétation des noms de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Métacaractère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Enchaînement de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 17/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.1 Suppression de l’interprétation ¥ Un texte donné entre simples quotes ( ’ ) n’est pas interprété par le shell mais considéré comme un simple mot : ¥ cela permet d’utiliser les caractères spéciaux dans les arguments $ echo ’Deux>Trois’ # Affichage de: Deux>Trois $ echo Deux>Trois # Aucun affichage MAIS création # du fichier Trois contenant Deux ¥ Autre possibilité : le caractère \(anti-slash) supprime l’interprétation du caractère spécial qui le suit echo aujourd\’hui aujourd’hui ¥ Action ne porte que sur un seul caractère ⇒ il faut la répéter si nécessaire echo Deux\>\>Trois # pour afficher Deux>>Trois Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 18/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.2 Résultat d’un commande ¥ Un texte donné entre anti quotes ( ‘ ) est considéré comme une commande à exécuter et remplacé par son résultat. ¥ Cela permet d’utiliser le résultat d’une commande comme argument d’une autre. ¥ Exemple $ echo Je suis sous ‘pwd‘ 1) exécution de la commande: pwd 2) exécution de la commande: echo Je suis sous résultat de pwd d’où l’affichage: Je suis sous /usr ¥ Exemple : $ echo il y a ‘who | wc -l‘ utilisateurs connectes ⇒ Affichage de : il y a 3 utilisateurs connectes ¥ Notation bash : entre « $( » et « ) » $ echo Je suis sous $(pwd) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 19/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.3 Guillemets ¥ Si on veut mélanger des caractères spéciaux, des variables, des commandes..., il faut utiliser les guillemets : ¥ Dans un texte donné entre guillemets ("), seuls sont interprétés les métacaractères $ (variables), \(annulation) et ‘ (commandes) $ echo "Mon repertoire courant est ‘pwd‘ > alors que mon repertoire de connexion > est $HOME" Mon repertoire courant est /usr alors que mon repertoire de connexion est /mci/inf/domy ¥ Notes : ¨ $ est la valeur de PS1 et > est celle de PS2 ¨ avec de simples quotes (’...’), ‘pwd‘ et $HOME ne seraient pas interprétés ¨ sans rien, seule la première ligne serait prise en compte (le premier code Return validerait la commande echo et ne serait donc pas intégré au texte du message). Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 20/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.4 Interprétation des noms de fichiers ¥ Plusieurs métacaractères jouent le rôle de "jokers" pour référencer des noms de fichiers ¨ * −→ une chaîne quelconque (même vide) ¨ ? −→ un caractère quelconque ¨ [...] −→ un caractère quelconque de l’ensemble ¨ [ !...] −→ un caractère quelconque hors de l’ensemble ¥ L’ensemble = liste de caractères [adefgw] ou intervalle [a-g] ou toute combinaison des deux [ab0-9A ;x-z] ¥ Exemples : ¨ *.c : suffixe .c ¨ *.[csp] : suffixe .c, .s ou .p ¨ [a-z][0-9] : nom composé de 2 caractères, une minuscule et un chiffre ¨ [ !a-z]* : noms ne commençant pas par une minuscule ¥ Notations POSIX de classes de caractères : alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit ¨ [[:lower:]][[:digit:]] : nom composé de 2 caractères, une minuscule et un chiffre Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 21/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.5 Métacaractère ~ ¥ Le ksh interprète le caractère ~ pour référencer un répertoire de différentes manières : ¨ ~ ou ~/ répertoire de connexion ($HOME) ¨ ~nom répertoire de connexion de l’utilisateur nom ¨ ~+ répertoire courant ($PWD) ¨ ~- répertoire précédent ($OLDPWD) ¥ Un alias : bak=’cd ~-’ permet après un déplacement dans l’arborescence de revenir au point de départ Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 22/68 2 Interpréteur de commandes 2.4 Métacaractères 2.4.6 Enchaînement de commandes ¥ Exécution séquentielle de plusieurs commandes tapées sur une même ligne en les séparant par le caractère “;” ¥ Exemple : ls ;who ;pwd ¥ Exécution de 2 commandes en fonction du succès ou de l’échec de la première ¨ && exécution de la deuxième commande si la première a réussi ¨ || exécution de la deuxième commande si la première a échoué ¥ Exemple : mv f1 f2 && pwd ¨ si f1 existe, f1 renommé par mv et pwd exécuté ¨ sinon mv échoue ¥ Exemple : mv f1 f2 || pwd ¨ si f1 existe, f1 renommé par mv ¨ sinon mv échoue et alors pwd est exécuté Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 23/68 Shell 2 Interpréteur de commandes 2.5 Processus 2.5.1 Exécution différée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.5.2 Exécution suspendue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.5.3 Autres commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 24/68 2 Interpréteur de commandes 2.5 Processus 2.5.1 Exécution différée ¥ Par défaut, sous le shell, exécution en séquence (foreground) ¨ Ex : l’utilisateur tape date ¨ Le shell crée un fils (par fork) ¨ attend qu’il se termine (par wait) ¨ Le fils créé exécute /bin/date (par exec) ¥ Exécution différée : (background) ¨ Ex : l’utilisateur tape date& ¨ Le shell crée un fils (par fork) ¨ n’attend pas qu’il se termine ¨ Le fils créé exécute /bin/date (par exec) ⇒ exécution en parallèle (père et fils) ⇒ risque de mélanges à l’écran Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 25/68 2 Interpréteur de commandes 2.5 Processus 2.5.2 Exécution suspendue ¥ Processus : plusieurs états (actif, attente...) ¥ Etat suspendu = processus interrompu avec possibilité de relance : ¨ en direct : fg (foreground) ¨ en différé : bg (background) ¥ Exemples ¨ a) édition en cours CTRL Z ==> édition suspendue autres commandes fg ==> reprise de l’édition ¨ b) commande longue −→ attente CTRL Z ==> commande suspendue bg ==> reprise de commande en différée suite en parallèle ¥ Intérêt : poursuite de l’exécution sans perte du travail déjà effectué (évite de détruire le processus en cours pour le relancer) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 26/68 2 Interpréteur de commandes 2.5 Processus 2.5.3 Autres commandes ¥ jobs = liste des "jobs" c’est-à-dire ¨ processus en exécution différée ¨ processus suspendus ¨ processus bloqués (attente E/S) ¥ Jobs repérés par un numéro (%n), utilisable avec diverses commandes, en particulier bg et fg. ¥ kill = envoi d’un signal à un processus (kill -l : liste des signaux) ¨ Par défaut, signal 15 (SIGTERM) : terminaison du processus ¨ Principal cas d’utilisation : destruction d’un processus avec le signal 9 (SIGKILL) kill -9 numPID ou kill -9 %numJob Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 27/68 Shell 2 Interpréteur de commandes 2.6 Historique 2.6.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.6.2 Fonction fc (ksh) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 28/68 2 Interpréteur de commandes 2.6 Historique 2.6.1 Historique ¥ Le Korn shell enregistre toutes les commandes tapées et permet de les rappeler, soit pour les ré-exécuter, soit pour les modifier ¥ Variable EDITOR pour préciser l’éditeur choisi (mieux emacs) ¨ EDITOR=emacs ¨ CTRL P commande précédente ¨ CTRL N commande suivante (si on est allé trop loin ) ¨ CTRL A début de ligne ¨ CTRL E fin de ligne ¨ CTRL F caractère suivant ¨ CTRL B caractère précédent ¨ CTRL D suppression caractère sous le curseur ¨ BackSpace effacement du caractère précédent ¥ On peut aussi préciser l’éditeur par une option du shell : set -o emacs ¥ Les flèches sont utilisables avec la dernière version Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 29/68 2 Interpréteur de commandes 2.6 Historique 2.6.2 Fonction fc (ksh) ¥ Toute commande de l’historique est accessible par les codes de contrôle (CTRL P, CTRL N...) ¥ On peut aussi accéder à un ensemble avec fc ¥ Liste de commande : fc -l [deb] [fin] ¨ Les valeurs deb et fin sont des numéros de commande ou le début de commandes ¥ Modification : fc -e editeur [deb] [fin] ¨ Entrée sous l’éditeur editeur (ou celui précisé par $FCEDIT si editeur = -) sur la partie concernée de l’historique ¨ À la sortie de l’éditeur, toutes les commandes du texte sont exécutées en séquence ¥ Substitution rapide : fc -e - chaine1=chaine2 cmde find /users/promo90 -name a.out -print fc -e - promo90=promo91 fi --> find /users/promo91 -name a.out -print ¨ Un alias prédéfini r permet une écriture plus rapide : r chaine1=chaine2 cmde ¨ Syntaxe Bash : fc -s chaine1=chaine2 cmde Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 30/68 Shell 2 Interpréteur de commandes 2.7 Alias ¥ alias = redéfinir ses propres mnémoniques pour les commandes $ alias dir=’ls -l’ # définition $ dir # utilisation total 4 -rw-r--r-- 1 domy 42 Nov 10 09:44 liste -rw-r--r-- 1 domy 23 Nov 10 09:43 ou -rw-r--r-- 1 domy 29 Nov 10 09:40 quand -rw-r--r-- 1 domy 171 Nov 10 09:40 qui $ dir >listebis # autre utilisation $ alias # liste des alias dir=’ls -l’ $ unalias dir # suppression d’alias $ dir # commande inexistante dir: not found Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 31/68 Shell 3 Langage de programmation 3.1 3.2 3.3 3.4 Langage de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 32/68 Shell 3 Langage de programmation 3.1 Langage de programmation ¥ Variables, paramètres, fonctions, structures de contrôle... ¥ Utilisation interactive ou le plus souvent dans un shell-script (fichier interprété par le shell) ¥ Exécution d’un shell-script dans un nouveau shell ksh fichier ou fichier (s’il a l’attribut x) ¥ Exécution d’un shell-script dans le shell courant . fichier ¥ Shell-scripts particuliers pour ksh ¨ .profile (exécuté à la connexion), .kshrc (exécuté à chaque sous-shell) ¥ Shell-scripts particuliers pour Bash ¨ /etc/profile, /etc/bashrc ¨ .bash_profile (shell de login .profile), .bashrc (shell interactif mais non-login), $ENV (shell non-interactif non-login) ¥ # !/bin/bash Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 33/68 Shell 3 Langage de programmation 3.2 Variables 3.2.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.2 Portée des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2.3 Variables prédéfinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2.4 Affectation groupée de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.5 Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.6 Opérations sur les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.2.7 Substitutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.8 Opérations arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.2.9 Ajouts ksh sur les variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43 3.2.10 Paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44 3.2.11 Affectation de paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 34/68 3 Langage de programmation 3.2 Variables 3.2.1 Variables ¥ ¥ ¥ ¥ ¥ Variables non typées Nom d’une variable : lettres, chiffres et le caractère souligné ( _ ) Premier caractère : lettre ou souligné Affectation : nom=contenu (sans espace) Utilisation : $nom $ mois=Janvier $ echo $mois Janvier $ pwd /dio/sys/domy/exo_enpc $ rep=/usr $ cd $rep $ pwd /usr ¥ Affichage : set ¥ Suppression : unset var1 ... Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 35/68 3 Langage de programmation 3.2 Variables 3.2.2 Portée des variables ¥ Les variables sont locales au processus dans lequel elles ont été créées ¥ Pour les rendre "globales" c-à-d les mettre dans l’environnement, il faut les exporter : export [var1 ...] ¥ Ainsi, quand le shell créé un processus, celui-ci hérite de cet environnement. ¥ Exemple : soit un fichier f1 exécutable contenant la commande ci-dessous : echo "Dans f1 : a = $a" ¥ Exécution : a=oui affectation de a dans le père f1 exécution de f1 --> Affichage: Dans f1 : a = export a a est exportée f1 ré-exécution de f1 --> Affichage: Dans f1 : a = oui Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 36/68 3 Langage de programmation 3.2 Variables 3.2.3 Variables prédéfinies ¥ HOME : répertoire de connexion cd = cd $HOME ¥ MAIL : nom de la boîte aux lettres ¥ PATH : répertoires de recherche des commandes ¨ L’ordre des répertoires est significatif, ce qui permet de choisir par défaut une version donnée d’une commande. ¥ PS1 : invite (prompt) de commande (par défaut $) ¥ PS2 : invite de continuation (>). ¥ IFS : séparateurs (espace, Tab et NL) ¥ TERM : type de terminal utilisé ¥ LOGNAME : nom de connexion ¥ SHELL : nom du shell utilisé ¥ PWD : répertoire courant ¥ ... Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 37/68 3 Langage de programmation 3.2 Variables 3.2.4 Affectation groupée de variables ¥ L’affectation de variables étant une instruction, on peut donc en grouper plusieurs avec ; a=oui ; b=non ; c=0 affectation de a, b puis c ¥ On peut aussi les grouper avec espace mais l’ordre d’affectation diffère a=oui b=non c=0 affectation de c, b puis a ¥ Exemple a=/bin ; b=‘ls $a‘ −→ affectation de a avec /bin puis affectation de b avec le résultat de ls /bin a=/bin b=‘ls $a‘ −→ affectation de b avec le résultat de ls (sur le répertoire courant) puis affectation de a avec /bin Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 38/68 3 Langage de programmation 3.2 Variables 3.2.5 Protection ¥ Protection d’une variable avec readonly ⇒ toute modification interdite ⇒ toute suppression (unset) impossible ¨ Syntaxe : readonly [var1 ...] ¨ Sans argument, readonly affiche la liste des variables protégées ¥ Exemple $jour=Lundi # affectation jour $readonly jour # protection $jour=Mardi # impossible $unset jour # impossible $readonly # affichage "readonly jour" ¥ Syntaxe Bash ¨ Déclarer et fournir des attributs aux variables : declare ¨ readonly est équivalent à declare -r Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 39/68 3 Langage de programmation 3.2 Variables 3.2.6 Opérations sur les variables ¥ Substitution a=oui b=$a --> b vaut oui ¥ Concaténation : juxtaposition simple s’il n’y a pas d’ambiguité ou en entourant le nom de la variable par des accolades (${var} ) ¥ Exemples : a=Bon b=jour --> affectation de a et de b echo $a$b --> Bonjour echo $b1 --> rien: b1 non définie echo ${b}1 --> jour1 ¥ Substitution conditionnelle ${var:-mot} --> $var si var existe, mot sinon Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 40/68 3 Langage de programmation 3.2 Variables 3.2.7 Substitutions ¥ ${var:-mot} = $var si var existe, mot sinon ¥ Exemple : soit un script exo contenant dir=${1:-/usr} ¨ Si exécution de exo /etc alors dir=/etc ¨ Si exécution de exo alors dir=/usr ¥ Remarque : mot peut prendre diverses formes ¨ a=${1:-.} −→ mot = répertoire courant ¨ a=${1:-‘pwd‘} −→ mot = résultat de pwd ¨ a=${1:-$x} −→ mot = contenu variable x ¥ Autres possibilités ¨ ${var:=mot} Résultat : $var si var existe, mot sinon, et de plus var=mot ¨ ${var:+mot} Résultat : mot si var existe, rien sinon ¨ ${var:?mot} Résultat : $var si var existe, fin processus sinon Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 41/68 3 Langage de programmation 3.2 Variables 3.2.8 Opérations arithmétiques ¥ En shell de Bourne, pour toute opération arithmétique ou logique sur une variable : commande expr d’UNIX (création d’un nouveau processus : long) a=1 a=‘expr $a + 1‘ --> a=2 ¥ Korn shell : nouvelle fonction let : let var="val1 op val2" ¨ vali : constante ou variable ¨ op = opération arithmétique (+, -, *, /, %) ou logique ( ! (non)) ou comparaison (<, <=, >, >=, ==, !=) a=1 let a="$a+1" --> a=2 let a="$a >5" --> a=0 (faux) ¥ Bash : $((val1 op val2)) a=2 a=$(($a+1)) --> a=3 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 42/68 3 Langage de programmation 3.2 Variables 3.2.9 Ajouts ksh sur les variables ¥ Variables de type "tableau" : tab[i] ¨ tab[i]=val : affectation du ième élément ¨ ${tab[i]} : ième élément de tab (0≤i≤511) ¨ ${#tab[*]} : nombre d’éléments de tab ¨ ${tab[*]} : ensemble des valeurs de tab ¥ Manipulation de chaînes ¨ ${#var} : nombre de caractères de var ¨ ${var#exp} : retrait d’exp au début de var ¨ ${var%exp} : retrait d’exp à la fin de var exp peut contenir des caractères d’extension shell ¨ Si on double # ou %, suppression maximale Exemple: a=abcxyczt ${#a} --> 8 (caractères) ${a#*c} --> xyczt (retrait abc) ${a%c*} --> abcxy (retrait czt) ${a##*c} --> zt (retrait maximal abcxyc) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 43/68 3 Langage de programmation 3.2 Variables 3.2.10 Paramètres ¥ Initialisés lors de l’exécution d’un shell-script ¨ $# nombre d’arguments ¨ $0 nom du shell-script ¨ $i ième argument avec i = 1, 2 ... 9 ¨ $* ensemble des arguments ¥ Exemple : soit le fichier demo echo "Nb Parametres = $#" echo "Parametre 1 = $1" echo "Liste = $*" ¥ Exécution : demo un 2 trois Nb Parametres = 3 Parametre 1 = un Liste = un 2 trois ¥ Décalage ($2→$1, $3→$2...) : shift ¥ Décalage de n ($n+1→$1 ...) : shift n ¥ Le paramètre $ ? contient le code de retour de la dernière commande Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 44/68 3 Langage de programmation 3.2 Variables 3.2.11 Affectation de paramètres ¥ Les paramètres $1, ...$# sont normalement affectés lors de l’appel d’un shell-script ¥ Ils peuvent l’être aussi par la fonction set : set arg1 [arg2 ...] ¥ Exemples : set a b c --> $1=a, $2=b, $3=c, $#=3, $*=a b c set ‘ls‘ --> $#=nombre de fichiers, $i=nom du ième fichier ¥ D’autres paramètres sont affectés dynamiquement par le shell : ¨ $$ numéro (PID) du processus ¨ $ ! numéro (PID) du dernier processus différé ¨ $ ? code de retour de la dernière commande ¨ $- options du shell Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 45/68 Shell 3 Langage de programmation 3.3 Fonctions 3.3.1 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.3.2 Fonctions d’entrées/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.3.3 Fonction test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.3.4 Fonction test (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.3.5 Fonction eval. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51 3.3.6 Autres fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3.7 Fonctions liées aux processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.3.8 Fonction "point" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3.9 Fonction set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55 3.3.10 Principales options du shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 46/68 3 Langage de programmation 3.3 Fonctions 3.3.1 Fonctions ¥ Une fonction est une action interprétée et exécutée dans le même processus shell et non pas dans le cadre d’un processus fils comme pour une commande UNIX ou un shell-script. ¥ Définition nom() cwd() { { commandes cd $1 PS1="<‘pwd‘> " } } ¥ ¥ ¥ ¥ Exécution : nom [par1 par2 ...] Les paramètres sont utilisables comme pour un shell-script avec $1 ... $9, $# et $* Appel : cwd /usr −→ prompt = </usr> La fonction return marque la fin d’une fonction Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 47/68 3 Langage de programmation 3.3 Fonctions 3.3.2 Fonctions d’entrées/sorties ¥ Affichage : echo [-n] [arg1 ...] ¨ Option -n : pas de retour à la ligne après ¨ Codes \x pour Tab (\t), NL (\n), alert (\a), NoCR (\c)... ¨ Variante ksh : print avec de nouvelles options (accès à un tube ...) ¥ Lecture d’une ligne sur stdin (clavier) : read var1 [var2...] ¨ Séparateur : IFS Exemple: read a b c il fait beau ce matin # frappe clavier Résultat: a="il" b="fait" c="beau ce matin" ¨ Variante ksh pour afficher une invite : (premier argument de la forme var ?prompt : read a ?"Quel temps ? " b c ¨ Variante bash pour afficher une invite : option -p Exemple: read -p "Quel temps? " a b c Quel temps? # lecture clavier ¨ Si aucune variable n’est fournie, la ligne est affectée à la variable REPLY. Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 48/68 3 Langage de programmation 3.3 Fonctions 3.3.3 Fonction test ¥ Syntaxe : test expression ou [ expression ] ¥ La fonction test évalue l’expression puis ¨ si elle est vraie, retourne VRAI (0) ¨ si elle est fausse, retourne FAUX (6=0) ¥ 3 types de tests : ¨ attributs de fichiers ¨ variables ¨ entiers ¥ Possibilité : ¨ de grouper des expressions entre parenthèses ¨ de les combiner avec les opérateurs logiques : -o (OU), -a (ET), ! (NON) ¥ Remarque : la commande composée [[ expression ]] est différente de la fonction test notamment ne fait pas l’expansion des chemins Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 49/68 3 Langage de programmation 3.3 Fonctions 3.3.4 Fonction test (2) ¥ Test des attributs de fichiers : -type fichier ¨ type = r, w, x ¨ ou type = f, d, c, b, p ¨ ou type = u(suid), g (sgid) k (sticky) ¨ ou type = s (taille > 0) ¥ Exemple : test -x /vmunix ou [ -x /vmunix ] ¥ Test des variables : ¨ -z var variable de longueur nulle ¨ -n var variable de longueur non nulle ¨ var1 = var2 pour var1 et var2 identiques ¨ var1 != var2 pour var1 et var2 différentes ¥ Exemple : test $rep = "q" ou [ $rep = "q" ] ¥ Test des entiers : n1 cmp n2 ¨ cmp = -eq (n1= n2), -ne (n16=n2) ¨ cmp = -gt (n1 > n2), -ge (n1>= n2), -lt (n1 < n2), -le (n1<= n2) ¥ Exemple : test $# -gt 0 ou [ $# -gt 0 ] Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 50/68 3 Langage de programmation 3.3 Fonctions 3.3.5 Fonction eval ¥ Syntaxe : eval commande [arguments...] ¥ eval force l’interprétation par le shell de la commande et de ses arguments avant de l’exécuter ⇒ permet une double évaluation ¥ Principal intérêt : accéder au contenu du contenu d’une variable ¥ Exemple : soit un script exo contenant nb=$# eval Der=\${$nb} echo "Dernier Par = $Der" Exécution: exo oui non peut_etre Résultat: Dernier Par = peut_etre ¥ Seule possibilité ici, car si on utilise : ${nb} Résultat = 3 ${$nb} Erreur de syntaxe (bad substitution) \${$nb} Résultat =${3} Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 51/68 3 Langage de programmation 3.3 Fonctions 3.3.6 Autres fonctions ¥ : (2 points) fonction NOP, rien : permet des boucles infinies while : do commandes done ¥ type arg1 : type type type type affiche la nature de arg1 ls ls is the alias ’/bin/ls -F’ date date is /bin/date export export is a shell-builtin whi whi is unknown ¥ times affiche le temps d’exécution du shell et de ses fils (user et system) ¥ ulimit fixation de taille maximale pour un fichier en écriture (-f) ou un tube (-p) ¥ typeset typage d’une variable (fonction, entier, readonly...) Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 52/68 3 Langage de programmation 3.3 Fonctions 3.3.7 Fonctions liées aux processus ¥ ¥ ¥ ¥ exit [n] fin du processus wait [n] attente de la fin de tous les fils exec cmde exécution de cmde à la place du processus courant trap cmde n exécution de cmde sur réception du signal n (ou 0 pour EXIT) ¨ trap n −→ traitement par défaut ¨ trap "" n −→ signal n ignoré ¨ trap cmde 0 −→ cmde exécutée lors de la terminaison du processus ¨ trap -l −→ liste des signaux ¥ Exemple : trap "echo ’Attente avant de sortir’ ; sleep 2" 0 ¥ Exemple : trap "echo ’Vous avez tape CTRL C’" 1 ¥ Les parenthèses permettent d’exécuter une suite d’actions dans un processus fils pwd (cd /usr ; ls -la ) pwd cd /usr ; ls -la pwd Résultat: /user1 Listage de /usr Résultat: /user1 Listage de /usr Résultat: /usr Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 53/68 3 Langage de programmation 3.3 Fonctions 3.3.8 Fonction "point" ¥ L’exécution d’un shell-script exo ¨ soit par exo (s’il a le droit x) ¨ soit par ksh exo s’effectue dans le cadre d’un processus fils ¥ La fonction . (point espace) permet de l’exécuter dans le même processus −→ même environnement (variables, répertoire courant...) ¥ Par exemple, si un fichier fonctions contient une liste de déclarations de fonctions, on peut intégrer celles-ci dans le processus courant avec : . fonctions ¥ Remarques : ¨ un tel fichier n’a pas besoin du droit x ¨ ksh xyz : exécution du fichier xyz ksh -c xyz : exécution de la commande xyz Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 54/68 3 Langage de programmation 3.3 Fonctions 3.3.9 Fonction set ¥ Fonction set : 3 types d’actions ¨ Liste des variables : set (sans argument) ¨ Affectation des paramètres : set arg1 ... argn $1=arg1 ... $#=n $*= arg1 ... argn ¨ Modification d’une option du shell : set -x ajout option x set +x retrait option x ¥ Avec ksh, ajout de set -o option pour offrir plus de lisibilité (set -o verbose = set -v) ou des ajouts ¥ En particulier : set -o ignoreeof invalide CTRL D pour une déconnexion (utiliser alors exit) et set -o bgnice exécute les processus en différé avec une priorité plus faible Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 55/68 3 Langage de programmation 3.3 Fonctions 3.3.10 Principales options du shell a e f n u x - export de toute variable fin si un code de retour est non nul non interprétation de *?[] lecture sans exécution (mise au point) variables non définies = erreur affichage des commandes après interprétation et avant exécution pas d’option (utile pour affecter $1 avec une valeur commençant par tiret) ¥ Exemples set -f ; echo * set +f ; echo * a=/usr ; set -x cd $a b=‘pwd‘ set ‘ls -l f‘ set - ‘ls -l f‘ # affichage de * # liste des fichiers # affichage +cd /usr # affichage +pwd et b=/usr # erreur option inconnue (-rw..) $1=-rw... $2=1 ... $9=f $#=9 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 56/68 Shell 3 Langage de programmation 3.4 Structures de contrôle 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 Structure de contrôle : if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Structures for, while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Structure case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Structure until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Structure while redirigée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Fonction break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Fonction continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Structure select (ksh) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 57/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.1 Structure de contrôle : if if commande then commandes fi if commande then commandes 1 else commandes 2 fi if commande1 then commandes 1 elif commande2 then commandes 2 else commandes 3 fi ¥ Affichage du type de l’entrée fic1 if [ -f fic1 ] then echo "fic1 : fichier" elif [ -d fic1 ] then echo "fic1 : répertoire" else echo "fic1 : spécial" fi Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 58/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.2 Structures for, while for var in liste do commandes done while commande do commandes done ¥ Copie d’un fichier fic1 sous les répertoires /users/rep1 à /users/rep4 for n in 1 2 3 4 do cp fic1 /users/rep$n done ¥ Affichage de tous les paramètres un à un while [ $# -gt 0 ] do echo "Paramètre 1 = $1" shift done Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 59/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.3 Structure case case mot in motif1) motif2) ... motifn) esac commandes 1;; commandes 2;; commandes n;; ¥ Développe mot puis met en correspondance avec chacun des motifs (développement des chemins) ¥ Exemple : récupération dans une variable dir du répertoire courant ou du premier paramètre Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 60/68 3 Langage de programmation 3.4 Structures de contrôle case $# in 0) dir=‘pwd‘;; 1) dir=$1;; *) echo "Erreur de syntaxe" exit;; esac ¥ Exemple : affichage case $fic in *.c|*.s) *.o) *.a) *) esac de la nature de la variable fic echo echo echo echo "Fichier source";; "Programme Objet";; "Bibliothèque";; "Autre fichier";; Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 61/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.4 Structure until until commande do commandes done ¥ Structure similaire à while mais de type jusqu’à au lieu de tant que ¥ Exemple : lecture stdin jusqu’à un code de sortie until [ "$x" = "SVP" ] do echo "Et la politesse..." read x done ¨ Sortie de la boucle quand x vaut SVP Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 62/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.5 Structure while redirigée ¥ Boucle while sur lecture clavier : while read x do commandes done ¥ Sortie de la boucle sur échec de read x c’est-à-dire sur lecture de CTRL D ¥ Boucle while sur lecture fichier : while read x do commandes done <fichier ¥ ¥ ⇒ ¥ La redirection doit se placer après done et non pas après read x Si la redirection est placée après read x, alors ouverture du fichier à chaque itération boucle infinie de lecture de la première information Principe analogue pour until Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 63/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.6 Fonction break ¥ La fonction break permet de forcer la sortie d’une boucle for, while ou until. ¥ L’exécution reprend après done sans exécuter les instructions entre break et done ¥ Exemple while read x do if [ "$x" = "q" ] then break # sortie de boucle fi # commandes exécutées si x!=q ... done ¥ break accepte un argument entier n pour sortir d’un seul coup de n niveaux d’imbrication Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 64/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.7 Fonction continue ¥ La fonction continue permet de passer à l’itération suivante d’une boucle for, while ou until. ¥ Les commandes entre continue et done ne sont pas exécutées pour l’itération courante. ¥ Exemple : for f in * do if [ $f = "a.out" ] then continue # au suivant fi # commandes exécutées si f != a.out ... done ¥ continue accepte un argument entier n pour passer d’un seul coup à la nième itération suivante. Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 65/68 3 Langage de programmation 3.4 Structures de contrôle ¥ Remarque : l’écriture for var do commandes done est équivalente à for var in $* ... Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 66/68 3 Langage de programmation 3.4 Structures de contrôle 3.4.8 Structure select (ksh) select var in liste do commandes done ¥ ¥ ¥ ¥ ¥ Affichage sur stderr de la liste, chaque élément étant précédé d’un numéro lecture réponse sur stdin (mise dans REPLY) si réponse = un numéro, alors var=valeur associée, sinon var="" exécution des commandes boucle jusqu’à CTRL D ou break select editor in ed vi emacs xedit do echo "Editeur $editor" $editor done Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 67/68 3 Langage de programmation 3.4 Structures de contrôle ¥ Résultat : affichage de 1 ed 2 vi 3 emacs 4 xedit <???> lecture de la réponse (par exemple 3), affichage de Editeur emacs, appel d’emacs et à la sortie d’emacs, re-boucle jusqu’à CTRL D Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO 68/68