PROFDINFO.COM

Votre enseignant d'informatique en ligne

Solution du labo 3

Retour à la page du cours

Voici des solutions possibles pour le laboratoire 3:

Le script de cette semaine est plus complexe que ceux des semaines précédentes. Il demande une structure plus élaborée afin de tester le nombre et la valeur des paramètres, puis l'existence des fichiers.

Si on veut (et c'est ce que j'ai fait ici), on peut vérifier à chaque étape si l'opération a fonctionné correctement avec $?.

Voici le script, on se retrouve ensuite pour discuter de quelques points.

#!/bin/bash

if [ $# -ne 2 ] || [ "$1" == "-h" ]; then
# On regle les cas d'aide de base:  l'usager utilise -h ou entre un nombre
# incorrect de parametres (different de 2)
   echo "Usage $0 <option> <fichier>"
   echo "options:"
   echo "-d : efface le fichier"
   echo "-m : deplace le fichier vers votre home"
   echo "-c : copie le fichier vers votre home"
   echo "-h : affiche ce message d'aide et ne tient pas compte du fichier"
   exit 0
   # On sort.
fi

if [ "$1" != "-h" ] && [ $# -eq 2 ]; then
# Dans le cas ou l'usager ne demande pas d'aide et donne 2 parametres
   if ! [ -f $2 ]; then
   # On verifie l'existence du fichier
      echo "Fichier $2 inexistant."
      exit 1
      # On sort s'il n'existe pas
   fi
fi

# A partir d'ici, les cas d'erreur courants sont regles.
# Testons le premier parametre pour voir ce qu'on a a faire.
if [ "$1" == "-d" ]; then
# Effacer...
   rm $2
   # Apres coup, on peut verifier que ca a fonctionne
   RESULT=$?
   if [ $RESULT -ne 0 ]; then
      echo "Probleme lors de la supression"
      exit $RESULT
   fi
elif [ "$1" == "-m" ] || [ "$1" == "-c" ]; then
# Deplacement ou copie:  les deux fonctionnent de la meme facon, inutile
# de repeter.
   if [ -f $HOME/$2 ]; then
   # On verifie l'existence du fichier dans le home
      echo -n "Un fichier nomme $2 existe deja dans $HOME.  Ecraser (o/n)?  "
      read CHOIX
      if [ "$CHOIX" == "o" ]; then
      # L'usager veut ecraser, l'operation depend de la switch -m ou -c
         if [ "$1" == "-m" ]; then
            mv $2 $HOME
            RESULT=$?
         else
            cp $2 $HOME
            RESULT=$?
         fi

         # Dans les deux cas, on stocke le resultat de l'operation dans RESULT
         if [ $RESULT -ne 0 ]; then
            echo "Probleme lors de l'operation"
            exit $RESULT
         fi
     else
         # L'usager ne veut pas ecraser
         echo "Operation annulee"
         exit 2
     fi
   else
      # Le fichier n'existe pas dans le home, on fait l'operation automatiquement
      if [ "$1" == "-m" ]; then
         mv $2 $HOME
         RESULT=$?
      else
         cp $2 $HOME
         RESULT=$?
      fi

      # Dans les deux cas, on stocke le resultat de l'operation dans RESULT
      if [ $RESULT -ne 0 ]; then
         echo "Probleme lors de l'operation"
         exit $RESULT
      fi
   fi
else
   # 2 parametres, mais une switche incorrecte
   echo "Usage: $0 option fichier"
   echo "options:"
   echo "-d : efface le fichier"
   echo "-m : deplace le fichier vers votre home"
   echo "-c : copie le fichier vers votre home"
   echo "-h : affiche ce message d'aide et ne tient pas compte du fichier"
   exit 3
fi

Une bonne façon d'approcher un script plus complexe comme celui-là est d'éliminer d'abord les cas d'erreur les plus simples. En commençant par quelques validations et en sortant du script avec exit lorsqu'une de ces erreurs survient, on règle tous ces problèmes dès le départ et on sait que si le script se rend à la section suivante, c'est qu'il n'y a pas d'erreur. On se concentrera ensuite sur les cas d'usage corrects.

Dans ce cas-ci, ça signifie éliminer tout de suite les usages incorrects du type "nombre de paramètres incorrect" ou "demande d'aide" (bien que ce soit un usage correct, ça revient au même résultat).

Ensuite, vérifier l'existence du fichier source.

Finalement, ces cas réglés, il ne nous reste plus qu'à attaquer les cas prévus, en vérifiant les trois switches possibles.

Pour tester la présence du fichier passé en deuxième paramètre dans le répertoire maison avant de faire une copie ou un déplacement, on fera if [ -f $HOME/$2 ]. Ainsi, la variable HOME sera remplacée par son contenu (le chemin vers le répertoire maison de l'usager, quelque chose comme /home/usagers/georges) et le paramètre $2 sera remplacé par le nom du fichier (disons "file1"). Le résultat après substitution sera if [ -f /home/usagers/georges/file1 ], ce qui teste effectivement la présence du fichier dans le répertoire maison de l'usager.

Évidemment, tout ceci ne fonctionnera pas si on appelle le script en passant un chemin absolu (ou relatif autre que le simple nom du fichier). Par exemple: filer -m /etc/hosts.allow. Dans ce cas, le fait de coller ceci au chemin du répertoire maison donnera quelque chose qui n'existera probablement jamais, donc la copie ou le déplacement sera fait à tous les coups, sans jamais demander de confirmation. Pour l'instant, on ne peut rien y faire et il nous faudra vivre avec ça. On verra peut-être plus tard comment décomposer un chemin pour y extraire le nom du fichier.

Retour à la page du cours