[Ubuntu-QC] Aide pour déboguer un petit script.sh

Philippe Gauthier philippe.gauthier at deuxpi.ca
Ven 16 Avr 02:23:22 BST 2010


Bonjour!

Je vais couper un peu dans les citations pour pas trop alourdir...

Le jeudi 15 avril 2010 à 20:29 -0400, Lami René a écrit :
> >   mkdir -p ~/PointDeRestauration
> >   
> OK, si je comprends bien, que le dossier existe ou pas on demande sa 
> création et cela ne cause aucun problème, mais cela rend la structure du 
> script plus simple ! Est-ce une bonne interprétation de ton propos ?

Exactement. Chaque outil a une "job" et la "job" de mkdir c'est de créer
un répertoire. Le "-p" vient seulement lui demander de ne pas paniquer
si le répertoire n'existe pas, ou de créer plusieurs répertoires
imbriqués si nécessaire.

> Est-ce que le « done » fait partie de la boucle du « case » ?

Le "done" était la contrepartie de "while []; do".

> Je ne sais pas ce qu'est « pratique pour le LPIC-1 », mais continus a 
> pratiqué, j'admire tes résultats !

C'est le Linux Professional Institute Certification, une certification
pour le niveau d'administrateur junior pour des systèmes Linux.

> Voici ma dernière version du script en y incorporant, je crois, toutes 
> tes suggestions :
> 
> #!/bin/bash
> nomDossier="~/PointDeRestauration/"

Pour des raisons que j'ignore, il faut enlever les guillemets pour que
ça fonctionne correctement. Sinon, cela va créer un répertoire qui se
nomme "~" !?!

nomDossier=~/PointDeRestauration/

> clear
> mkdir -p $nomDossier
> echo ""
> echo " 1) Créer un point de restauration. "
> echo ""
> echo " 2) Restaurer un point. "
> echo ""
> echo " 3) Quitter. "
> echo ""
> echo " Taper le numéro de l'action que vous souhaitez ou CTRL-C pour 
> quitter ce script : "
> echo ""
> read touche1
>    case "$touche1" in
>    1)
>      point=$(date +%F)
>      if dpkg --get-selections > $nomDossier + "/" + $point; then

En shell, les chaînes de caractère sont formées sans opérateurs. On peut
écrire directement:

      if dpkg --get-selections > $nomDossier/$point; then

>        echo "Le point de restauration « $point » a est créé avec succès !"
>      else
>        echo "La création du point de restauration a échoué !"
>      fi
>      ;;
>   2)
>     echo "Quel point de restauration souhaitez-vous utiliser ?"
>     echo
>     cd $nomDossier
>     ls
>     read point
>     if [ -f $nomDossier + "/" + $point ]; then

Même chose:

     if [ -f $nomDossier/$point ]; then

>       sudo dpkg --clear-selections
>       if sudo dpkg --set-selections < $nomDossier + "/" + $point; then

Même chose encore :

       if sudo dpkg --set-selections < $nomDossier/$point; then

>         echo "Votre système a été restauré au point « $point » avec 
> succès !"
>       else
>         echo "La restauration a échoué !"
>       fi
>     else
>       echo "Le fichier pour la date de restauration « $point » n'est pas 
> disponible !"
>     fi
>     ;;
> 
>       3)
>          break
>          ;;

Il manque le "esac" qui ferme le "case" :

    esac

>    done

Si il n'y a plus de "while []; do", on n'a plus besoin du done. Aussi,
l'option 3 n'a plus vraiment de sens si il n'y a plus de boucle.

> J'y ai probablement glissé des erreurs, je fais de mon mieux. Aurais-tu 
> l'amabilité de le réviser et de me faire te recommandations !

Ça a l'air de fonctionner !

> Pour l'instant, avec la commande « chmod +w PointDeRestauration.sh », 
> suivi de « ./PointDeRestauration.sh », j'ai le message d'erreur suivant :
> 
> bash: ./PointDeRestauration.sh: Permission non accordée

C'était un piège ;) Non vraiment, je me suis trompé lorsque j'ai réécrit
la commande. Le "+w" sert vraiment pour ajouter la permission en
écriture. Le mode correct serait plutôt "+x". Désolé...

> Avec la commande « chmod +w PointDeRestauration.sh », suivi de « sh 
> ./PointDeRestauration.sh », avec ce nouveau script, comme avec l'ancien, 
> J'ai toujours le même message d'erreur avec la rencontre des « in » dans 
> le script :
> 
>  : bad variable name
> ./PointDeRestauration.sh: 15: Syntax error: word unexpected (expecting "in")
> 
> Avec la commande « chmod +w PointDeRestauration.sh », suivi de « bash 
> ./PointDeRestauration.sh », j'ai le résultat suivant :
>                               
>  : commande introuvableh: line 3: clear                                    
>  1) Créer un point de restauration.
> 
>  2) Restaurer un point.
> 
>  3) Quitter.
> 
>  Taper le numéro de l'action que vous souhaitez ou CTRL-C pour quitter 
> ce script :
> 
> 1
>  » : identifiant non valablene 14: read: « touche1
>  »PointDeRestauration.sh: line 15: Erreur de syntaxe près du symbole 
> inattendu « in
> '/PointDeRestauration.sh: line 15: `   case "$touche1" in

Hmmm... je ne sais pas pourquoi. Ça semble marcher pour moi. Est-ce que
toutes les lignes ont été bien recopiées ? Le script que j'utilise est
attaché à ce message.

> Pourquoi les résultats sont différents entre l'utilisation de « sh ./... 
> » et  « bash ./... » ?

Sur Ubuntu, "sh" pointe sur /bin/dash, qui différent de bash. Je crois
que "dash" implémente les fonctionnalités écrites dans des standards,
tandis que "bash" ajoute plusieurs extensions et fonctionnalités bien au
delà des standards.


-- 
Philippe Gauthier <philippe.gauthier at deuxpi.ca>
http://www.deuxpi.ca/

-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: PointDeRestauration.sh
Type: application/x-shellscript
Taille: 1099 octets
Desc: non disponible
Url: https://lists.ubuntu.com/archives/ubuntu-quebec/attachments/20100415/34437720/attachment.bin 


Plus d'informations sur la liste de diffusion Ubuntu-quebec