Как выйти из цикла while из вложенного оператора case? [закрыто]

18

В приведенном ниже сценарии, который предлагает пользователю подтвердить, что он хочет продолжить выполнение потенциально плохого сценария, - когда пользователь входит Yв запрос - он выйдет из caseблока, только для whileповторной отправки в цикл.

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

Когда nвведено, сценарий существует полностью, как требуется. Я хотел бы знать, как сделать так, чтобы при Yвводе скрипт разрывался как с блоком while, так case и с блоком while, но не завершался полностью. Есть ли что-то, что я могу вставить для заполнителя («Что здесь происходит?»), Чтобы сделать это?

the_velour_fog
источник
Обратите внимание, что сначала [Yn]*); ты наверное имел ввиду [Yy]*).
дхаг
1
Вы отредактировали свой код с тех пор, как я впервые ответил, но обратите внимание, что в любом случае это $TEST=1должно быть TEST=1, и ваш сценарий, скорее всего, будет работать с этим изменением.
дхаг
да, да, я видел это при тестировании!
the_velour_fog
@dhag Я думаю, я улучшил твои правки - пожалуйста, взгляни. Кажется, ваша цель состоит в том, чтобы переписать код так, чтобы ваш принятый ответ хорошо соответствовал, и я думаю, что теперь он ближе.
Дероберт
@derobert: Ваше редактирование выглядит хорошо для меня; это, безусловно, проясняет вопрос.
дхаг

Ответы:

30

В случае, когда пользователь ввел «y», вы можете выйти как while, так и 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.

В твоем случае ты хочешь сделать break 2.

dhag
источник
1
спасибо, да break 2сделал это, относительно вашего комментария выше, да, я попытался установить переменную, но это не сработало - я предполагаю, что bash имеет локальную область видимости в пределах while и case блоков? в отличие, например, от PHP
the_velour_fog
Нет, переменные bash не являются локальными (если вы явно не объявляете их так), поэтому назначение TEST в том же caseвиде, что и вы, должно быть отражено в тесте цикла while.
Даг
ага, я выполнил другое задание внутри [Yy]блока дела. Я немного отредактировал внутри моего вопроса, чтобы отразить, но ваше право, это работает - спасибо, я выучил пару классных вещей!
the_velour_fog
В таком случае breakдостаточно. Я не вижу двух уровней циклов в коде.
Ксиенн
@xhienne: Вы, кажется, правы! Я не уверен, что я думал.
Даг
1

У @dhag отличный ответ. Вы также можете использовать:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
doneal24
источник