Як я можу вийти з циклу час із вкладеного оператора справи? [зачинено]


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введенні сценарій не проривався з блоку case і час, але не виходив повністю. Чи можу я вкласти для заповнювача ("Що тут?") Для цього?


Зауважте, що спочатку [Yn]*); Ви , ймовірно , мав в виду [Yy]*).
даг

1
Ви редагували свій код, оскільки я вперше відповів, але зауважте, у будь-якому випадку, який $TEST=1має бути TEST=1, і ваш сценарій, швидше за все, буде працювати з цією зміною.
даг

да, так, я це бачив під час тестування!
the_velour_fog

@dhag Я думаю, що я покращив вашу редакцію - погляньте. Здається, ваша мета - переписати код на те, де ваша відповідна відповідь добре підходить, і я думаю, зараз це ближче.
дероберт

@derobert: Ваша редакція мені добре виглядає; це, безумовно, робить питання більш зрозумілим.
даг

Відповіді:


30

У випадку, коли користувач ввів "у", ви можете вийти з і "", і "":

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.


1
дякую, так break 2зробив це, щодо вашого коментаря вище, так, я спробував встановити змінну, але це не спрацювало - Я здогадуюсь, що bash має локальну сферу дії в блоках while і case? на відміну, наприклад, PHP
the_velour_fog

Ні, змінні bash не є локальними (якщо ви прямо не заявляєте їх про це), тому присвоєння TEST в межах того case, що ви робили, повинно бути відображено в тесті циклу while.
дхаг

ах це зрозуміло, я виконував чергове завдання всередині [Yy]блоку справи. зробив невелику редагування всередині мого питання, щоб відобразити, але ваше право це працює - дякую, я навчився декількох цікавих речей!
the_velour_fog

У такому випадку breakдостатньо. Я не бачу в коді двох рівнів циклів.
xhienne

@xhienne: Ви, здається, правильні! Я не впевнений, що я думав.
даг

1

@dhag має чудову відповідь. Ви також можете використовувати:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.