Làm thế nào tôi có thể thoát ra khỏi một vòng lặp while, từ trong một câu lệnh tình huống lồng nhau? [đóng cửa]


18

Trong tập lệnh bên dưới - nhắc người dùng xác nhận rằng họ muốn tiến hành chạy tập lệnh có khả năng xấu - khi người dùng nhập vào Ydấu nhắc - nó sẽ thoát ra khỏi casekhối, chỉ được gửi lại vào whilevòng lặp.

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

Khi nđược nhập, tập lệnh tồn tại hoàn toàn như mong muốn. Tôi muốn biết làm thế nào để làm cho nó khi Yđược nhập vào tập lệnh thoát ra khỏi cả khối case khối while, nhưng không thoát hoàn toàn. Có thứ gì tôi có thể đặt vào cho trình giữ chỗ ("Cái gì ở đây ??") để làm điều đó?


Lưu ý rằng đầu tiên [Yn]*); bạn có thể có nghĩa là [Yy]*).
dhag

1
Bạn đã chỉnh sửa mã của mình kể từ lần đầu tiên tôi trả lời, nhưng lưu ý trong mọi trường hợp $TEST=1nên TEST=1và tập lệnh của bạn rất có khả năng hoạt động với thay đổi này.
dhag

doh, vâng tôi đã thấy điều đó khi thử nghiệm!
the_velour_fog

@dhag Tôi nghĩ rằng tôi đã cải thiện bản chỉnh sửa của bạn, hãy xem. Có vẻ như mục tiêu của bạn là viết lại mã thành một cái gì đó mà câu trả lời được chấp nhận của bạn rất phù hợp và tôi nghĩ bây giờ nó gần hơn.
derobert

@derobert: Bản chỉnh sửa của bạn có vẻ tốt đối với tôi; nó chắc chắn làm cho câu hỏi rõ ràng hơn
dhag

Câu trả lời:


30

Trong trường hợp người dùng nhập "y", bạn có thể thoát cả trong khi và trường hợp:

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.

Trong trường hợp của bạn, bạn muốn làm break 2.


1
cảm ơn, vâng, break 2đã làm điều đó, liên quan đến nhận xét của bạn ở trên, vâng tôi đã thử đặt một biến, nhưng nó không hoạt động - Tôi đoán bash có phạm vi cục bộ trong khi khối và trường hợp? không giống như, ví dụ PHP
the_velour_fog 04/05/2015

Không, các biến bash không cục bộ (trừ khi bạn khai báo rõ ràng như vậy), vì vậy việc gán cho TEST trong phạm vi casenhư bạn đã làm sẽ được phản ánh trong bài kiểm tra cho vòng lặp while.
dhag

ah hiểu rồi, tôi đang thực hiện một nhiệm vụ khác trong [Yy]khối vụ án. thực hiện một chỉnh sửa nhỏ bên trong câu hỏi của tôi để phản ánh, nhưng quyền của bạn nó hoạt động - cảm ơn tôi đã học được một vài điều thú vị!
the_velour_fog

Trong trường hợp đó, breaklà đủ. Tôi không thấy hai cấp độ vòng lặp trong mã.
xhienne

@xhienne: Bạn có vẻ đúng! Tôi không chắc mình đang nghĩ gì.
dhag

1

@dhag có một câu trả lời tuyệt vời. Bạn cũng có thể dùng:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.