unix ENSIAS 2014 [Mode de compatibilité]
Transcription
unix ENSIAS 2014 [Mode de compatibilité]
23/02/2015 Unix Shell Pr. M.D. El Kettani ISO 27001 LI – ITILv3 ENSIAS Université Mohammed V – Souissi Plan 1. Présentation et rappels 2. Programmation par scripts 3. Mécanismes de base 4. Fonctionnement en interactif 5. Construction de shell-scripts portables (ksh/bash) 6. Mécanismes complémentaires 7. Extensions du Korn Shell et Bash 8. Automatisation avec les shell scripts 9. Les filtres: Grep, ed, sed et les expressions régulières 10. Les filitres programmables: le langage awk 11. Publication des données 12. Outils et commandes sur les fichiers 2 1 23/02/2015 Présentation et rappels Plan Introduction Le rôle du shell Les différents shells Les fonctionnalités des différents shells Le rappel de commandes 1ère connexion Pr. M.D. El Kettani 2013-2014 3 Présentation et rappels Introduction Le shell: Définition : ensemble de fonctions permettant d’exécuter les commandes de l’utilisateur Possibilité d’écrire nos propres commandes contrairement aux appels système. Intermédiaire entre l’homme et la machine. Plusieurs versions du shell: 2013-2014 Bourne Shell : sh, C Shell : csh, Korn Shell : ksh, etc. Pr. M.D. El Kettani 4 2 23/02/2015 Présentation et rappels Introduction Les outils: Définition : utilitaires servant généralement à développer et mettre au point les programmes Constitué de: Commandes générales Editeurs de texte ( vi ) ; Compilateurs de programmes ( langage C ; fortran ; cobol …), éditeur de liens … Traitement de texte (nroff, troff, …) 5 Pr. M.D. El Kettani 2013-2014 Présentation et rappels Le rôle du shell Shell = Interpréteur de commandes Définition Programme gérant l’interface entre l’utilisateur et le système Tout dialogue avec la machine se fait par l’intermédiaire du Shell (pas de compilation) Caractéristiques 1 exemplaire particulier du Shell par utilisateur Il peut lancer +ieurs Shells sur sa session 2013-2014 Pr. M.D. El Kettani 6 3 23/02/2015 Présentation et rappels Le rôle du shell Exercice: Afficher la valeur de votre shell par défaut Afficher la liste des shells disponibles Afficher la liste des shells supportés Modifier votre shell par défaut 7 Pr. M.D. El Kettani 2013-2014 Présentation et rappels Les différents shells sh ("Bourne shell", Steve Bourne, AT&T) shell historique (/usr/old/bin/sh, ou bsh) csh ("C-shell", Bill Joy, UCB) shell BSD (disponible sur tous les Unix) ksh ("Korn shell", David Korn, AT&T) Complète le shell Bourne et intègre avantages du C-shell Les Shells sh (shell normalisé POSIX P1003.2 et ISO 9945.2) Dérivé du shell Bourne et intègre fonctionnalités ksh bash ("Bourne again shell" de Brian Fox & C. Ramey) shell libre de droit, compatible shell POSIX (par défaut Linux) zsh ("Zero shell") ksh du domaine public (installé sur toutes les machines) 2013-2014 rsh ("Bourne shell réduit", cd, <, > inopérants) tcsh ("Toronto C-shell") Pr. M.D. El Kettani 8 4 23/02/2015 Présentation et rappels Fonctionnalités des shells Comparaison des Shells Shell program. bsh sh-POSIX csh tcsh ksh bash zsh std norme non std non std std norme norme histo non oui oui oui oui oui oui aliases non oui oui oui oui oui oui gestion tableaux chaînes oui non non oui oui oui var. num arith. C non oui oui oui - 9 Pr. M.D. El Kettani 2013-2014 non oui oui oui oui oui oui Présentation et rappels Fonctionnalités des shells Comparaison des Shells Shell sh csh tcsh ksh bash zsh 2013-2014 Programmation sûre (standard) à déconseiller à déconseiller normalisée normalisée normalisée + extensions Pr. M.D. El Kettani 10 5 23/02/2015 Présentation et rappels Fonctionnalités des shells Algorithme du shell Ouverture initiale de 3 fichiers standard entrée standard (stdin, fd=0), par défaut le clavier sortie standard (stdout, fd=1), par défaut l'écran sortie erreur standard (stderr, fd=2), par défaut l'écran Le shell lit sur son entrée standard 2013-2014 lecture de la commande jusqu'à la fin de ligne (\n) et interprétation des métacaractères et opérateurs lecture des lignes de commandes jusqu'à la fin de 11 fichier (^D) Pr. M.D. El Kettani Présentation et rappels Fonctionnalités des shells Algorithme du shell Lancement d'une commande recherche du nom de la commande à l'aide du PATH (path) en premier plan : fork() exec(commande) wait() prompt en arrière plan : fork() exec(commande) prompt 2013-2014 Pr. M.D. El Kettani 12 6 23/02/2015 Présentation et rappels Rappels de commandes Caractères de contrôle au clavier Caractères de contrôle: <cr> fin de ligne (retour chariot) mappé en <cr> <lf> fin de ligne (nouvelle ligne) mappé en <cr><lf> <tab> tabulation <bs> ^H, backspace, effacement du caractère précédent <del> ^?, souvent identique à <bs> <^C> interruption d'un processus attaché au terminal <^\> arrêt d'un processus avec vidage mémoire (core) 2013-2014 13 Pr. M.D. El Kettani Présentation et rappels Rappels de commandes Caractères de contrôle au clavier Caractères de contrôle (suite): <^Z> suspension d'un processus en premier plan <^U> effacement de la ligne complète <^W> effacement du mot qui précède <^D> fin de fichier => si le shell lit, fin d'un shell <^S> suspension de l'affichage écran (Xoff) <^Q> reprise de l'affichage écran (Xon) Gestion des caractères de contrôle par stty stty erase ^H kill ^U intr ^C susp ^Z quit ^\ eof ^D 2013-2014 Pr. M.D. El Kettani 14 7 23/02/2015 Présentation et rappels Rappels de commandes Format d'une commande: Invite (le prompt) principale $ en mode utilisateur # en mode super-utilisateur variable PS1 Invite secondaire > en mode interactif variable PS2 2013-2014 15 Pr. M.D. El Kettani Présentation et rappels Rappels de commandes Format d'une commande: Commande simple une commande simple est une séquence de mots séparés par un séparateur blanc et de redirections. Le premier mot désigne le nom de la commande à exécuter, les mots suivants sont passés en arguments à la commande. la valeur retournée d'une commande est celle de son exit. Chemin de recherche du nom d'une commande : PATH ou path (csh) 16 PATH=/usr/ucb:/bin:/usr/bin:/usr/local/bin:~/bin:. 8 23/02/2015 Présentation et rappels Rappels de commandes Enchaînement de commandes: Commande simple (en premier plan) $ commande [ arg ... ] Commande simple (en arrière plan) $ commande [ arg ... ] & Pipeline (tube de communication) $ commande1 [ arg ... ] | commande2 [ arg ...] | ... Séquencement de commandes (en premier plan) $ commande1 [ arg ... ]; commande2 [ arg ... ]; cmd3 ... 2013-2014 17 Pr. M.D. El Kettani Présentation et rappels Rappels de commandes Enchaînement de commandes: Exécution par un nouveau shell () $ sh commande [ arg ... ] $ (commande [ arg ... ]) $ (commande [ arg ... ]) & Regroupement de commandes $ (com1 [ arg ... ]; com2 [ arg ... ]; com3 ...) $ (com1 [ arg ... ]; com2 [ arg ... ]; com3 ...)& 2013-2014 Pr. M.D. El Kettani 18 9 23/02/2015 Présentation et rappels Rappels de commandes Le mode vi: <ESC> k, j h, l 351G Passer en mode rappel de commande Remonter ou descendre d’une commande Déplacer le curseur à gauche ou à droite Rappel de la commande n°351 /wh x a…<ESC> i…<ESC> r Rappel de la commande contenant la chaine wh Détruire le caractère courant Ajout après le curseur Ajout avant le curseur Remplace lePr.caractère courant 19 M.D. El Kettani 2013-2014 Présentation et rappels Rappels de commandes Exercice: Ecrire un shell script Unix ‘ordonne’ qui réordonne les lignes d’un fichier texte ‘losange’ correspondant à un losange dont les lignes sont disposées dans l’ordre inverse Indication: - Utiliser les commandes head et tail - Optimiser le shell script en utilisant les pipes 2013-2014 Pr. M.D. El Kettani 20 10 23/02/2015 Présentation et rappels Rappels de commandes Le mode fc: Afficher les dernières commandes avec leur n° d’ordre $ fc –l # ou history Afficher les 25 dernières commandes $ fc –ln –25 Afficher les commandes depuis 40 jusqu’à 50 $ fc –l 40 50 Afficher un domaine délimité par 2 commandes $ fc –lr vi cc 21 Pr. M.D. El Kettani 2013-2014 Présentation et rappels Rappels de commandes Le mode fc: Afficher le calendrier 1953 (7ème commande) $ cal 1953 Editer puis exécuter la commande numéro 7 $ fc 7 Remplacer 1952 par 1953 dans la 7ème commande $ fc –e –1952=1953 7 Editer puis exécuter les commandes entre 382 et 400 $ fc 382 400 2013-2014 Pr. M.D. El Kettani 22 11 23/02/2015 Présentation et rappels Rappels de commandes Paramétrage du rappel de commandes: Utiliser le mode vi $ set –o vi Choisir le nom du fichier historique $ HISTFILE=~/.histo (par défaut ~/.sh_history) Choisir la taille du fichier $ HISTSIZE=300 (par défaut 128) 2013-2014 23 Pr. M.D. El Kettani Présentation et rappels 1ère connexion Le cas Linux: Fiche produit Sous-système de communication réseau: TCP/IP v4 et v6, IPX/SPX, AppleTalk, X25, Ethernet, … Serveur de messagerie SMTP, POP et IMAP Serveur Web Apache avec sécurisation SSL Serveur de fichiers FTP, noms DNS, news Fonctions DHCP, NIS, Bootp, PAM, annuaire LDAP, Telnet, NAT, Masq, Tunneling, IP Mobile, VPN, multicast Outils d’administration SNMP Utilisation dédiée: routeur, pare-feu, proxy Sous-système d’interface utilisateur: Architecture C/S X Window Interface mode texte disponible 24 12 23/02/2015 Présentation et rappels 1ère connexion Termes à connaître : Super Utilisateur : root , il s’occupe de l’administration du système UNIX ( installation des logiciels, création des profiles utilisateurs, sauvegarde et restauration des données etc…) Hôte (serveur) : système centrale sur lequel peuvent se connecter les utilisateurs Terminal (console) : machine composée généralement d’un écran et d’un clavier, branchée directement à la machine Hôte 2013-2014 25 Pr. M.D. El Kettani Présentation et rappels 1ère connexion Les configurations possibles Terminal Architecture Client / Serveur native Architecture Client / Serveur allégée (émulation de terminal) 2013-2014 Pr. M.D. El Kettani 26 13 23/02/2015 Présentation et rappels 1ère connexion Les étapes d’une connexion Pré-requis : une machine Hôte tournant sous Unix des postes clients connectés soit directement (liaison série) soit par l’intermédiaire d’une connexion réseau (carte réseau; et protocole TCP/IP) Connexion au serveur Unix par l'instruction : telnet <serveur_Unix> Création préalable des utilisateurs sur l’Hôte: Utilitaire < smit sous AIX >, <sysadm> sous SCO ou la commande <adduser> sous Linux etc . 27 Présentation et rappels 1ère connexion Étape 1/3 : connexion machine (login) côté serveur: chargement du noyau lecture du fichier /etc/rc attente de connexion des utilisateurs côté client : séquence login/password information stockée dans le fichier /etc/passwd 2013-2014 Pr. M.D. El Kettani 28 14 23/02/2015 Présentation et rappels 1ère connexion Étape 1/3 : connexion machine (login) une entrée dans le fichier /etc/passwd contient: nom de l ’usager: son login mot de passe encrypté associé UID GID commentaire home directory (répertoire de travail) programme à lancer après le login (shell) 2013-2014 29 Pr. M.D. El Kettani Présentation et rappels 1ère connexion Étape 2/3 : la session de travail initialisation du terminal lecture du fichier /etc/motd mise en place de l’environnement système chargement du profil de l ’utilisateur (lecture des fichiers .login et .cshrc) attente des instructions en affichant un prompt 2013-2014 Pr. M.D. El Kettani 30 15 23/02/2015 Présentation et rappels 1ère connexion Étapes 3/3 : déconnexion (logout) Fermeture de session ‘logout’ ou ‘exit’ ou ‘ctrl+d’ Remarques : Configuration de l’environnement utilisateur Introduction des commandes nécessaires dans un fichier du répertoire de connexion: fichier .profile : utilisateurs du Bourne ou Korn Shell, fichiers .login et .cshrc : utilisateurs du C Shell 31 Pr. M.D. El Kettani 2013-2014 Présentation et rappels 1ère connexion Les premières commandes Unix: syntaxe : <commande> <liste d’arguments> distinction entre majuscules et minuscules importance du séparateur ‘ ‘ le manuel en ligne : man <commande Unix> Application: les premières commandes Unix changement du mot de passe changement de répertoire 2013-2014 Pr. M.D. El Kettani 32 16 23/02/2015 Programmation par script Plan Le principe du script Les commentaires Exécution d’un script Mise au point Options du shell Affichage de messages 33 Pr. M.D. El Kettani 2013-2014 Programmation par script Le principe du script À réaliser $ cat le_script 1) signaler le démarrage echo début de la copie 2) sauver les fichiers tar cvf *.data 3) Détruire les temporaires rm *.tmp 4) Avertir que la sauvegarde echo copie terminée est terminée Exécution 2013-2014 sh le_script Pr. M.D. El Kettani 34 17 23/02/2015 Programmation par script Les commentaires $ more le_script #!/bin/sh # Ce script sera exécuté par la comande # /bin/sh # Un commentaire se termine en fin de ligne # @(#) Commentaire SCCS, affiché par la # @(#) commande what date # Affiche la date et l’heure : pseudo commentaire, toujours vrai 2013-2014 Pr. M.D. El Kettani 35 Programmation par script Les commentaires La commande what: Package CSSC Installer le package what commande 2013-2014 Pr. M.D. El Kettani 36 18 23/02/2015 Programmation par script Exécution d’un script Exécution d’un script grâce à sh (shell fils) Cas 1: $ /bin/sh le_script Cas 2: $ sh < le_script Cas 3: $ ./le_script Prérequis au cas 3: Création d’une nouvelle commande $ chmod u+x le_script $ le_script # la variable PATH doit être définie correctement $ ./le_script Exécution d’un script par le shell courant $ . le_script 37 Pr. M.D. El Kettani 2013-2014 Programmation par script Mise au point Activation/Désactivation du mode trace dans le script Syntaxe: #!/bin/sh set –x # l’option x (eXtra output: affiche les étapes de subtitution Commandes tracées set – # echo Revient au mode normal 2013-2014 Pr. M.D. El Kettani 38 19 23/02/2015 Programmation par script Mise au point Activation/Désactivation du mode trace dans le script Exemple: #!/bin/bash tail -1 losange set -x for ((i=2;i<=3;i++)) do tail -$i losange | head -1 done set head -1 losange [user@localhost ~]$ ./ordonner /\ + (( i=2 )) + (( i<=3 )) + head -1 + tail -2 losange / \ + (( i++ )) + (( i<=3 )) + head -1 + tail -3 losange / \ + (( i++ )) + (( i<=3 )) + set \/ [user@localhost ~]$ 39 Programmation par script Mise au point Exécution d’un script, affiche la trace des commandes [user@localhost ~]$ bash -v ./ordonner $ sh –v le_script $ sh –xv le_script #!/bin/bash tail -1 losange /\ # set -x for ((i=2;i<=3;i++)) do tail -$i losange | head -1 done / \ / \ # set head -1 losange \/ [user@localhost ~]$ 40 20 23/02/2015 La programmation du shell Mise au point L’option x: affiche les étapes de substitution, signalées par la ligne + L’option v (verbose): affiche la ligne telle qu’elle est écrite dans le script, avant que le shell ne l’interprète L’option n: permet de seulement vérifier la syntaxe L’option e: provoque la fin d’exécution d’un script si une commande se termine avec un code de retour différent de zero 41 Pr. M.D. El Kettani 2013-2014 Programmation par script Options du shell Gestion des options 2013-2014 set –o # liste des drapeaux set –o drapeau [shell_script] # lève un drapeau set +o drapeau [shell_script] # abaisse un drapeau Pr. M.D. El Kettani 42 21 23/02/2015 Programmation par script Options du shell Principales options ignoreeof Oblige utiliser exit et interdit usage ^D pour déconnecter noclobber Interdit à une redirection > d’effacer un fichier history Active l’historique dans le tampon (HISTSIZE) vi utilise le mode vi de rappel de commandes emacs utilise le mode emacs de rappel de commandes bgnice exécute les tâches de fond avec une faible priorité nounset génère erreur quand on utilise variable non définie noglob n’interprète pas les jockers * et ? verbose affiche l’entrée du shell en cours d’exécution xtrace active le mode trace 43 Programmation par script Affichage de messages: echo, print (ksh) • La commande echo: $ echo "Salut"; echo "Il est midi" Salut Il est midi $ echo –e "Salut \c"; echo "Il est midi" Salut Il est midi • La commande print (ksh): $ print "Salut"; echo "Il est midi" Salut Il est midi $ print -n "Salut"; echo "Il est midi" Salut Il est midi 2013-2014 Pr. M.D. El Kettani 44 22 23/02/2015 Programmation par script Exercices Quel résultat produira l’exécution de la commande suivante! $ # pwd Avec une seule commande d’affichage, affichez sur deux lignes le message suivant: Bonjour Quelle heure est-il? Dans votre répertoire de connexion, écrivez un script de nom script1, qui affiche la date et la liste des utilisateurs connectés Donner toutes les syntaxes possibles pour exécuter le script créé dans l’exercice précédent, sans fournir son chemin absolu. Le répertoire de connexion est le répertoire courant, et le script est exécutable Exécuter le script script1 en mode trace. Le script doit afficher le résultat de l’interprétation de chaque ligne avant l’exécution de la commande Pr. M.D. El Kettani 2013-2014 45 Mécanismes de base Plan Les variables L’environnement Les paramètres d’un script La commande read Le remplacement de variables Les tableaux 2013-2014 Pr. M.D. El Kettani 46 23 23/02/2015 Mécanismes de base Les variables Les types de variables : Variables prédéfinies: lors de la connexion Variables positionnelles: paramètres d’un script Variables spéciales du shell: maintenues par le shell Variables créées par l’utilisateur Pr. M.D. El Kettani 2013-2014 47 Mécanismes de base Les variables Syntaxe: Déclaration: variable=valeur Utilisation: variable2=$variable variable2=${variable} Liste des variables: set/env Suppression des variables: 2013-2014 unset nom Pr. M.D. El Kettani 48 24 23/02/2015 Mécanismes de base Les variables Syntaxe: $ nom=ALI $ adresse="2 bd de France" $ echo $nom ALI $ echo $adresse 2 bd de France $ unset adresse $ set HOME=/home/ali PATH=/bin:/usr/bin PS1=$ nom=ALI Pr. M.D. El Kettani 2013-2014 49 Mécanismes de base Les variables Exemple: $ vehicule=voiture $ echo "un $vehicule, des $vehicules" un vehicule, des $ echo "un $vehicule, des ${vehicule}s" un vehicule, des vehicules $ transport="air mer terre" $ echo $transport air mer terre $ unset vehicule transport $ echo "vehicule = $vehicule et transport = $transport" vehicule = et transport = 2013-2014 Pr. M.D. El Kettani 50 25 23/02/2015 Mécanismes de base L’environnement Définition: Ensemble des variables dont un shell fournit une copie à la descendance La commande export : Syntaxe: export [variable[=valeur]] Exemple 51 Pr. M.D. El Kettani 2013-2014 Mécanismes de base L’environnement Exemples: $ vehicule=voiture; export vehicule $ fleur=rose $ set … $ env … $ sh $ env … $ vehicule=bicyclette $ exit $ env … la valeur originale de vehicule a été conservée dans le 1er shell 52 26 23/02/2015 Mécanismes de base L’environnement Exemples (suite): Quelle est la sortie de cette exécution? $ more environ #!/bin/bash echo "(a): $VAR_LOCALE" echo "(b): $VAR_GLOBALE" $ VAR_LOCALE=Logan $ VAR_GLOBALE=Renaut $ export VAR_GLOBALE $ environ … 2013-2014 53 Pr. M.D. El Kettani Mécanismes de base Les variables d’environnement Créées lors de la connexion: LOGNAME le nom de l’utilisateur HOME chemin d'accès au répertoire initial de l'utilisateur PWD répertoire courant de travail PATH suite de chemins d'accès aux répertoires des exéc. PS1 invite principale du shell en mode interpréteur PS2 invite secondaire du shell en mode programmation IFS séparateurs de champ des arguments MAIL=[chemin] fichier boîte aux lettres utilisateur MAILPATH =[chemin]:[chemin] (remplace MAIL) MAILCHECK intervalle en sec au bout duquel le mail est contrôlé CDPATH liste de chemins d'accès pour la commande cd ENV nom du fichier des variables d'environnement TERM nom du type de terminal TMOUT délai avant la fermeture automatique d’une fenêtre inactive 54 27 23/02/2015 Mécanismes de base Les variables d’environnement La commande d’environnement: env: Affiche la liste des variables exportables set: Affiche la liste des variables existantes 55 Pr. M.D. El Kettani 2013-2014 Mécanismes de base Le profil d’utilisateur Fichiers d'initialisation (Bash): Initialisations communes: /etc/profile Initialisations personnalisées: .bash_profile .bashrc .bash_logout Templates: /etc/skel Autres shells: C-shell: .login .cshrc .logout Bourne shell, Korn shell & POSIX: .profile Zsh: .zshrc T-csh: .tcshrc 56 28 23/02/2015 Mécanismes de base Le profil d’utilisateur /etc/profile (sous System V): Initialisation commune à tous les login-shells point de passage obligé pour tous les login fourni par constructeur/adapté par administrateur non modifiable par l'utilisateur Mécanismes complémentaires dans /etc/profile.d Exemple : 2013-2014 PATH=$PATH:/usr/local/bin; export PATH ENV=~/.bashrc; export ENV PS1=‘$PWD‘ " ! `uname –n` $ « ; export PS1 TMOUT=600 umask 077 set –o ignoreeof set –o vi set –o noclobber Pr. M.D. El Kettani 57 Mécanismes de base Le profil d’utilisateur Cas du bash: .bash_profile: Exécuté à chaque ouverture de session Initialisation propre à l'utilisateur situé dans le HOME de l'utilisateur : ~/.profile redéfinition des variables proposées par /etc/profile définition de nouvelles variables (var=valeur) détection si le shell est interactif ou non exécution ou non de scripts d'initialisation configuration des paramètres du terminal (stty) peut-être "ressourcé" (. ou source): . profile (sh, ksh, bash, zsh) source .profile (bash) 2013-2014 Pr. M.D. El Kettani 58 29 23/02/2015 Mécanismes de base Le profil d’utilisateur Cas du bash: .bashrc: Spécificité des shells zsh et bash Exécuté à chaque appel de terminal Initialisation propre à l'utilisateur situé dans le HOME de l'utilisateur : ~/.zshrc ~/.bashrc redéfinition du prompt PS1 définition des aliases définition de fonctions peut-être "ressourcé": ~/.bashrc ou source ~/.bashrc . ~/.zshrc ou source ~/.zshrc – Exemple: alias ls='ls -F' alias ll='ls -laF' Pr. M.D. El Kettani 2013-2014 59 Mécanismes de base Le profil d’utilisateur Cas du bash: .bash_logout: Fichier de clôture d'une session bash effacement des fichiers temporaires, clear écran attente de déconnexion 2013-2014 Pr. M.D. El Kettani 60 30 23/02/2015 Mécanismes de base Le profil d’utilisateur Cas du C-shell: .login, .cshrc, .tcshrc, .logout (en csh ou tcsh): .login : Fichier d'initialisation d'un login C-shell interprété à chaque login définition de nouvelles variables peut-être "ressourcé" par source .login .cshrc/.tcshrc : Fichier d'initialisation d'un Csh réinterprété à chaque invocation du csh/tcsh définition des aliases (shells interactifs) peut-être "ressourcé" par source .cshrc/.tcshrc .logout : Fichier de clôture d'une session C-shell effacement des fichiers temporaires, clear écran Exemple: setenv EDITOR emacs 2013-2014 Pr. M.D. El Kettani Le profil d’utilisateur 61 Mécanismes de base 62 31 23/02/2015 Mécanismes de base Exercice: Identifier les fichiers d’initialisation de session communs à tous les utilisateurs du système Identifier les fichiers d’initialisation de session propres à votre compte de travail Identifier et afficher les alias disponibles par défaut Modifier votre profile de facon à inclure l’alias « la=ls –a » Pr. M.D. El Kettani 2013-2014 63 Mécanismes de base Les paramètres Les variables positionnelles: Définition: $0 nom du script (pathname) $1,…, $9, $10,… arguments (du 1er au 9ème, 10ème,…) $# nombre de paramètres passés au script $* liste de tous les arguments sous forme d’un seul argument $@ liste tous les paramètres, un argument par paramètre Exemples: $ more param echo "la commande echo "1er paramètre echo "2ème paramètre echo "Tous les paramètre echo "Nombre de paramètres 2013-2014 :$0" :$1" :$2" :$*" :$#" Pr. M.D. El Kettani 64 32 23/02/2015 Mécanismes de base Les paramètres Les variables positionnelles: 2013-2014 La commande shift: décale les paramètres de n positions vers la gauche (par défaut 1) Syntaxe: shift [n] La commande set: remplace les paramètres du script par les arguments de la commande, ainsi que les variables #, * et @ Syntaxe: set argument1 … Exemple: $ set un deux trois; echo $* un deux trois $ shift; echo $*; echo $1 $ shift; echo $*; echo $1; echotrois $# deux trois trois deux $ shift; echo $# 65 1 Pr. M.D. El Kettani 0 Mécanismes de base Les paramètres Les variables positionnelles: Exercice: Ecrire un shell script Unix qui initialise un tableau semaine en y inserant les jours de la semaine. Afficher sur une ligne a part chaque jour de la semaine. Utiliser la boucle while Completer le shell script precedent en initialisant 2 tableaux week et semaine contenant les jours de la semaine en francais et en anglais. Afficher les jours de la semaine en francais et leur traduction en anglais sur une meme ligne 2013-2014 Pr. M.D. El Kettani $ shift; echo $*; echo $1 trois trois $ shift; echo $# 66 0 33 23/02/2015 Mécanismes de base Les paramètres Les variables spéciales du shell: $? code retourné par la dernière commande $$ numéro de processus de ce shell $! numéro du dermier processus en arrière plan $- drapeaux fournis au shell par set (options du shell) 2013-2014 Pr. M.D. El Kettani 67 Mécanismes de base L’instruction read Définition : Syntaxe: read variable … L’instruction readonly: Crée une variable qu’on ne peut plus supprimer ni modifier Syntaxe: readonly variable=valeur 2013-2014 Pr. M.D. El Kettani 68 34 23/02/2015 Mécanismes de base Remplacement de variables Syntaxe: variable=$var variable=${var} :remplacée par ‘$var’ si ‘var’ sinon par rien :remplacée par ‘$var’ si ‘var’ ∃ sinon par rien Forme recommandée, afin de se prémunir de certaines incohérences en cas de concaténations de chaînes de caractères variable=${var:-val} :remplacée par ‘$var’ si ‘var’ ∃ sinon par ‘val’ variable=${var:+val} :remplacée par ‘val’ si ‘var’ ∃ sinon aucune substit. variable=${var:?msg}:remplacée par ‘$var’ si ‘var’ ∃ sinon affiche err.‘msg’ variable=${var:=val} :remplacée par ‘$var’ si ‘var’ ∃, sinon remplacée par ‘val’ et var<−val 69 Mécanismes de base Remplacement de variables Exemple: $ reponse=non $ echo ${reponse:-oui} non $ unset reponse $ echo ${reponse:-oui} oui $ echo ${reponse:=oui} oui 70 35 23/02/2015 Mécanismes de base Remplacement de variables Exercice : quelle est la trace des commandes? $ V="" $ [ "$V" = "" ] && echo "La variable V est vide ou non définie" La variable V est vide ou non définie $ jour=Lundi $ mois=Janvier $ echo "${jour:-Dimanche}" Lundi $ echo "${saison:-Hiver}" Hiver $ echo "${mois:-Avril}" Janvier 71 Pr. M.D. El Kettani 2013-2014 Mécanismes de base Remplacement de variables Exercice (suite): 2013-2014 $ echo "${saison:+Hiver}froid" froid $ echo "${jour:?jour_incorrect}" Lundi $ echo "${jour1:?jour_incorrect}" jour1: jour_incorrect $ echo "${mois:=Avril}" Janvier $ echo "${vacances:=Juillet}" Juillet $ echo "$vacances est un mois de vacances" Pr. M.D. El Kettani Juillet est un mois de vacances 72 36 23/02/2015 Mécanismes de base Les tableaux (ksh) Syntaxe: Création: set –A nom_tab arg1 arg2 arg3 … set –A nom_tab $(commande) Affectation: nom_tab[n]=argument Remplacement d’un élément: ${nom_tab[n]} Remplace tout le tableau: ${nom_tab[*]} ou ${nom_tab[@]} Lit la taille du tableau: ${#nom_tab [*]} Pr. M.D. El Kettani 2013-2014 73 Mécanismes de base Les tableaux (ksh) Exemple: $ set –A table bleu blanc vert $ echo ${table[0]} bleu $ echo ${table[0..1]} bleu blanc $ table[1]=beige $ echo ${table[*]} bleu beige vert $ echo ${#table[*]} 3 2013-2014 Pr. M.D. El Kettani 74 37 23/02/2015 Mécanismes de base Les tableaux (ksh) Exercice : quelle est la trace des commandes? $ set –A fleurs Rose Tulipe Iris Jasmin 2013-2014 $ echo "${fleurs[*]} sont des noms de fleurs" Rose Tulipe Iris Jasmin sont des noms de fleurs $ echo "${fleurs[@]} sont des noms de fleurs" Rose Tulipe Iris Jasmin sont des noms de fleurs $ echo "Les ${fleurs[0]}s ont des épines" Les Roses ont des épines $ echo "J’ai ${#fleurs[*]} types de fleurs" J’ai 4 types de fleurs $ fleur[4]=Bégonia $ echo "${fleurs[@]} sont des noms de fleurs" Rose Tulipe Iris Jasmin Bégonia sont des noms de fleurs $ echo "J’ai maintenant ${#fleurs[*]} types de fleurs" J’ai 5 types de fleurs Pr. M.D. El Kettani 75 Mécanismes de base Les tableaux (ksh) Exercice : Dans le tableau fleur, inserer entre les positions 2 et 3 le type marguerite 2013-2014 Pr. M.D. El Kettani 76 38 23/02/2015 Mécanismes de base Exercices Écrire un shell script qui affiche les processus d’un utilisateur dont le nom est passé à travers une variable d’environnement (par exemple LOGNAME) Ecrire un shell script qui modifie la valeur de la variable d’environnement TZ (timezone) en lui affectant par exemple la valeur GMT, et qui affiche ensuite l’heure système. Après exécution, afficher de nouveau l’heure système, que constatez vous? Écrire un shell script qui génère des noms de fichiers différents à chaque exécution, mais qui commencent par la racine du fichier Écrire un script qui recherche un fichier dans une arborescence. Le nom du fichier et la racine de l’arborescence doivent être passés en paramètre, dans cet ordre. On suppose que le nombre et le type des paramètres sont corrects, le script n’en effectue pas le contrôle En utilisant la variable IFS, écrivez un script qui demande la saisie d’une date au format jj/mm/aa (une seule chaine) et qui récupère cette dernière dans trois variables: jour, mois et an Comment appeler un script qui attend un seul paramètre avec comme argument une chaine qui comporte des espaces (l’espace est un délimiteur!) 77 Pr. M.D. El Kettani 2013-2014 Fonctionnement en interactif Plan Les jokers Les caractères d’échappement Les redirections et les tubes Le remplacement de commandes Les caractères spéciaux 2013-2014 Pr. M.D. El Kettani 78 39 23/02/2015 Fonctionnement en interactif Les jokers Exemple: $ ls file1 file2 file23 file43 $ echo * file1 file2 file23 file43 $ echo file2* file2 file23 $ echo file?3 file23 file43 $ echo file[1234] # ou echo file[1-4] file1 file2 Pr. M.D. El Kettani 2013-2014 * ? […] { [aep] [a-p] [!aep] [!a-p] 79 Fonctionnement en interactif Les jokers Exercice: Quelle est la trace des commandes suivantes? $ ls -c auto exercice f1 f2 f3 fichier.txt lisezmoi.txt p1 r1 s1 $ echo * auto exercice f1 f2 f3 fichier.txt lisezmoi.txt p1 r1 s1 $ echo f* f1 f2 f3 fichier.txt $ echo f? f1 f2 f3 $ echo [aep]* auto exercices p1 $ echo [!aep]* f1 f2 f3 fichier.txt lisezmoi.txt r1 s1 2013-2014 Pr. M.D. El Kettani $ echo f[0-9] f1 f2 f3 $ echo f[!0-9]* fichier.txt $ echo *.dat *.dat # pas de remplacement de jockers # car aucun nom de fichier ne # correspond au modèle 80 40 23/02/2015 Fonctionnement en interactif Les caractères d’échappement Exemple: $ echo \* \~ \$ \\ *~$\ $ echo '* ~ $ \' *~$\ $ echo "~ * ' " ~*' $ echo " ‘echo‘ un \" $PS2" un " > Protège tous les caractères sauf lui-même ' \ '...' "…" Protège tous les caractères sauf $, \, ‘ et lui-même " 2013-2014 81 Pr. M.D. El Kettani Fonctionnement en interactif Les caractères d’échappement Exercice: Quelle est la trace des commandes suivantes? $ echo \\ $ echo " ' " \ ' $ echo bon\ $ echo ' " ' >jour " bonjour $ ls -c exercices f1 f2 f3 fichier.dat lisezmoi.txt p1 r1 s1 $ echo le caractère * est un joker le caractère exercices f1 f2 f3 fichier.dat lisezmoi.txt p1 r1 s1 est un joker $ echo le caractère \* est un joker le caractère * est un joker $ echo "Pressez la touche <Entrée> pour continuer" Pressez la touche <Entrée> pour continuer $ echo 'Le prompt primaire est le caractère $, le prompt secondaire est le caractère >' >‘ Le prompt primaire est le caractère $, le prompt secondaire est le caractère > 82 41 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les fichiers d’E/S Standards : Toutes les commandes utilisent les canaux d’E/S pour lire ou transmettre leur résultat. Ces canaux portent des noms spéciaux : Canal d’entrée standard (0) : Clavier par défaut Canal de sortie standard (1) : Écran par défaut Canal de sortie erreur standard (2) : Écran par dft Unités clavier-écran = périphériques, (gérés par Unix en tant que fichiers spéciaux) 83 Pr. M.D. El Kettani 2013-2014 Fonctionnement en interactif Les redirections et les tubes Les fichiers d’E/S Standards : En interne, toute écriture (resp. lecture) sur le canal de la sortie (l’entrée) se traduit par une écriture (lecture) dans le fichier spécial associé. Une des principales caractéristiques du shell Définition: Remplacement des fichiers spéciaux d’E/S standard par d’autres fichiers normaux (texte) 2013-2014 Pr. M.D. El Kettani 84 42 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections (>, 1>, >>): $ date > un_fichier $ more un_fichier Sat Mar 15 11:11:11 GMT 2014 $ who am i 1> un_fichier $ more un_fichier ali tty01 Mar 15 11:11 $ date >> un_fichier $ more un_fichier Sat Mar 15 11:11:11 GMT 2014 ali tty01 Mar 15 11:11 2013-2014 > >> < 2> | 85 Pr. M.D. El Kettani Fonctionnement en interactif Les redirections et les tubes Exercice: Quelle est la trace des commandes suivantes? $ who am i > fsortie $ cat fsortie ali tty03 mar 11:11:11 $ date '+Heure:%T' # Affiche l’heure précédée du message « Heure: » Heure: 11:11:11 $ date '+Heure:%T‘ > fsortie $ cat fsortie Heure:11:11:11 $ echo "Liste des utilisateurs connectés" >> fsortie $ who >> fsortie $ cat fsortie Heure:11:11:11 Liste des utilisateurs connectés root tty01 mar 19 11:11 2013-2014 Pr. M.D. El Kettani 86 43 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections (<, 0<): $ write ali La commande write permet de communiquer avec un autre utilisateur en copiant les lignes de l’entrée standard sur son terminal, si ce dernier l’a autorisé en utilisant la commande mesg –y Ctrl-D $ cat > message Bonjour Ali , comment vas-tu? Ctrl-D $ write ali 0< message 2013-2014 87 Pr. M.D. El Kettani Fonctionnement en interactif Les redirections et les tubes Exercice: Quelle est la trace des commandes suivantes? $ mail brahim # le message doit être saisi au clavier Subject: Voeux Bon travail Et à bientôt ^D $ cat > vœux # le message est enregistré dans le ficher voeux Bon travail Et à bientôt ^D $ mail brahim <vœux # l’entrée de la commande mail est redirigée vers voeux $ mail ali < voeux $ 2013-2014 Pr. M.D. El Kettani 88 44 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections (<<): Syntaxe : $ Commande << chaine Permet d’envoyer à « commande » toutes les lignes tapées en entrée, jusqu'à la chaîne saisie, méthode du "here document" Exemple : $ wc -l << fin "collez quelque chose avec la souris" fin Permet de compter le nombre de lignes 1 dans la chaîne saisie avant « fin ». $ 2013-2014 89 Pr. M.D. El Kettani Fonctionnement en interactif Les redirections et les tubes Les redirections (2>): $ ls –l /etc/group XYZ ls: XYZ: No such file or directory -rw-r--r-- 1 root root 288 Mar 22 2014 $ ls –l /etc/group XYZ 2> erreur -rw-r--r-- 1 root root 288 Mar 22 2014 $ more erreur ls: XYZ: No such file or directory $ ls –l /etc/group XYZ > sortie 2>&1 $ more sortie ls: XYZ: No such file or directory -rw-r--r-- 1 root root 288 Mar 22 2014 /etc/group /etc/group /etc/group 90 45 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections (2>>): $ cc programme.c 2>> erreurs Erreurs de compilation de programme.c redirigées vers le fichier erreurs. Syntaxe de redirection de fichiers: descripteur> descripteur>> >&descripteur >>&descripteur • 2013-2014 91 Pr. M.D. El Kettani Fonctionnement en interactif Les redirections et les tubes Exercice: Quelle est la trace des commandes suivantes? $ ls –l /etc/passwd /etc/password ls : /etc/password not found: No such file or directory (error 2) -rw-rw-r– 1 bin auth 1000 oct 17 12:12 /etc/passwd $ ls –l /etc/passwd /etc/password 2> /dev/null -rw-rw-r– 1 bin auth 1000 oct 17 12:12 /etc/passwd $ ls –l /etc/passwd /etc/password 2> fic.err -rw-rw-r– 1 bin auth 1000 oct 17 12:12 /etc/passwd $ cat fic.err ls : /etc/password not found: No such file or directory (error 2) $ ls –l /etc/passwd /etc/password > fic.out 2>&1 # mixe sortie et erreur $ cat fic.out ls : /etc/password not found: No such file or directory (error 2) -rw-rw-r– 1 bin auth 1000 oct 17 12:12 /etc/passwd 2013-2014 Pr. M.D. El Kettani 92 46 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections, les tubes (|): Exemple: $ who | wc - l (**) who : liste de personnes connectés au système. wc -l nom_fichier : Compte le nombre de lignes de ‘nom_fichier’. La séquence (**) permet de compter le nombre de personnes connectés, elle est équivalente à la ligne de commande suivante: $ who>tmp ; wc -l tmp ; rm tmp 93 Pr. M.D. El Kettani 2013-2014 Fonctionnement en interactif Les redirections et les tubes Les redirections, les tubes (|): La commande tee : En utilisant des filtres le résultat de la commande1 n’est pas visualisé à l’écran, pour pouvoir le visualiser on utilisera des tuyaux : commande tee. Syntaxe: $ commande1 | tee fichier1 | commande2 Redirige le résultat intermédiaire de commande1 vers fichier1. Ce même résultat sera traité par la commande commande2. 2013-2014 Pr. M.D. El Kettani 94 47 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Les redirections, les tubes (|): La commande tee Exemple: $ ls | grep poème | tee fichier1 | wc -l 1 2 3 4 1: Liste des fichiers dans le répertoire courant 2: Recherche des noms de fichiers qui contiennent la chaîne de caractères poème. 3: Met le résultat de la commande précédente dans fichier1 4: compte le nombre de lignes ramenés par grep. 95 Pr. M.D. El Kettani 2013-2014 Fonctionnement en interactif Les redirections et les tubes Les redirections (>|) ksh: $ set +o noclobber # par défaut $ date > un_fichier $ who am i > un_fichier $ more un_fichier ali tty01 Mar 2 10:10 $ set –o noclobber $ cal > un_fichier ksh: cannot create un_fichier: file exists 2013-2014 $ cal >| un_fichier $ Pr. M.D. El Kettani 96 48 23/02/2015 Fonctionnement en interactif Les redirections et les tubes Exercice: Quelle est la trace des commandes suivantes? $ who am i > fsortie $ cat fsortie ali tty03 mar 11:11:11 $ set –o noclobber # interdit l’écrasement en redirection avec le caractère > $ date '+Heure:%T' # Affiche l’heure précédée du message « Heure: » Heure: 11:11:11 $ date '+Heure:%T‘ > fsortie # %T affiche l’heure Sh: File already exists $ date '+Heure:%T‘ >| fsortie # force l’écrasement d’un fichier existant $ cat fsortie Heure:11:11:11 $ set +o noclobber $ echo "Liste des utilisateurs connectés" >> fsortie $ who am i > fsortie $ cat fsortie root tty01 mar 19 11:11 97 Fonctionnement en interactif Les redirections et les tubes xargs et sh: La commande xargs peut aider à exécuter un flux: -t pour avoir l'écho des commandes et -n pour découper le flux d'entrée en paquets : Exemple: $ xargs -t -n 2 diff <<fin fic1 fic2 fic3 fic4 fic5 fic6 fin 2013-2014 diff fic1 fic2 diff fic3 fic4 diff fic5 fic6 Pr. M.D. El Kettani 98 49 23/02/2015 Fonctionnement en interactif Les redirections et les tubes xargs et sh: La commande xargs peut aider à exécuter un flux : -i pour insérer le flux : Exemple: $ ls | xargs -t -i{} mv {} {}.old mv chap1 chap1.old mv chap2 chap2.old mv chap3 chap3.old Pr. M.D. El Kettani 2013-2014 Le remplacement de commandes 99 Fonctionnement en interactif Exemple: $ echo la date la date $ echo "date = `date`" date = Sat 15 11:11:11 GMT 2014 $ echo "date = $(date)" date = Sat 15 11:11:11 GMT 2014 2013-2014 Pr. M.D. El Kettani 100 50 23/02/2015 Le remplacement de commandes Fonctionnement en interactif Exercice: Quelle est la trace des commandes suivantes? $ cd ~ali $ echo "`pwd` est le répertoire courant" /home/ali est le répertoire courant $ echo "$(pwd) est le répertoire courant" /home/ali est le répertoire courant $ cat > liste ali brahim ^D $ mail `cat liste‘ # courrier pour ali et brahim $ echo "Nombre de fichier du répertoire: \c `ls | wc –w`" Nombre de fichier du répertoire: 24 $ echo "Utilisateurs connectés\n `who | cut –d ' ' –f1`" Utilisateurs connectés root ali brahim Panorama des caractères spéciaux 101 Fonctionnement en interactif Jockers: *,?,[…] Échappement \, ‘…’, "…" Redirection <,0<,>,1>,2>,>>,<<,| Groupement de commandes ;, &, &&, ||, (…), {…} Divers 2013-2014 :, #,$,’…’,~ Pr. M.D. El Kettani 102 51 23/02/2015 Fonctionnement en interactif Exercices Affichez la liste des fichiers du répertoire /usr/bin dont le nom est composé d’au moins 3 caractères, le premier parmi les lettres a, s et t, le 3ème compris entre a et f Afficher de 3 facons différentes le message suivant: Les caractères " et ' sont des délimiteurs de chaînes de caractères. En utilisant les redirections, créez un fichier de nom mon_an.naiss contenant le texte: Le calendrier de mon année de naissance Ajoutez au fichier mon_an.naiss le calendrier de votre année de naissance. Envoyez le contenu du fichier mon_an.naiss dans votre boîte aux lettres. Réalisez la même opération que dans l’exercice précédent, avec une autre syntaxe. 2013-2014 Dans l’arborescence des utilisateurs (/home par exemple), affichez les noms de tous les fichiers dont vous êtes propriétaire, en éliminant l’affichage d’éventuels messages d’erreur.Pr. M.D. El Kettani 103 Construction de scripts portables Plan Introduction Code de retour Programmation des choix &&, ||, if, case Boucles while, until et for Instructions liées aux boucles break, continue Chaînes de caractères 104 52 23/02/2015 Construction de scripts portables Introduction Familles de commandes avancées: Sélection Aiguillage Itération Rupture de boucle Commande de test 105 Construction de scripts portables Le code retour $ ( echo OK ; exit 0 ) OK $ echo $? 0 $ ( echo ERREUR ; exit 1 ) ERREUR $ echo $? 1 $ ! ( echo inversion du code retour ; exit 2 ) inversion du code retour $ echo $? 0 106 53 23/02/2015 Construction de scripts portables Programmation des choix Sélection Syntaxe : Condition simple: if then ... fi if commande ; then liste de commandes fi Condition avec alternative: if then ... else ... fi if commande ; then liste de commandes else liste de commandes fi 107 Construction de scripts portables Programmation des choix Sélection Syntaxe : Condition multiple: if then ... elif then ... fi if commande ; then liste de commandes elif commande ; then liste de commandes else liste de commandes fi 108 54 23/02/2015 Construction de scripts portables Programmation des choix Sélection Syntaxe : Conditions multiples: if [ condition1 ]||[ condition2 ] then ... else … fi if [ condition1 –o condition2 ] then ... else … fi if [ condition1 ] && [ condition2 ] then ... else … fi if [ condition1 –a condition2 ] then ... else … fi 109 Construction de scripts portables Programmation des choix Exemple: if then cmp $1 $2 echo fichiers echo identiques else echo fichiers echo différents fi 110 55 23/02/2015 Construction de scripts portables Programmation des choix Exercice: quelle est la sortie de l’exécution de la séquence suivante? $ if grep ali /etc/passwd ; then > echo "Ali possède un compte utilisateur dans ce système" > fi $ ls f? f1 f2 $ cat f1 Bonjour $ cat f2 Bonjour $ if cmp f1 f2 > then > echo "Les fichiers f1 et f2 sont identiques" > echo "Suppression du fichier f2" > rm f2 > fi $ ls f? 111 Construction de scripts portables Programmation des choix Exercice: quelle est la sortie de l’exécution de la séquence suivante? $ if grep ali /etc/passwd ; then > echo "Ali possède un compte utilisateur dans ce système" > fi Ali:x:501:Ali ALI:/home/ali:/bin/bash Ali possède un compte utilisateur dans ce système $ ls f? f1 f2 $ cat f1 Bonjour $ cat f2 Bonjour $ if cmp f1 f2 > then > echo "Les fichiers f1 et f2 sont identiques" > echo "Suppression du fichier f2" > rm f2 > fi Les fichiers f1 et f2 sont identiques Suppression du fichier f2 $ ls f? f1 112 56 23/02/2015 Construction de scripts portables L’alternative avec les opérateurs && et || Syntaxe: cmd1 && cmd2 if cmd1 ; then cmd2 ; fi cmd1 || cmd2 if cmd1 ; then : else cmd2 ; fi 113 Construction de scripts portables L’alternative avec les opérateurs && et || Exemples: cmd1 && cmd2 if cmd1 ; then cmd2 ; fi cmd1 || cmd2 if cmd1 ; then : else cmd2 ; fi 114 57 23/02/2015 Construction de scripts portables L’alternative avec les opérateurs && et || Exemples: $ ls f1 f2 exercices $ ls newrep ls: newrep not found $ ls newrep || mkdir newrep ls: newrep not found $ ls -ld newrep drwxr-xr-x 2 ali ali 512 déc 12 12:22 newrep $ ls f1 || echo "Fichier f1 inexistant" $ $ ls f1 >/dev/null && echo "Fichier f1 existe" Fichier f1 existe $ ls fnonexiste 2>/dev/null || echo "Fichier inexistant" $ 115 Construction de scripts portables La commande test Syntaxe de la commande test (utilisée avec if): • if test option • if [ option ] ; then … fi ; then … fi Principales options (test sur les attributs de fichiers): test -b fichier, test -c fichier, test -d fichier, test -e fichier, test -f fichier, test -L fichier, test -r fichier, test -s fichier, test -w fichier, test -x fichier Exemple : if [ ! -d repert ]; then mkdir repert ; fi Principales options (comparaison de chaines de caractères): -z chaine (chaine nulle) chaine1 = chaine2 -n chaine (chaine non nulle) chaine1 != chaine2 Comparaisons alphanumériques test "$str1" = "chaine1" test "$str1" > "chaine1" test "$str1" >= "chaine1" test "$str1" != "chaine1" test "$str1" < "chaine1" test "$str1" <= "chaine1" 116 58 23/02/2015 Construction de scripts portables La commande test Comparaisons algébriques -eq : Exemple: $? -eq 0 -ne -gt -lt -ge -le Opérateurs booléens ! -a : -o : Syntaxe: Expr.Logique1 –a Expr.Logique2 (and) Syntaxe: Expr.Logique1 –o Expr.Logique2 (or) 117 Construction de scripts portables La commande test Exemple: $ test –r $HOME/.profile # [ -r $HOME/.profile ] $ echo $? 0 $ grep ali /etc/passwd $ if [ $? –eq 0 ] then echo "Ali possède un compte sur ce système" fi $ cat > test_rep # vérifie si le premier argument est un répertoire if [ -d "$1" ] then echo "$1 est un répertoire" fi echo "Suite du programme" ^D $ chmod u+x test_rep $ ./test_rep /etc /etc est un répertoire Suite du programme $ test_rep /bin/ls Suite du programme $ cat > reponse echo "Saisissez votre nom: \c" read nom if [ "$nom" != "" ] then echo "Bienvenue Mme ou Mr $nom" else echo "Vous n’avez rien saisi" fi $ chmod u+x reponse $ reponse Saisissez votre nom: Ali Bienvenue Madame ou Monsieur Ali $ reponse Saisissez votre nom: Vous n’avez rien saisi 118 59 23/02/2015 Construction de scripts portables Aiguillage Aiguillage: case in … esac Syntaxe: case $variable in motif1) liste de commandes ;; [motif2) liste de commandes ;; …] *) liste de commandes ;; esac Exemple : case $# in 1) arg1=$1;; 2) arg1=$1; arg2=$2 ;; 0) echo "usage: $0 arg1 [ arg2 ] exit 1;; esac 119 Construction de scripts portables Aiguillage Exercice: que fait le script suivant? $ cat > supprime echo "Voulez-vous supprimer le fichier FICHIER?" read reponse case "$reponse" in O*|o* ) rm FICHIER echo "le fichier FICHIER est supprimé" ;; N*|n* ) echo "le fichier FICHIER n’est pas supprimé" ;; * ) echo "réponse incorrecte" ;; esac 120 60 23/02/2015 Construction de scripts portables Itération Itération: Boucle while do ... done Syntaxe: while commande do liste de commandes done Exemple: while [ ! –f fic ] do sleep 10 done echo fichier existe 121 Construction de scripts portables Aiguillage Exercice: que fait le script suivant? $ cat > trouve_mot # Boucle tant qu’on ne saisi pas le mot fin echo "Entrez un mot: \c" read mot while [ "$mot" != "fin" ] do echo "Ce n’est pas le bon mot!" echo "Entrez un mot: \c" read mot done echo "Vous avez trouvé, Bravo!!!!" ^D 122 61 23/02/2015 Construction de scripts portables Itération Itération: Boucle until do ... done Syntaxe: until commande do l iste de commandes done Exemple: until [ –f fic ] do sleep 10 done echo fichier existe 123 Construction de scripts portables Aiguillage Exercice: que fait le script suivant? $ cat > trouve_mot # Boucle tant qu’on ne saisi pas le mot fin echo "Entrez un mot: \c" read mot until [ "$mot" = "fin" ] do echo "Ce n’est pas le bon mot!" echo "Entrez un mot: \c" read mot done echo "Vous avez trouvé, Bravo!!!!" ^D 124 62 23/02/2015 Construction de scripts portables Itération Itération: Boucle for do ... done Syntaxe: for var [ in ListeDeValeurs ] do liste; done Exemple: for var in do un deux trois echo "var = $var" done Exercice: récrire l’exemple précédent en utilisant la boucle for ((..)) 125 Construction de scripts portables Les sauts inconditionnels Instructions de rupture de boucle Sortie de boucle : break [n] sortir d'une ou n boucles for, while, until donne le contrôle à la commande qui suit done n = niveau de boucle à partir de la boucle la plus externe continuation de boucle: continue [n] interrompt exécution commande boucle for, while, until donne le contrôle au début de la boucle n = niveau de boucle à partir de la boucle la plus externe Break et continue doivent être conditionnées par if ou commandée par && ou || 126 63 23/02/2015 Construction de scripts portables Les sauts inconditionnels Instructions de rupture de boucle Syntaxe : while … ; do … if …; then continue fi if …; then break fi … done … Syntaxe: for var1 in ${liste1} do for var2 in ${liste2} do if cmd2 ; then continue 2 fi done done Sortie de programme: exit n sortir d'un script-shell avec un code de retour (n) 127 Construction de scripts portables Les sauts inconditionnels Instructions de rupture de boucle Exemple: Quelle est la sortie du script suivant? #!/bin/bash liste1="a b c d e f" liste2="1 2 3 4 5 6" for var1 in ${liste1} do echo $var1 for var2 in ${liste2} do echo $var2 echo -n "voulez-vous continuer ? (Oui/Non) " read a if [ $a = Oui ] then continue 2 fi echo "fin var2" done echo "fin var1" done 128 64 23/02/2015 Construction de scripts portables Les sauts inconditionnels Exercice: que fait le script suivant? $ cat > cree_fic3 # ignore les lignes blanches while : do echo "Entrez une ligne d’au moins un caractère <fin> = quitter : \c" read ligne if [ -z $ligne ] then continue # n’enregistre pas les lignes blanches fi if [ $ligne = "fin" ] then break fi echo "$ligne" >> fic.lig3 done 129 ^D Construction de scripts portables Exercices Écrire un Shell script UNIX ‘datef’, qui donne la date en français Écrire un Shell script UNIX ‘ou_suis_je’, qui vous indique si vous vous trouvez dans votre répertoire de travail par défaut ou pas Écrire un Shell script UNIX ‘modfi’, qui prend un nom de fichier en entrée (au clavier), et répond s’il peut être lu, écrit, ou exécuté (envisager les messages d’erreur) Ecrire un shell script Unix qui prend un nom de fichier en argument et repond s'il peut etre lu, ecrit, execute. Il verifie si le fichier en question existe ou pas. Le shell script affiche un message d'erreur si mauvaise utilisation de modfi Reprendre l’exercice précédent en respectant la syntaxe suivante, qui permet de passer en revue deux arguments : syntaxe : modfi2 [repertoire] fichier 130 65 23/02/2015 Construction de scripts portables Exercices Écrire un Shell script UNIX ‘taille’, qui affiche la liste des répertoires contenus dans un répertoire saisi en paramètre, ainsi que leur taille en ko : en changeant de répertoire sans changer de répertoire Écrire un Shell script qui affiche le type d’un fichier, dont le nom est saisi au clavier, qui demande si l’on veut continuer et ne s’arrête que lorsque l’on répond « non » ou « NON » Modifiez l’exercice précédent afin qu’il ne traite pas les fichiers qui ne sont pas accessibles en lecture ou qui sont des répertoires Écrire un script qui affiche les processus d’un utilisateur dont le nom est passé en argument, et qui en l’absence de ce dernier, affiche la syntaxe d’appel et renvoie 2 comme code de retour Écrire un script qui demande la saisie du nom d’un interpréteur UNIX (choix limité à sh, csh, ksh, rsh, rksh et bash), et qui affiche son nom 131 complet (shell bourne, Korn shell, etc.) Construction de scripts portables Exercices Écrire un shell script qui lance l’exécution d’un script dont le nom est passé en paramètre, que ce dernier ait l’attribut d’exécution (droit x), ou pas Ecrire un shell script nbl affichant à partir d’un répertoire lu en argument, la liste de tous les liens ordinaires liés à un fichier dont le nom est lu en argument. Ecrire un shell script nbl affichant à partir d’un répertoire lu en argument, la liste de tous les liens symboliques liés à un fichier dont le nom est lu en argument. Ecrire une commande arbre qui liste soit tous les fichiers, soit seulement les répertoires (avec l’option –d) du sous-arbre ayant pour racine le répertoire spécifié, ou par défaut, le répertoire courant. Ecrire un shell script Unix effacant tous les fichiers du répertoire courant sauf 1 dont le nom est lu en argument. 132 66 23/02/2015 Construction de scripts portables Exercices Ecrire une commande shell permettant de renommer une liste de fichiers du répertoire de travail, en obéissant aux conditions suivantes: On supposera que les références des fichiers à changer sont données en paramètre de la commande, et plus précisément sont tous les paramètres à partir du second. Les nouvelles références seront obtenues à partir du préfixe commun donné en premier argument, le suffixe étant constitué par un entier entre 1 et n, si n est le nombre de fichiers à renommer. Exemple : rename f g h i j va renommer g en f1, h en f2, i en f3 et j en f4. On veillera à ce que la commande ne renomme que les fichiers ordinaires. On veillera par ailleurs que si la commande n’a qu’un seul paramètre, tout le répertoire de travail est traité. Enfin, on supposera qu’aucun nouveau nom ne correspond à un lien existant dans le répertoire de travail. 133 Construction de scripts portables Exercices Ecrire une commande shell appelable soit sans arguments, soit avec 3 arguments, et telle que, appelée sans argument, elle réalise la lecture au clavier de 3 chaînes de caractères. Disposant alors dans tous les cas de trois chaînes, elle indique si les trois chaînes sont identiques, ou si elles sont toues différentes par un message sur la sortie standard. Le code de retour de la commande est égal à 0 si les trois chaînes sont égales, 1 2 ou 3 selon que la chaîne en ième position est différente des deux autres, 4 si les trois chaînes sont différentes, et 5 si le nombre de paramètres est incorrect. 134 67 23/02/2015 Mécanismes complémentaires Plan Chaines de caractères: Manipulations de chaînes (expr) Expressions de variables Extraction de chaînes Expressions spécifiques du Korn Shell Commandes dirname, basename Arithmétique: Commande expr Arithmétique en ksh La commande bc 135 Mécanismes complémentaires Les chaînes de caractères expr: manipulation de chaînes Calcul de la longueur d’une chaîne expr chaîne: ".*" Exemple: $ expr "bonjour" : ".*" 7 Extraction d’une sous-chaîne \(…\) Exemple: $ temps="Il fait beau" $ expr "$temps" : "\(..\)" Il $ expr "$temps" : ".*\(….\)" beau $ chemin=/usr/bin/ls $ expr "$chemin" : ".*/\(.*\)" ls $ expr "$chemin" : "\(.*\)/" /usr/bin 136 68 23/02/2015 Mécanismes complémentaires Les chaînes de caractères Expressions de variables: var: chaine de caractères str : modèle de chaîne Syntaxe: variable=${#var} : longueur en octet de la chaîne var Suppression en début d’une chaîne: variable=${var#str} variable=${var##str} : supprime en début de var la + petite des 2 chaînes : supprime en début de var la + grande des 2 chaînes Suppression en fin d’une chaîne: variable=${var%str} : supprime en fin de var la + petite des 2 chaînes variable=${var%%str} : supprime en fin de var la + grande des 2 chaînes 137 Mécanismes complémentaires Les chaînes de caractères Expressions de variables: Exemples: $ fic=/usr/local/bin/emacs $ echo ${fic##/*/} emacs $ echo ${fic#/*/} local/bin/emacs $ echo ${fic%/*} /usr/local/bin $ echo ${fic%%/*} $ $ fic=/usr/local/bin/emacs $ user=`grep ali /etc/passwd` emacs $ echo $user ali:501:501:Ali Benbrahim:/home/ali:/bin/bash $ echo ${fic##/*/} emacs $ echo ${user%%:*:} ali $ echo ${fic#/*/} local/bin/emacs 138 69 23/02/2015 Mécanismes complémentaires Les chaînes de caractères Extractions de chaînes avec typeset (ksh): Extraction de la partie gauche d’une chaîne Syntaxe: typeset –Lnbcar chaine (nb_car caractères éliminés à gauche) $ typeset –L4 A=abcdefgh $ echo $A abcd Extraction de la partie gauche, on saute les blancs Syntaxe: typeset –LZnbcar chaine $ typeset –LZ3 A=" $ echo $A abc (nb_car car. éliminés à gauche + sauter les blancs) abcdefgh" Extraction de la partie droite d’une chaîne Syntaxe: typeset –Rnbcar chaine (nb_car caractères éliminés à droite) $ typeset –R4 A=abcdefgh $ echo $A efgh 139 Mécanismes complémentaires Les chaînes de caractères Commandes basename et dirname: Syntaxe: basename chemin [suffixe] dirname chemin Exemples: $ ediiteur=/usr/local/bin/vi $ nom_fic=`basename $editeur` $ rep=`dirname $editeur` $ echo "Repertoire: $rep\nNom de fichier: $nom_fic" Répertoire:/usr/local/bin Nom de fichier: vi $ basename /home/ali/prog.c # l’extension .c n’est pas supprimée prog.c $ basename /home/ali/prog.c .c # supprime aussi l’extension .c prog 140 70 23/02/2015 Mécanismes complémentaires Les chaînes de caractères Quelques astuces: Concaténation de chaînes $ A=bon $ B=$(A)jour Utilisation de commandes sed, grep et cut $ uid=$(id | sed 's/^[^=]*=//' | sed 's/(.*//') $ root=$(grep '^root' /etc/passwd | cut –f3 –d:) Élimination d’une répétition d’espaces dans la sortie d’une commande $ who | tr –s " " | cut –d " " –f2 # affiche les terminaux Utilisation des paramètres positionnels $ A=$(grep '^root' /etc/passwd) $ ( IFS=: ; set $A; echo $3) 0 141 Mécanismes complémentaires Les chaînes de caractères Exercices: Afficher le nombre de caractères de la chaîne contenue dans votre variable PATH Créer dans votre répertoire de connexion un sous-répertoire de nom bin et rajoutez ce dernier à votre variable PATH (en dernière position) En utilisant les expressions régulières, extrayez le dernier chemin de la liste de chemins stockée dans la variable PATH Traitez l’exercice précédent avec une solution spécifique au Korn shell (autre que les expessions régulières) Écrivez un scripte qui doit être exécuté par un Korn shell, et qui demande la saisie d’une chaîne comportant au maximum huit caractères; le cas échéant le script doit éliminer les caractères en trop et ne garder que les huits premiers. 142 71 23/02/2015 Mécanismes complémentaires Arithmétique Arithmétique Commande Unix expr expr val1 oper val2 opérations : +, -, *, /, % utilisation : substitution de commande en sh peu performant : nécessite un fork()-exec() Commande Shell (ksh, bash, zsh) $[expression] interne au shell -> performant 143 Mécanismes complémentaires Arithmétique Expression () + / > >= == ~ % bit parenthèse pour forcer une évaluation addition soustraction division * multiplication supérieur < inférieur supérieur <= inférieur égalité != inégalité complément à 1 ! complément logique modulo ^ disjonction exclusive bit à >> & && décalage à droite conjonction bit à bit conjonction << | || décalage à gauche disjonction bit à bit disjonction 144 72 23/02/2015 Mécanismes complémentaires Arithmétique Arithmétique Exemple: $ expr 3 + 2 5 $ expr 2 \* 5 10 $ a=3 $ a=$(expr $a + 1) $ echo $a 4 +,-,*,/,% =,<,<=,>,>=,!=, |,& 145 Mécanismes complémentaires Arithmétique Arithmétique (ksh) Exemple: $ integer a b c=5 $ ((a=32)) $ let b=a+1 $ print $a, $b 32,33 $ let a='c<<2' $ let b='2#101' c='16#FF' $ print "$b, $c" 5,255 $ echo $a 20 +,-,*,/,% <<,>>, <,<=,>,>=,==,!=, |,&&, || ,^ 146 73 23/02/2015 Mécanismes complémentaires Arithmétique Arithmétique: les boucles Avec expr: #!/bin/sh I=0 while [ "$I" –lt 5 ]; do echo bonjour I=$(expr $I + 1) done En Ksh #!/bin/ksh Integer I I =0 while ((I<<5)) ; do echo bonjour let I=I+1 147 done Mécanismes complémentaires Arithmétique La commande bc: Avec expr: $ bc 3.4 + 2 5.4 x=2 3+x 5 quit $ echo 3+4 | bc 148 74 23/02/2015 Mécanismes complémentaires Application La commande ‘pers_env’ Écrire un shell-script ‘pers_env’ qui personnalise la commande ‘env’. Lancer l’exécution de ‘pers_env’ comme une commande (chmod u+x pers_env)et(#!/bin/bash) Exemple: % pers_env Je suis l ’utilisateur ali Je suis dans le répertoire /etc Mon répertoire de travail par défaut est: /home/ali 149 Mécanismes complémentaires Arithmétique Exercices: À l’aide de la commande expr, calculer l’expression suivante: (5-2)*(6+1) Utiliser la commande bc pour calculer la surface d’un cercle qui fait 2.5cm de rayon Écrire un script qui convertit en mn et sec un temps exprimé en seconde (le temps est passé en paramètre) Écrire un script qui affiche les paramètres recus, chacun précédé de son numéro d’ordre Écrire un script qui affiche les n premiers nombres, n lui étant passé en paramètre 150 75 23/02/2015 Mécanismes complémentaires Arithmétique Exercices: Écrire un Shell script UNIX ‘indice’, qui affiche l’indice d’une variable dans un tableau saisi en argument Écrire un Shell script UNIX ‘rep’, qui affiche le nombre et la liste des répertoires qui se trouve dans le répertoire courant Ecrire un shell script UNIX qui affiche le nombre et la liste des répertoires qui se trouvent dans le répertoire courant. Etendre le shell script de manière à effectuer un traitement similaire dans un répertoire lu en argument. 151 Extensions du Korn shell et Bash Plan (alias et fonction) Alias Alias particuliers Sous programmes sous forme de script Sous programmes sous forme de fonction Échange de données Les bibliothèques de fonctions (ksh) Exercices 152 76 23/02/2015 Extensions du Korn shell et Bash Généralités sur les alias (ksh) Alias Création d’un alias: alias dir=‘ls –lba’ Utilisation d’un alias dir Liste des alias alias Suppression d’un alias unalias dir 153 Extensions du Korn shell et Bash Généralités sur les alias (ksh) Alias particuliers (ksh) Tracked alias (obsolète) alias –t date Remplacement de commandes alias ls ls -la Alias exporté (obsolète) alias –x bye=exit 154 77 23/02/2015 Extensions du Korn shell et Bash Généralités sur les alias (ksh) Alias Exemple1: Vérifier que l’alias lR n’existe pas Créer un alias lR correspondant à la commande ls –R Vérifier la création de l’alias et l’utiliser Supprimer l’alias lR Rendre l’alias permanent pour toute session créée Exemple 2: Forcer le mode intéractif de la commande rm Forcer à utiliser la commande rm au lieu de l’alias 155 Extensions du Korn shell et Bash Sous programme sous forme de script Script: $ more programme #!/bin/sh echo "Début du programme" sous_programme echo "Fin du programme" $ more sous_programme #!/bin/bash echo "---------------sous-programme--------------" echo "---------------fin ss-programme-------------" 156 78 23/02/2015 Extensions du Korn shell et Bash Sous programme sous forme de script Script: Script: Exemple: Exemple: #!/bin/bash #!/bin/bash écrire écrire unun script script permettant permettant dede réaliser réaliser unun menu, menu, # creation # suppression echo -n nom fichier: composé composé dede 3 options: 3 options: echo -n nom fichier: read nom read nom 1) 1) créer créer unun fichier fichier echo création en cours... echo suppression en cours... sleep 3 2) 2) supprimer supprimer unun fichier fichier sleep 3 touch $nom 2>> erreur rm $nom 2>> erreur 3) 3) quitter quitter if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then echo et $nom créé LesLes opérations opérations dede création création et de de suppression suppression seront echo $nom seront supprimé else else placées placées dans dans desdes scripts scripts à part, à part, enen tenant tenant compte compte des echo $nom non créé echo $nom non supprimé fi conviviales. conditions des conditions d’exécution d’exécution conviviales. fi #!/bin/bash # menu clear while : do echo " 1) Création d'un fihcier" echo " 2) Suppression d'un fichier" echo " 3) Quitter" read choix case $choix in 1) bash creation;; 2) bash suppression;; 3) exit 3;; *) echo choix incorrect; sleep 5;; esac done sleep 3 sleep 3 157 Extensions du Korn shell et Bash Sous programme sous forme de fonction Fonction Syntaxe: [function] nom() {.........} appel de fonction: nom [arg ...] pas de déclaration d'arguments entre parenthèses () les fonctions doivent être définies avant leur utilisation Exemple: #!/bin/sh usage() { echo "usage: $1 $2" ; } main() { if [ $# -ne 1 ]; then usage `basename $0` "fichier"; exit 1; fi ; } main $* 158 79 23/02/2015 Extensions du Korn shell et Bash Sous programme sous forme de fonction Fonction $ more programme #!/bin/bash sous_programme() { echo "---------------sous-programme--------------" echo "------------------------fin-----------------------« } echo "Début du programme" sous_programme echo "Fin du programme" 159 Extensions du Korn shell et Bash Sous programme sous forme de fonction Fonction Exemple: 1- Créer une fonction llr(), relative à la commande ls –lR 2- Créer une fonction trouve(), qui retourne la référence absolue d’une commande lue en argument 3- Supprimer la fonction trouve() 4- Ecrire un shell script qui contient 2 fonctions lire_ligne() et ecrire_ligne(), qui sont appelées successivement pour lire puis afficher une ligne saisie en argument, jusqu’à lecture de la chaine « fin » 160 80 23/02/2015 Extensions du Korn shell et Bash Échange de données Échange de données Scripts Fonctions Les arguments d’appels (in) Les fichiers (in/out) L’environnement (in) L’ensemble des variables (in/out) La valeur retournée par exit (out) La valeur retournée par return (out) 161 Extensions du Korn shell et Bash Bibliothèques de fonctions (ksh) Bibliothèques de fonctions $ more ~/fonctions/f1 f1() { echo Fonction f1 } $ chmod u+x ~/fonctions/f1 $ FPATH=~/fonctions; export FPATH $ more programme #!/bin/ksh echo "Début du programme" f1 echo "Fin du programme" 162 81 23/02/2015 Extensions du Korn shell et Bash Bibliothèques de fonctions (ksh) Bibliothèques de fonctions Exemples: 163 Extensions du Korn shell et Bash Exercices Créer une nouvelle commande de nom heure, qui affiche l’heure au format HH:MM:SS Créez une nouvelle commande de nom attrib_dir, qui affiche les attributs d’un répertoire Comment forcer le shell à utiliser l’implémentation POSIX de la commande echo à chaque fois que cette dernière est lancée Comment rendre les alias créés précédemmnt accessibles à tous les scripts lancés dans cette sessions Comment rendre permanents les alias précédents, pour tous les shells intéractifs (ceux qui n’exécutent pas de scripts et affichent une invite) lancés au cous des sessions? 164 82 23/02/2015 Extensions du Korn shell et Bash Exercices Créez une fonction qui convertit le contenu d’un fichier de minuscules en majuscules Écrivez un script modulaire qui appelle des fonctions de gestion de répertoires à partir du menu suivant: Afficher les attributs du répertoire Lister les fichiers du répertoire Créer un répertoire Supprimer un répertoire Quitter Toutes les fonctions devront vérifier l’existence ou non du répertoire avant de s’exécuter 165 Automatisation avec les shell-scripts La programmation multitâche en shell Panorama des commandes de gestion de ps: cmd& ps kill wait nice nohup at crontab 166 83 23/02/2015 Automatisation avec les shell-scripts La programmation multitâche en shell La programmation parallèle en shell Exécution séquentielle (avant plan) Exécution parallèle (arrière plan) Syntaxe d’exécution en arrière plan: cmd & Exemple: #!/bin/bash cal who ls –lR / & find / -print & wait date 167 La programmation du shell La programmation multitâche en shell Regroupement de commandes: Exécutées par le shell en cours: {cmd; …; cmd;} Exécutées par un shell fils: (cmd; …; cmd;) Exemple: Bloc exécuté par le shell en cours: { date; ps } > taches.log [ -d rep ] && { cd rep; mkdir rep/sousrep } Bloc exécuté par un shell fils: ( cd /tmp; … ); pwd Code de retour d’un bloc: celui de la dernière cmd168 84 23/02/2015 La programmation du shell La programmation multitâche en shell Les variables $ et ! : $ désigne le shell courant (pid du processus) permet de tuer tous les ps lancés par le script ! désigne le pid de la dernière tâche en arrière plan Exemple: #!/bin/bash ( sleep 10; kill $$; echo suite )& echo "heure de départ ?\c" ; read heure; kill $! echo "ps –ef > liste" | at $heure 169 La programmation du shell La programmation multitâche en shell Les variables $ et ! : Exemple: #!/bin/bash # script lance une tâche en arrière plan, # qu’il tue au bout de dix secondes. ( while : do sleep 4 echo bonjour >> fic.bon done )& sleep 10 kill $! 170 85 23/02/2015 La programmation du shell La programmation multitâche en shell Déroutements: Séquence d'exception: Syntaxe: trap 'liste de commandes'liste de signaux Exemple : trap 'rm /tmp/appl.$$; exit 1' 2 Ignorance des signaux : Syntaxe: trap '' liste de signaux Exemple : trap '' 1 2 3 15 Réinitialisation Syntaxe: trap liste de signaux Exemple : trap 2 3 Liste des signaux Syntaxe: trap Exemple : trap 171 La programmation du shell La programmation multitâche en shell La gestion des signaux: trap et kill Exemple: $ more programme #!/bin/sh trap "" INT trap "echo recu" HUP trap "echo FIN; exit" TERM while : do sleep 10 echo je boucle done $ programme & [1] 215 $ je boucle je boucle je boucle kill –INT 215 $ je boucle kill –HUP 215 $ recu je boucle $ kill –TERM 215 $ FIN Terminated 172 86 23/02/2015 La programmation du shell La programmation multitâche en shell Les groupes de processus Exemple: for v in un deux trois do ( while : ; do sleep 5 echo $v done )& done sleep 20 kill –TERM -$$ 173 La programmation du shell La programmation multitâche en shell L’échange de données par tube nommé Exemple: $ more p1 #!/bin/sh exec > tube while read var do echo $var done $ more p2 #!/bin/sh exec < tube while read line do echo ">$line" done $ mknod tube p $ p2 & $ p1 bonjour > bonjour 174 87 23/02/2015 La programmation du shell La programmation multitâche en shell Les verrous Exemple: #!/bin/sh if mkdir ~/verrou 2> /dev/null then echo "== entre en section critique ==" sleep 10 echo " == sort de la section critique ==" rmdir ~/verrou else echo " erreur: impossible d’entrer \c" echo " en section critique" fi 175 La programmation du shell La programmation multitâche en shell Les coprocessus: En korn shell: Connecter les E/S std d’un processus fils lancé en arrière plan Syntaxe: cmd |& read –p var… print –p expression_chaine … exec > &176 88 23/02/2015 La programmation du shell La programmation multitâche en shell Les coprocessus: En korn shell: Exemple: #!/bin/ksh who |& while read –p nom term le_reste do echo "nom: $nom, $term" done 177 La programmation du shell La programmation multitâche en shell La gestion des travaux en Korn shell: Exemple: $ sleep 200 Ctrl-z [1] + Stopped sleep 200 $ sleep 300& [2] 478 $ jobs # liste des travaux [2] + Running sleep 300 & [1] - Stopped sleep 200 $ kill %2 # met fin à une tâche [2] + Terminated sleep 300 & $ bg %1 # met une tâche en arrière plan [1] sleep 200 $ fg %1 # met une tâche en avant plan sleep 200 178 89 23/02/2015 La programmation du shell La programmation multitâche en shell Exercices: Écrire un script de nom scrute_util, qui vérifie pendant 10mn (en arrière plan), si un utilisateur est connecté, et qui affiche un message et se termine, si ce dernier est connecté. Écrire un script qui redirige vers un fichier les sorties d’un ensemble de commandes avec le caractère « > » (n’utilisez pas « >> »), et qui ensuite affiche le contneu du fichier Écrire un script qui lance les commandes date et ps en arruère plan toutes les cinq secondes, et qui les tue au bout de vingt secondes Écrire un script qui affiche « bonjour » toutes les 10 secondes, et qui s’arrête et affiche « au revoir » quand on frappe « ^C » 179 La programmation du shell La programmation multitâche en shell Exercices: Reprendre l’exercice précédent en le modifiant de facon à ce que l’on ne puisse l’arrêter qu’en lui envoyant le signal 9. penser à l’exécuter en arrière plan. Créer un tube nommé « le_tube », en exécutant la commande « mknod le_tube p », et écrire deux scripts, qui échangent des données à travers le tube nommé « le_tube ». Le premier envoie un message au deuxième, qui l’affiche à l’écran. L’exécution prend fin quand le récepteur recoit le message « fin ». Écrire un script qui utilise un verrou pour gérer les accès concurrents à une ressource, ici l’écran, où le script affiche un message dans une boucle de programme. On exécute en arrière plan deux instances du script. Ils seront tués par l’envoi du signal 9. Il faut prévoir une attente (sleep 10) immédiatement après l’affichage du message pour vérifier visuellement la bonne synchronisation d’accès à l’écran. 180 90 23/02/2015 Les filtres Plan Définition Filtre comm Filtre diff Filtre grep/egrep Filtre sed Filtre ed Filtre cut 181 Les filtres Définition Commandes qui : acceptent des données de l’entrée standard effectuent transformations sur ces données dirigent ces données vers la sortie standard affichent leurs messages d’erreur vers la sortie erreur standard Sortie standard Entrée standard Données Filtre UNIX (commande) Données transformées 182 91 23/02/2015 Les filtres Filtre « comm » Définition: Compare le contenu de 2 ensembles de données L’un des 2 ensembles peut provenir de l’entrée std Syntaxe: comm [options] fichier1 fichier2 -1 N’affiche pas la 1ère colonne (lignes présentes uniquement dans le fichier1) -2 N’affiche pas la 2ème colonne (lignes présentes uniquement dans fichier2) -3 N’affiche pas la 3ème colonne (lignes présentes dans les deux fichiers) Statut de sortie: 0 pour indiquer qu’il n’y a pas eu d’erreur; >0 pour indiquer qu’une erreur est rencontrée. 183 Les filtres Filtre « comm » Remarque: Si le nom de l’un des fichiers est le caractère - alors son contenu est lu de l ’entrée standard. Exemple: Fichier 1 Fichier 2 Je suis venu vous voir Je suis venu vous voir Nous sommes le Vendredi Nous sommes le Vendredi. Quelle heure est-il? Quelle heure est-il? Au revoir Au revoir et à bientôt 184 92 23/02/2015 Les filtres Filtre « comm » $ comm fichier1 fichier2 Je suis venu vous voir Nous sommes le Vendredi. Nous sommes le Vendredi Quelle heure est-il? Au revoir et à bientôt Au revoir Colonne 1 Colonne 2 Colonne 3 185 Les filtres Filtre « diff » Définition: donne les différences entre 2 ensembles de données accepte des noms de répertoire Syntaxe: diff diff diff diff [options] [options] [options] [options] fichier1 fichier2 fichier1 répertoire répertoire fichier1 répertoire1 répertoire2 -b Ignorer les blancs (Espace et Tab) à la fin d’une ligne -c[n] Afficher le contexte où les lignes différentes ont été trouvées Statut de sortie: 0 Pas de différence rencontrée 1 Des différences ont été relevées >1 Une erreur est rencontrée 186 93 23/02/2015 Les filtres Filtre « grep » Définition: Trouve des caractères dans un ensemble de données Chaîne de caractères recherchée décrite par regex Synopsis: egrep [options] [-e expr] [expression] [-f fich] [fichiers …] -b Afficher au début de chaque ligne trouvée, n° de bloc sur disque -c Afficher uniquement le nombre de lignes contenant la chaîne -h N’afficher pas les noms de fichier -i Ne pas faire de distinction entre les majuscules et les minuscules -s Aucune sortie sauf les messages d’erreur -e Nécessaire pour les expressions régulières commençant par un tiret -f fich Expression régulière est contenue dans le fichier fich 187 Les filtres Filtre « grep » Statut de sortie: 0 la chaîne est trouvée 1 la chaîne n’est pas trouvée 2 erreur(s) rencontrée(s) Remarque: Par défaut, les lignes trouvées sont envoyées à la sortie standard. 188 94 23/02/2015 Les filtres Filtre « grep » Exemple: centi 4> ypcat passwd | egrep ':Pierre.*' parp2808:cRuT6m7jPRJWM:30502:112: Pierre Parent:/export/home/exa/email/parp2808:/ Parent bin/csh doup2609:S3i0oM68.AuVQ:30251:112: Pierre Doucet:/export/home/exa/email/doup2609:/ Doucet bin/csh robcad22:Z.VGpH9oanp3M:11423:114:Pierre St-Denis:/usr/people/exa/robcad/robcad22 :/bin/csh gaup2806:8fZaJLAA4ybOY:30848:112: Pierre-Luc Gauthier:/export/home/exa/email/gaup 2806:/bin/csh dupp0911:LBXJgdV.Zl8lg:30267:112:Pierre Duplessis:/export/home/exa/email/dupp091 1:/bin/csh gerp1209:JLiqJTddvRdJY:30307:112:Pierre Hugues Gervaud:/export/home/exa/email/ge rp1209:/bin/csh gefp0904:zHizZC2VwOjlQ:30304:112:Pierre Olivier Geffroy:/export/home/exa/email/g efp0904:/bin/csh boup0806:aX.t0b2BGmZcM:30804:112: Pierre-Etienne Bouchard:/export/home/exa/email/ boup0806:/bin/csh grop2001:jzWiOWxd.2iPQ:30966:112:Pierre Grondin:/export/home/exa/email/grop2001: /bin/csh duvp0101:4jttBQNX/rHcg:30271:112: Pierre-Yves Duval:/export/home/exa/email/duvp01 01:/bin/csh habp0410:ytzP1NEqscex2:30857:112:Pierre-Luc Habel:/export/home/exa/email/habp041 0:/bin/csh : : : 189 Les filtres Filtre « grep » Exemple: centi 5> ypcat passwd | egrep ':Pierre .*' parp2808:cRuT6m7jPRJWM:30502:112:Pierre bin/csh doup2609:S3i0oM68.AuVQ:30251:112:Pierre bin/csh robcad22:Z.VGpH9oanp3M:11423:114:Pierre :/bin/csh dupp0911:LBXJgdV.Zl8lg:30267:112:Pierre 1:/bin/csh Parent:/export/home/exa/email/parp2808:/ gerp1209:JLiqJTddvRdJY:30307:112:Pierre rp1209:/bin/csh gefp0904:zHizZC2VwOjlQ:30304:112:Pierre efp0904:/bin/csh grop2001:jzWiOWxd.2iPQ:30966:112:Pierre /bin/csh stdp2705:srllvkqzhiJho:30582:112:Pierre :/bin/csh berp0604:mOT.Bp4f9rQ3I:30138:112:Pierre bin/csh pinp2309:lkVu0qUAYsMmg:30519:112:Pierre bin/csh daup2612:6qqRrxMOkIbkA:30220:112:Pierre 2612:/bin/csh : : : Hugues Gervaud:/export/home/exa/email/ge Doucet:/export/home/exa/email/doup2609:/ St-Denis:/usr/people/exa/robcad/robcad22 Duplessis:/export/home/exa/email/dupp091 Olivier Geffroy:/export/home/exa/email/g Grondin:/export/home/exa/email/grop2001: St-Denis:/export/home/exa/email/stdp2705 Berube:/export/home/exa/email/berp0604:/ Pinard:/export/home/exa/email/pinp2309:/ Noel Dautrey:/export/home/exa/email/daup 190 95 23/02/2015 Les filtres Filtre « grep » Exemple: $ egrep '[.,!]' * comm1.dat :cher Monsieur Jean. comm1.dat :Non, Pas le Dr. Watson de Windows! comm2.dat :Non, Pas le Dr. Watson de Holms! Trouver le caractère point ou le caractère virgule ou le caractère point exclamation dans tous les fichiers du répertoire courant. Remarque: Le filtre grep est très utile dans la recherche des motifs dans un fichier ou un ensemble de fichiers. La vitesse d’exécution de grep est très très grande! 191 Les filtres programmables Le filtre awk Définition Syntaxe Principe de fonctionnement Forme générale des programmes Application 192 96 23/02/2015 Les filtres programmables Définition Filtre programmable utilisant les instructions légales selon le format ‘awk’ Ressources: Le filtre/commande ‘awk’ Le programme/script Le(s) fichier(s) objet(s) du filtrage Concept de programmation « piloté par les données » (Data Driven) Utilisé pour: Valider les concepts de programmation Automatiser les tâches de gestion Évaluer rapidement les algorithmes, etc… 193 Les filtres programmables Définition La commande ‘awk’ permet de rechercher dans chacun des fichiers référencés les lignes satisfaisant 1 ou plusieurs motifs parmi ceux énumérés dans le programme awk 194 97 23/02/2015 Les filtres programmables Syntaxe awk [-F<car>] [-f <refprog>] [‘<programme>’] [<fichier> …] Option –F : définit un séparateur de champs dans les lignes différent du séparateur usuel (espace ou tabulation). Fichiers traités: entrée standard ou paramètres selon l’ordre où ils déclarés. 195 Les filtres programmables Principe de fonctionnement Données (fichier ASCII ou l'entrée standard) Programme composé d'une séquence << motif – action >> 1 2 awk motif action motif action motif action motif action motif action : : : : 3 awk lit l'entrée ligne par ligne awk compare chaque motif du programme avec la ligne lue L'action de chaque motif sélectionné est exécutée par awk 196 98 23/02/2015 Les filtres programmables Forme des programmes Le programme awk est divisé en 3 sections : Section initiale syntaxe : BEGIN {actions avant} motif {actions sur chaque ligne} Corps syntaxe : Section terminale syntaxe : END {actions après} 197 Les filtres programmables Mécanisme d’exécution de awk : Exécuter les actions de la section initiale Tant que (fin du dernier fichier non atteinte) faire Lire l’enregistrement suivant Pour (chaque motif vérifié par l’enregistrement) exécuter actions correspondant à ce motif Fin pour Fin tant que Exécuter les actions de la section terminale 198 99 23/02/2015 Les filtres programmables Forme des programmes Actions et motifs par défaut : Action par défaut : Impression de l’enregistrement Motif par défaut : Tout enregistrement contient le motif par défaut 199 Les filtres programmables Forme des programmes Forme des motifs : motif = expression rationnelle || expression relationnelle 200 100 23/02/2015 Les filtres programmables Forme des programmes Forme des motifs (suite): Expression rationnelle (pour la ligne): /motif/ /: ^: $: -: *: [] : délimiteur d’expression début de ligne fin de ligne dans un crochet, définit un intervalle itérer un caractère définit un ensemble 201 Les filtres programmables Forme des programmes Forme des motifs (suite): Expression relationnelle : <expression> ~ <expression rationnelle> : expression de gauche contient motif satisfaisant expression de droite exemple: $1 ~ /^toto/ le premier champ est une chaîne de caractères qui commence par ‘toto’ 202 101 23/02/2015 Les filtres programmables Forme des programmes Forme des motifs (suite): Expression relationnelle (suite): <expression> !~ <expression rationnelle> : expression de gauche ne contient pas de motif satisfaisant expression de droite exemple: $1 !~ /^toto/ le premier champ est une chaîne de caractères qui ne commence pas par ‘toto’ 203 Les filtres programmables Forme des programmes Forme des motifs (suite): Expression relationnelle (suite): <expression> <opérateur> <expression> : avec <opérateur> : <, >, ≤, ≥, ==, != exemple: $1 == ’’toto ’’ le premier champ est une chaîne de caractères qui coïncide avec ‘toto’ 204 102 23/02/2015 Les filtres programmables Forme des programmes Les actions : Variables utilisateurs : i.e. langage C Variables de champ : $0, $1, ..., $i 205 Les filtres programmables Forme des programmes Les actions (suite): Variables prédéfinies : • • • • • • • • FS : séparateur de champ traité RS : séparateur d’enregistrement OFS :séparateur de champ en sortie ORS :séparateur d’enregistrement en sortie NF : nombre de chps dans l’enregistrement courant NR : nombre total d’enregistrements lus dans tous les fichiers de données FNR : nombre d’enregistrements lus dans le fichier de données courant, en comptant l’enregistrement courant 206 FILENAME :nom du fichier en cours de traitement 103 23/02/2015 Les filtres programmables Forme des programmes Les actions (suite): Opérateurs : arithmétiques : ++, --, +, -, *, / relationnels : <, >, ≤, ≥, ==, !=, ~, !~ booléens : &&, || affectation : =, +=, -=, *=, /= Tableau : ligne[NR]=$0 207 Les filtres programmables Forme des programmes Les actions (suite): Instructions : • Impression : print [<expression>, <expression>, …] • Condition : if (<expression>) <instruction1>; [else <instruction2>] 208 104 23/02/2015 Les filtres programmables Forme des programmes Les actions (suite): Instructions (suite): • Itération : for (<expression>; <expression>;<expression>) <instruction> ou for (<var> in <tableau>) <instruction> ou while (<condition>) <instruction> ou 209 do <instruction> while (<expression>) Les filtres programmables Forme des programmes Les actions (suite): Les fonctions mathématiques prédéfinies exp(x) log(x) sqrt(x) int(x) 210 105 23/02/2015 Les filtres programmables Forme des programmes Les actions (suite): Les fonctions prédéfinies index(s,t) retourne la position dans la chaîne s où la chaîne t apparaît pour la première fois match(s,er) retourne la position dans la chaîne s où l’expression régulière er apparait pour la première fois length(s) calcule le nombre de caractères de s split(s,a,fs) divise la chaîne s en utilisant le séparateur fs et range les éléments obtenus dans le tableau a (dans a[1], a[2], etc) 211 Les filtres programmables Forme des programmes Les actions (suite): Les fonctions prédéfinies substr(s,p[,n]) si n n’est pas spécifié, retourne la sous-chaîne de s commençant par le p-ième caractère; sinon retourne la sous-chaîne de s commençant par le p-ième caractère et contenant n caractères. sub(r,s[,t]) substitue la chaîne s à la première occurrence de l’expression régulière r dans t. La valeur retournée par sub est le nombre de substitutions qui ont été faites. 212 106 23/02/2015 Les filtres programmables Forme des programmes Les actions (suite): Les fonctions prédéfinies gsub(r,s[,t]) comme sub, sauf que la substitution est faite globalement (i-e. pour toute occurrence de r dans t). La valeur retournée par sub est le nombre de substitutions qui ont été faites. tolower(s) passage en minuscules, toupper(s) passage en majuscules. 213 Les filtres programmables Forme des programmes Les actions (suite): Les fonctions prédéfinies print produit un affichage, par défaut sur la sortie standard, mais on peut utiliser les redirections. printf s’utilise de la même façon qu’en C. system(cmd) exécute la commande UNIX cmd dans un sous-shell. getline [var] lit le prochain enregistrement sur l’entrée standard dans la variable var (dans $0 si pas de paramètre) 214 107 23/02/2015 Les filtres programmables Exercices 1. Ecrire un script AWK qui affiche la liste des utilisateurs déclarés sur le système. 2. Ecrire un script AWK qui affiche la liste des utilisateurs du système dont le login commence par ‘a’. 3. Ecrire un script AWK qui compte le nombre d’utilisateurs du système dont le login commence par ‘a’. 4. Ecrire un script AWK qui affiche la liste des utilisateurs du système dans un ordre inversé. 5. Ecrire un script AWK qui complète un fichier contenant les articles, quantités et prix unitaire, en ajoutant une colonne « prix de l’article », et en calculant le prix total par article, et le prix total de l’ensemble des articles. 215 Les filtres programmables Exercices 6. Ecrire un script AWK qui affiche les lignes de plus de 80 caractères. 7. Ecrire un script AWK qui affiche les lignes qui contiennent exactement 2 champs 8. Ecrire un script AWK qui affiche les lignes qui vérifient que le fichier /etc/passwd a une structure régulière 9. Ecrire un script AWK qui affiche le second champ de chaque ligne. 10. Ecrire un script AWK qui affiche la liste des champs de chaque ligne dans un ordre inversé. 11. Ecrire un script AWK qui permet de compter le nombre de lignes qui contiennent la chaîne "l2ti". 12. A l'aide des tableaux associatifs, écrire un script AWK qui affiche la fréquence des mots d'un texte. 216 108