Mettre en pause un script BASH

Fermé
Bb1503 - Modifié par Bb1503 le 23/12/2011 à 17:43
 Utilisateur anonyme - 24 déc. 2011 à 00:05
Bonjour à tous,

j'écris un petit script bash, qui nécessite une pause, et plus précisement qui attend une réponse de l'utilisateur.
en fait, si le dossier en question n'est pas vide, un avertissement s'affiche. "Voulez vous continuer ? "
L'utilisateur doit pouvoir répondre non et sortir du script ; ou oui auquel cas le script continue son exécution.
Le problème ici est que, si je rentre "y" ou "Y",


if [ "$mot"="N" -o "$mot"="n" ] ; then
     exit 
 fi


fonctionne quand même, c'est à dire (en mode debug)

+ '[' y=N -o y=n ']'
+ exit

donc si je rentre "n" , "N", "y" ou "Y" je sors ; en revanche si je tape n'importe quelle autre lettre, on me redemande bien de retaper ma réponse !
c'est donc
if [ "$mot"="N" -o "$mot"="n" ]
qui pose un problème et je ne vois pas pourquoi ...

auriez-vous une idée s'il vous plait ?

voici la partie du script concernée :

if [ $contenu <> 0 ] ; then  
    echo " Attention le fichier cible n'est pas vide. Cela peut poser des problèmes quant au bon fonctionnement du script, les résultats obtenus peuvent être inattendus. "  
   # l'utilisateur a la possibilité de stopper le script ici ou de continuer son exécution.  
   echo " voulez vous continuez ? [Y/N] "  
   read mot  
   until  
   # recommencer la boucle tant qu'il n'a pas réondu par oui ou non à la question "voulez vous continuez ? "  
   [ "$mot" = "Y" -o "$mot" = "y" -o "$mot" = "N" -o "$mot" = "n" ]  
   do  
       echo " voulez vous continuez ? [Y/N] "  
       read mot  
   done  
      # on peut être sorti de la boucle while pour 2 raisons, s'il a saisi oui, ou s'il a saisi non.  
      # s'il a saisi non, on arrête l'exécution du script.  
      if [ "$mot"="N" -o "$mot"="n" ] ; then  
          exit  
      fi  
fi


2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 déc. 2011 à 17:51
Salut,

Un exemple pour mieux expliquer...

$ cat foo.sh 
#! /bin/bash

#set -xv

while :
do
read -p "Voulez-vous continuer ? [Yy/Nn] " reponse
case "${reponse}" in
[Yy])	echo "On continue..."
	continue
	;;
[Nn])	echo "Bye bye..."
	break
	;;
*)	echo "Mauvaise réponse..."
	continue
	;;
esac
done

echo "Merci de votre visite"
exit

$ ./foo.sh 
Voulez-vous continuer ? [Yy/Nn] O
Mauvaise réponse...
Voulez-vous continuer ? [Yy/Nn] o
Mauvaise réponse...
Voulez-vous continuer ? [Yy/Nn] Y
On continue...
Voulez-vous continuer ? [Yy/Nn] y
On continue...
Voulez-vous continuer ? [Yy/Nn] N
Bye bye...
Merci de votre visite

$

;-))
0
merci pour ta réponse !
je l'ai comprise, cependant je n'ai pas compris le commentaire #set -xv
ni la condition de ton while ; un while peu ne pas avoir de condition d'arrêt ?
0
Pourquoi ne pas mettre
[Yy]) echo "On continue..."
break
;;
[Nn]) echo "Bye bye..."
exit
;;
*) echo "Mauvaise réponse..."
continue
;;

?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 déc. 2011 à 18:00
Le "#set -xv" je le mets toujours, ça me sert à debuguer le script en enlevant le dièse (#).

La condition "while :" on aurait pu l'écrire "while true", donc tant que la condition est vraie...

Donc ici l'arrêt est déclenché par l'instruction "break".
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 déc. 2011 à 18:06
Pourquoi ne pas mettre
Tu mets ce que tu veux. Mon exemple vaut juste pour la méthode, après à toi d'adapter à tes besoins ;-))
0
Oui bien sur ^^" mais je pensais que c'était "comme ca et pas autrement".
Avec ton exemple, si je saisis "y" ou "Y" la boucle continue de tourner, on redemande encore une fois si on veut continuer ... alors que je veux continuer !
C'est pour çà que je me suis permis ce "pourquoi ne pas mettre" ^^
merci pour ton aide !
0
Utilisateur anonyme
23 déc. 2011 à 18:01
salut,

ce qui se passe, étant donné que tu ne mets pas d'espaces autour du =, le test se fait sur le texte, or le texte existe, donc le test est vrai. Mais ça ne teste pas l'égalité de $mot et de N ou n.
0
Merci pour ta réponse =)

pourtant pour tester l'égalité entre deux chaines de caractères (ici deux caractères) ce n'est pas le modus operandi ?
0
Tu le fais correctement pour le until, et pas pour le if.
Pourtant, dans les deux cas, c'est la même commande test [ ].
Donc, la syntaxe doit être la même (avec des espaces autour du signe égal).
0