Wie kann ich aus einer while-Schleife innerhalb einer verschachtelten case-Anweisung ausbrechen? [geschlossen]

18

Im folgenden Skript - das den Benutzer auffordert, zu bestätigen, dass er mit der Ausführung eines möglicherweise fehlerhaften Skripts fortfahren möchte Y- wird der caseBlock verlassen, wenn der Benutzer die Eingabeaufforderung eingibt , und er wird wieder in die whileSchleife zurückgeschickt.

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

Bei der nEingabe ist das Skript vollständig wie gewünscht vorhanden. Ich möchte wissen, wie man es so macht, dass Ydas Skript bei der Eingabe sowohl aus dem Block case als auch aus dem while-Block ausbricht , aber nicht vollständig beendet wird. Gibt es etwas, das ich für den Platzhalter ("Was geht hier?") Einfügen kann, um das zu tun?

the_velour_fog
quelle
Beachten Sie das zuerst [Yn]*); du meintest wahrscheinlich [Yy]*).
Dhag
1
Sie haben Ihren Code bearbeitet, seit ich zum ersten Mal geantwortet habe. Beachten Sie jedoch, dass dies in jedem Fall der Fall $TEST=1sein sollte TEST=1, und es ist sehr wahrscheinlich, dass Ihr Skript mit dieser Änderung funktioniert.
Dhag
doh ja das hab ich beim testen gesehen!
the_velour_fog
@dhag Ich denke, ich habe deine Bearbeitung verbessert - bitte sieh sie dir an. Ihr Ziel scheint es zu sein, den Code so umzuschreiben, dass Ihre akzeptierte Antwort gut passt, und ich denke, es ist jetzt näher.
Derobert
@derobert: Deine Bearbeitung sieht für mich gut aus; es macht die Frage sicherlich klarer.
Dhag

Antworten:

30

In dem Fall, in dem der Benutzer "y" eingegeben hat, können Sie sowohl while als auch case beenden:

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.

In Ihrem Fall möchten Sie tun break 2.

dhag
quelle
1
danke, ja, break 2habe es getan, in Bezug auf Ihren Kommentar oben, ja, ich habe versucht, eine Variable zu setzen, aber es hat nicht funktioniert. anders als zum Beispiel PHP
the_velour_fog
Nein, bash-Variablen sind nicht lokal (es sei denn, Sie deklarieren sie explizit). Die Zuweisung zu TEST innerhalb der casevon Ihnen festgelegten Zeit sollte sich im Test für die while-Schleife widerspiegeln.
Dhag
Ich habe es verstanden, ich habe eine andere Aufgabe innerhalb des [Yy]Fallblocks ausgeführt. habe in meiner Frage eine kleine Bearbeitung vorgenommen, um darüber nachzudenken, aber dein Recht, es funktioniert - danke, ich habe ein paar coole Dinge gelernt!
the_velour_fog
In diesem Fall breakist genug. Ich sehe keine zwei Ebenen von Schleifen im Code.
Xhienne
@ xhienne: Du scheinst richtig zu sein! Ich bin mir nicht sicher, was ich gedacht habe.
Dhag
1

@dhag hat eine tolle Antwort. Sie können auch verwenden:

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