¿Cómo puedo salir de un ciclo while, desde una declaración de caso anidada? [cerrado]

18

En la secuencia de comandos a continuación, que solicita al usuario que confirme que desea continuar con la ejecución de una secuencia de comandos potencialmente mala, cuando el usuario ingresa Yen el indicador, saldrá del casebloque, solo para ser enviado nuevamente al whilebucle.

#! /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?"

Cuando nse ingresa, el script existe completamente como se desea. Me gustaría saber cómo hacer para que cuando Yse ingresa se rompe el guión en voz tanto de la case y el mientras que el bloque, pero no sale del todo. ¿Hay algo que pueda poner para que el marcador de posición ("¿Qué pasa aquí?") Haga eso?

the_velour_fog
fuente
Tenga en cuenta que primero [Yn]*); Probablemente quisiste decir [Yy]*).
dhag
1
Editó su código desde que respondí por primera vez, pero tenga en cuenta en cualquier caso que $TEST=1debería ser TEST=1, y es muy probable que su script funcione con este cambio.
dhag
¡sí, lo vi al probar!
the_velour_fog
@dhag Creo que he mejorado tu edición, échale un vistazo. Parece que su objetivo es reescribir el código en algo donde su respuesta aceptada se ajuste bien, y creo que ahora está más cerca.
Derobert
@derobert: Tu edición se ve muy bien a mí; sin duda hace que la pregunta más clara.
DHAG

Respuestas:

30

En el caso en que el usuario ingresó "y", puede salir de while y 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.

En su caso, usted quiere hacer break 2.

dhag
fuente
1
gracias, sí break 2, con respecto a su comentario anterior, sí, intenté establecer una variable, pero no funcionó. Supongo que bash tiene un alcance local dentro de while y bloques de casos. a diferencia de, por ejemplo, PHP
the_velour_fog
No, variables bash no son locales (a menos que ellos así lo declare explícitamente), por lo que la asignación a prueba dentro del casecomo lo hizo debe reflejarse en la prueba para el bucle while.
DHAG
ah entendido, estaba realizando otra tarea dentro del [Yy]bloque de casos. hice una pequeña edición dentro de mi pregunta para reflexionar, pero tienes razón, funciona. ¡Gracias, aprendí un par de cosas geniales!
the_velour_fog
En ese caso, breakes suficiente. No veo dos niveles de bucles en el código.
xhienne
@xhienne: ¡Parece que estás en lo correcto! No estoy seguro de lo que estaba pensando.
dhag
1

@dhag tiene una gran respuesta. También puedes usar:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
doneal24
fuente