Skip to content

TP2 - Langage de commande Shell d’UNIX

Script

Les scripts sont des programmes qui permettent d’automatiser certaines tâches répétitives telles que l’administration ou les sauvegardes de fichiers. Ce sont des fichiers de texte en général sans extension ; ils ont parfois l’extension .sh ou .bash. Ils contiennent les mêmes commandes que celles exécutées en ligne de commande, plus éventuellement des structures itératives (for, while, until) ou conditionnelles (if) et des appels à des fonctions. Un script contient en général une commande par ligne. Il peut être paramétré, les paramètres sont désignés par $1, $2, … $9.

Exécuter un script shell

Pour exécuter un script shell, il suffit de taper bash suivi du nom de ce fichier dans une fenêtre de terminal. L’interprète exécute les commandes de manière séquentielle, dans l’ordre où elles apparaissent dans le fichier. Si l’on donne les droits d’exécution au fichier et que le fichier est place dans un répertoire défini dans la variable PATH, il suffit de taper le nom du fichier.

La variable PATH

Pour pouvoir exécuter un programme, le système d’exploitation doit pouvoir retrouver le fichier correspondant à cette commande. C’est la variable d’environnement PATH qui contient la liste des répertoires que l’interprète explore pour trouver un programme à exécuter. Vos scripts seront donc placés dans le répertoire $HOME/bin (voir TP n°1).

  • Vérifiez que le répertoire $HOME/bin existe et qu’il apparaît dans votre variable PATH.

  • Conseil : utilisez un éditeur (graphique) de texte scite pour écrire vos scripts ; sélectionnez Shell dans le menu Language pour avoir la coloration syntaxique du langage shell et dans le menu View, sélectionnez Line numbers pour voir les numéros de ligne, ce qui peut être utile lors de la mise au point de vos programmes.

    Si vous ne pouvez pas lancer d’applications graphiques, vous pouvez utiliser l’éditeur de texte nano

  • Evitez d’utiliser les caractères accentués qui sont codés différemment dans les éditeurs sous Ubuntu et dans les fenêtres de terminal.

  • Pensez à utiliser votre cours et l’aide en ligne pour la syntaxe des commandes.

Scripts à écrire pendant la séance de TD

Section titled “Scripts à écrire pendant la séance de TD”
  1. Tester les paramètres passés à l’exécution d’un script shell

    • Dans le répertoire $HOME/bin, créer le fichier de commandes testparam avec le texte ci-dessous.

      testparam
      #!/bin/bash
      if [ $1 = "--help" ]
      then
      echo "usage : testparm parametres"
      else
      echo "Les parametres sont : $*"
      fi
    • Que représentent $1 et $* ?

    • Que fait [ $1 = "--help" ] ?

    • Tester ce script en passant 1, puis 2 paramètres, puis le paramètre --help

    • Que se passe-t-il si l’on teste le script sans passer de paramètre ?

    • Changer [ $1 = "--help" ] par [ "$1" = "--help" ] . Le script fonctionne-t-il correctement maintenant ? Pourquoi ?

    • Modifier le script pour que le message usage : testparm parametres soit également affiché lorsque aucun paramètre n’est donné

  2. Tester l’existence de fichier et/ou répertoire

    • Dans le répertoire $HOME/bin, créer un fichier de commandes testfic qui reprend l’exemple ci-dessous.

      testfic
      #!/bin/bash
      if test $# -eq 0 -o "$1" = "--help"; then
      echo "usage : testfic nomfichier"
      elif [ -f $1 ] ; then
      echo "le fichier $1 existe"
      elif [ -d $1 ] ; then
      echo "le repertoire $1 existe"
      else
      echo $1 est absent !
      fi
    • Tester cette commande pour un fichier et un répertoire existants/non existants.

    • Commenter le code :

      • Que représentent le $# ?
      • Que fait if test $# -eq 0 –o $1 = "--help" ?
      • Que représente [ -f $1 ] ?
    • Afficher « l’aide » de la commande (en lançant le programme avec l’option correspondante)

    • Modifiez le script testfic de façon à ce qu’il permette de tester l’existence de plusieurs fichiers ou répertoires (nombre indéfini de paramètres) en utilisant la commande shift et une itération (voir l’exemple donné en cours).

  3. Sauvegarder des fichiers et des répertoires

    Les scripts shell peuvent être utiles pour la réalisation de sauvegardes automatiques.

    • Ecrire la commande sauver qui copie des fichiers passés en paramètres dans le répertoire sauvegarde du répertoire courant (à créer s’il n’existe pas).

      • Afficher un message d’erreur si un nom correspond à un répertoire ou si un fichier est absent 
    • Ecrire un script datedujour qui affiche :

      Terminal window
      Nous sommes le Xeme jour du Yeme mois de l'annee Z.

      Pour cela, reprendre le script suivant qui affiche la date et le modifier de sorte que les zéros non significatifs n’apparaissent pas ; on pourra aussi tenir compte du 1 et afficher 1er au lieu de 1eme

      #!/bin/bash
      d=$(date +%D)
      mois=${d:0:2}
      jour=${d:3:2}
      annee=${d:6:2}
      echo Nous sommes le jour $jour du mois $mois de l\'annee 20$annee

    Pour extraire une sous-chaine d’une variable, on utilise la syntaxe suivante : ${nomvar:d:lg}

    • nomvar est le nom la variable
    • d est l’indice de début de la sous-chaine (0 est l’indice du premier caractère)
    • lg est la longueur de la sous-chaine

    exemple : si la variable nomvar=tralala, alors ${nomvar:1:3} correspond à la chaîne “ral”

