Yuvalanmış bir vaka deyiminin içinden bir while döngüsünden nasıl çıkabilirim? [kapalı]


18

Aşağıdaki komut dosyasında - kullanıcıdan potansiyel olarak kötü bir komut dosyası çalıştırmaya devam etmek istediklerini onaylamasını ister - kullanıcı komut Yistemine girdiğinde - caseyalnızca whiletekrar döngüye geri gönderilmek üzere bloktan ayrılacaktır .

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

Zaman ngirilir, komut tamamen arzu edilen çalışma mevcuttur. Ben bunu girmek için bilmek istiyorum böylece Ygirildiğinde script hem case ve while bloğundan kopar , ama tamamen çıkmaz. Bunu yapmak için yer tutucuya ("Buraya ne gidiyor ??") koyabileceğim bir şey var mı?


İlk önce [Yn]*); muhtemelen demek istedin [Yy]*).
dhag

1
İlk yanıtladığımdan beri kodunuzu düzenlediniz, ancak olması $TEST=1gereken her durumda not edin TEST=1ve komut dosyanızın bu değişiklikle çalışması çok olasıdır.
dhag

doh, evet test ederken gördüm!
the_velour_fog

@dhag Sanırım düzenlemenizi geliştirdim - lütfen bir göz atın. Görünüşe göre amacınız kodu, kabul ettiğiniz yanıtın uygun olduğu bir şeye yeniden yazmak ve şimdi daha yakın olduğunu düşünüyorum.
derobert

@derobert: Yaptığınız düzenleme bana iyi geliyor; kesinlikle soruyu daha açık hale getiriyor.
dhag

Yanıtlar:


30

Kullanıcının "y" girmesi durumunda, hem while hem de case'den çıkabilirsiniz:

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.

Senin durumunda yapmak istiyorsun break 2.


1
teşekkürler, evet break 2yaptı, yukarıdaki yorumunuzla ilgili olarak, evet bir değişken belirlemeye çalıştım, ama işe yaramadı - Ben bash süre ve vaka blokları içinde yerel kapsamı olduğunu tahmin ediyorum? aksine PHP
the_velour_fog

Hayır, bash değişkenleri yerel değildir (bunları açıkça bildirmediğiniz sürece), bu nedenle yaptığınız gibi TEST'e atama işlemi casewhile döngüsünün testine yansıtılmalıdır.
dhag

Ah anladım, [Yy]dava bloğunun içinde başka bir görev yapıyordum . sorumu yansıtmak için küçük bir düzenleme yaptım, ama haklısın - teşekkürler birkaç harika şey öğrendim!
the_velour_fog

Bu durumda, breakyeterlidir. Kodda iki düzey döngü görmüyorum.
xhienne

@xhienne: Doğru görünüyorsun! Ne düşündüğümden emin değilim.
dhag

1

@dhag'ın harika bir cevabı var. Ayrıca kullanabilirsin:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.