Come posso uscire da un ciclo while, all'interno di un'istruzione case nidificata? [chiuso]


18

Nello script seguente - che richiede all'utente di confermare che desidera procedere con l'esecuzione di uno script potenzialmente dannoso - quando l'utente inserisce Yil prompt - uscirà dal caseblocco, per poi essere nuovamente inviato nel whileciclo.

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

Quando nviene inserito, lo script esiste interamente come desiderato. Mi piacerebbe sapere come fare in modo che quando Yviene inserito le pause di script fuori sia del case e il tempo di blocco, ma non esce del tutto. C'è qualcosa che posso mettere per il segnaposto ("Cosa succede qui ??") per farlo?


Nota che prima [Yn]*); probabilmente intendevi [Yy]*).
Dhag,

1
Hai modificato il tuo codice da quando ho risposto per la prima volta, ma nota comunque che $TEST=1dovrebbe esserlo TEST=1, e molto probabilmente il tuo script funzionerà con questa modifica.
Dhag,

doh, sì, l'ho visto durante i test!
the_velour_fog

@dhag Penso di aver migliorato la tua modifica, per favore dai un'occhiata. Sembra che il tuo obiettivo sia quello di riscrivere il codice in qualcosa in cui la tua risposta accettata si adatti bene, e penso che ora sia più vicino.
derobert,

@derobert: la tua modifica mi sta benissimo; certamente rende la domanda più chiara.
Dhag,

Risposte:


30

Nel caso in cui l'utente abbia inserito "y", è possibile uscire sia mentre che nel caso:

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.

Nel tuo caso, vuoi farlo break 2.


1
grazie, sì break 2, riguardo al tuo commento qui sopra, sì, ho provato a impostare una variabile, ma non ha funzionato. a differenza, ad esempio, di PHP
the_velour_fog

No, le variabili bash non sono locali (a meno che tu non lo dichiari esplicitamente), quindi l'assegnazione a TEST all'interno di casecome hai fatto dovrebbe riflettersi nel test per il ciclo while.
Dhag,

ah capito, stavo eseguendo un altro incarico nel [Yy]case block. fatto una piccola modifica all'interno della mia domanda per riflettere, ma il tuo diritto funziona - grazie ho imparato un paio di cose interessanti!
the_velour_fog

In tal caso, breakè abbastanza. Non vedo due livelli di loop nel codice.
Xhienne,

@xhienne: sembra che tu abbia ragione! Non sono sicuro di cosa stavo pensando.
dhag,

1

@dhag ha un'ottima risposta. Puoi anche usare:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.