Lecture de fichiers, analyses de chaînes, calculs

Section titled “Lecture de fichiers, analyses de chaînes, calculs”
  • Pour chacune de vos commandes (scripts), les 3 points suivants doivent être respectés :
    • Votre code doit être commenté et chaque commande doit avoir un en-tête précisant son rôle et ses paramètres.
    • L’utilisateur doit pouvoir obtenir l’aide des commandes en tapant : nomcommande --help
    • Si l’utilisateur appelle la fonction avec de mauvais paramètres, un message d’erreur et d’aide approprié doit s’afficher.

Les questions suivantes concernent la gestion d’une épreuve de lancé de Javelot. Durant cette compétition, chaque athlète a eu 3 essais.

  1. Écrire la commande maximum qui calcule dans la variable nommée maxi et affiche le maximum d’une liste d’entiers passée en paramètres. Le nombre de paramètres n’est pas fixé.

    Par exemple, la commande « maximum 1 2 3 4 3 2 1 » a pour effet d’afficher et de placer dans la variable maxi la valeur 4 car il s’agit du maximum des paramètres donnés dans l’exemple.

    La commande maximum vérifiera la présence d’au moins un paramètre et affichera un message d’aide dans le cas contraire.

  2. Écrire la commande categorie qui calcule, stocke dans la variable categ et affiche la catégorie d’âge d’un athlète.

    Par exemple, la commande « categorie 1984 » a pour effet d’afficher et de placer dans la variable categ la valeur senior.

    En athlétisme, les catégories d’âge de la saison 2016/2017 sont données par le tableau suivant :

    CATEGORIEANNEE DE NAISSANCECATEGORIEANNEE DE NAISSANCE
    Masters1976 et avantMinimes2001 et 2002
    Seniors1977 à 1993Benjamins2003 et 2004
    Espoirs1994 à 1996Poussins2005 et 2006
    Juniors1997 et 1998École d’Athlétisme2007 à 2009
    Cadets1999 et 2000Baby Athlé2010 et après
    1. Écrire la commande afficherresultat qui affiche la catégorie et le meilleur lancé d’un athlète donné.

      Par exemple, la commande « afficherresultat Martin Galle 12-2-1991 94 87 93 » a pour effet d’afficher : Le meilleur lancé du senior Martin Galle est de 94 m

      La commande afficherresultat doit comporter 6 paramètres : le prénom et le nom de l’athlète, sa date de naissance (au format j-m-aaaa) et les 3 essais.

      La commande afficherresultat pourra appeler les commandes maximum et categorie.

    2. On dispose d’un fichier de texte appelé athletes.txt et contenant une ligne pour chaque athlète avec le format suivant :

      Nom:Prenom:DatedeNaissance:essai1:essai2:essai3

      Exemple de fichier athletes.txt :

      #Fichiers des athletes
      #Nom:Prenom:dateNaissance:essai1:essai2:essai3
      Galle:Martin:12-2-1991:94:87:93
      Honnete:Marie:14-9-1982:82:91:93
      Pleur:Jean:13-3-1976:93:79:72
      Prane:Dolly:19-11-1999:41:57:59
      Mieu:Jeff-Edmond:22-12-2004:89:95:91

      Ecrire la commande calculerresultats qui affiche, pour chaque athlète d’un fichier donné, sa catégorie d’âge et son meilleur lancé. Le fichier contenant les athlètes et leurs performances au javelot est un paramètre de la commande.

      Conseils :

      1) Pensez à :

      • Commenter votre code,
      • Testez vos scripts séparément,
      • Gérez les erreurs et les aides en ligne.

      2) Si un script ne fonctionne pas, faites des traces en affichant les valeurs des variables mises en jeu. Ainsi vous trouverez plus facilement une erreur.