Comment puis-je sortir d'une boucle while, à partir d'une déclaration de cas imbriquée? [fermé]


18

Dans le script ci-dessous - qui invite l'utilisateur à confirmer qu'il souhaite continuer à exécuter un script potentiellement mauvais - lorsque l'utilisateur entre Yà l'invite - il sortira du casebloc, pour être ensuite renvoyé dans la whileboucle.

#! /bin/bash
set -e

echo
echo "bad install start"
echo "-----------------------------------------"

while true; do
        read -p "this script will probably fail - do you want to run anyway?" yn
        case $yn in
                [Yy]*)
                        ##### WHAT GOES HERE?? #####
                        ;;
                [Nn]*)
                        exit ;;
                *)
                        echo "answer y or n" ;;
        esac

        echo "script has broken out of case back into while loop"
done

echo -e "\e[33m Installing bad packagename \e[0m"
apt-get install sdfsdfdfsd

echo "rest of script - will i keep running?"

Lorsque nest entré, le script existe entièrement comme souhaité. Je voudrais savoir comment faire en sorte que lorsque Yest entré, le script se détache à la fois du bloc case et du bloc while, mais ne se ferme pas complètement. Y a-t-il quelque chose que je peux mettre pour l'espace réservé ("Qu'est-ce qui se passe ici ??") pour faire cela?


Notez que d'abord [Yn]*); vous vouliez probablement dire [Yy]*).
dhag

1
Vous avez modifié votre code depuis ma première réponse, mais notez dans tous les cas que cela $TEST=1devrait être TEST=1, et votre script est très susceptible de fonctionner avec ce changement.
dhag

doh, oui je l'ai vu lors des tests!
the_velour_fog

@dhag Je pense que j'ai amélioré votre édition - veuillez jeter un œil. Il semble que votre objectif soit de réécrire le code dans quelque chose où votre réponse acceptée correspond bien, et je pense que c'est plus proche maintenant.
derobert

@derobert: Votre montage me semble bien; cela rend certainement la question plus claire.
dhag

Réponses:


30

Dans le cas où l'utilisateur a entré "y", vous pouvez quitter à la fois while et case:

break [n]
       Exit from within a for, while, until, or select loop.  If  n  is
       specified, break n levels.  n must be  1.  If n is greater than
       the number of enclosing loops, all enclosing loops  are  exited.
       The  return  value is 0 unless n is not greater than or equal to
       1.

Dans votre cas, vous voulez faire break 2.


1
merci, oui break 2, concernant votre commentaire ci-dessus, oui, j'ai essayé de définir une variable, mais cela n'a pas fonctionné - je suppose que bash a une portée locale dans les blocs while et case? contrairement à, par exemple PHP
the_velour_fog

Non, les variables bash ne sont pas locales (sauf si vous les déclarez explicitement), donc l'affectation à TEST dans le casecomme vous l'avez fait devrait être reflétée dans le test de la boucle while.
dhag

ah j'ai compris, j'effectuais une autre mission à l'intérieur du [Yy]bloc de cas. fait une petite retouche à l'intérieur de ma question pour réfléchir, mais votre droit ça marche - merci j'ai appris quelques trucs sympas!
the_velour_fog

Dans ce cas, breakc'est suffisant. Je ne vois pas deux niveaux de boucles dans le code.
xhienne

@xhienne: Vous semblez avoir raison! Je ne sais pas trop à quoi je pensais.
dhag

1

@dhag a une excellente réponse. Vous pouvez aussi utiliser:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.