Bagaimana saya bisa keluar dari loop sementara, dari dalam pernyataan kasus bersarang? [Tutup]

18

Dalam skrip di bawah ini - yang meminta pengguna untuk mengonfirmasi bahwa mereka ingin melanjutkan menjalankan skrip yang berpotensi buruk - ketika pengguna memasukkan Yprompt - itu akan keluar dari caseblok, hanya untuk dikirim kembali ke whileloop lagi.

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

Ketika ndimasukkan, skrip ada sepenuhnya seperti yang diinginkan. Saya ingin tahu bagaimana membuatnya sehingga ketika Ydimasukkan istirahat script keluar dari kedua case dan sementara blok, tetapi tidak keluar sama sekali. Apakah ada sesuatu yang bisa saya masukkan untuk placeholder ("Apa yang terjadi di sini ??") untuk melakukan itu?

the_velour_fog
sumber
Catat itu dulu [Yn]*); Anda mungkin berarti [Yy]*).
Dhag
1
Anda telah mengedit kode Anda sejak saya pertama kali menjawab, tetapi perhatikan dalam hal apa pun yang $TEST=1seharusnya TEST=1, dan skrip Anda sangat mungkin bekerja dengan perubahan ini.
Dhag
doh, ya saya melihat itu saat pengujian!
the_velour_fog
@ Dhag Saya pikir saya telah memperbaiki hasil edit Anda — silakan lihat. Tampaknya tujuan Anda adalah menulis ulang kode menjadi sesuatu yang cocok dengan jawaban yang Anda terima, dan saya pikir itu lebih dekat sekarang.
derobert
@derobert: Hasil edit Anda terlihat bagus untuk saya; itu tentu membuat pertanyaan lebih jelas.
Dhag

Jawaban:

30

Dalam kasus di mana pengguna memasukkan "y", Anda dapat keluar sementara dan huruf besar-kecil:

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.

Dalam kasus Anda, Anda ingin melakukannya break 2.

Dhag
sumber
1
terima kasih, ya break 2, mengenai komentar Anda di atas, ya saya mencoba mengatur variabel, tetapi tidak berhasil - Saya kira bash memiliki cakupan lokal dalam blok sementara dan kasus? tidak seperti, misalnya PHP
the_velour_fog
Tidak, variabel bash bukan lokal (kecuali jika Anda secara eksplisit menyatakannya), jadi menetapkan ke TEST di dalam caseseperti yang Anda lakukan harus tercermin dalam tes untuk loop sementara.
Dhag
ah mengerti, saya sedang melakukan tugas lain di dalam [Yy]blok kasus. membuat sedikit edit di dalam pertanyaan saya untuk mencerminkan, tetapi hak Anda berhasil - terima kasih saya telah belajar beberapa hal keren!
the_velour_fog
Dalam hal ini, breaksudah cukup. Saya tidak melihat dua level loop dalam kode.
xhienne
@xhienne: Tampaknya Anda benar! Saya tidak yakin apa yang saya pikirkan.
Dhag
1

@ Dhag memiliki jawaban yang bagus. Anda juga bisa menggunakan:

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