[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