ฉันจะแยกออกจาก while loop ได้อย่างไรจากภายในคำสั่ง 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มีการป้อนแบ่งสคริปต์ออกของทั้งสองcase และในขณะที่บล็อก แต่ไม่ได้ออกทั้งหมด มีบางอย่างที่ฉันสามารถใส่ไว้ในตัวยึดตำแหน่ง ("เกิดอะไรขึ้นที่นี่ ??") เพื่อทำสิ่งนั้น?


โปรดทราบว่าครั้งแรก[Yn]*); [Yy]*)คุณอาจหมายถึง
dhag

1
คุณแก้ไขรหัสของคุณตั้งแต่ฉันตอบครั้งแรก แต่ควรทราบในกรณีใด ๆ ที่$TEST=1ควรเป็นTEST=1และสคริปต์ของคุณมีแนวโน้มที่จะทำงานกับการเปลี่ยนแปลงนี้
dhag

ใช่ฉันเห็นว่าเมื่อทดสอบ!
the_velour_fog

@dhag ฉันคิดว่าฉันได้ปรับปรุงการแก้ไขของคุณ - โปรดดู ดูเหมือนว่าเป้าหมายของคุณคือการเขียนรหัสใหม่เป็นสิ่งที่คำตอบที่คุณยอมรับนั้นเหมาะสมและฉันคิดว่าตอนนี้ใกล้เข้ามาแล้ว
Derobert

@derobert: การแก้ไขของคุณดูดีสำหรับฉัน มันทำให้คำถามชัดเจนขึ้น
dhag

คำตอบ:


30

ในกรณีที่ผู้ใช้ป้อน "y" คุณสามารถออกได้ทั้งขณะและกรณี:

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มันเกี่ยวกับความคิดเห็นของคุณด้านบนใช่ฉันพยายามตั้งค่าตัวแปร แต่มันใช้งานไม่ได้ - ฉันเดาว่าทุบตีมีขอบเขตในตัวภายในขณะที่และบล็อกกรณี? ไม่เหมือนเช่น PHP
the_velour_fog

ไม่ตัวแปร bash ไม่ใช่แบบโลคัล (เว้นแต่คุณจะประกาศอย่างชัดเจน) ดังนั้นการกำหนดให้กับ TEST ภายในcaseตามที่คุณทำควรสะท้อนให้เห็นในการทดสอบลูปในขณะที่
dhag

อ่าเข้าใจแล้วฉันกำลังทำงานที่ได้รับมอบหมายอีกภายใน[Yy]บล็อกเคส ทำการแก้ไขเล็กน้อยภายในคำถามของฉันเพื่อไตร่ตรอง แต่สิทธิ์ของคุณใช้งานได้ - ขอบคุณฉันได้เรียนรู้สิ่งดีๆสองสามอย่าง!
the_velour_fog

ในกรณีนี้breakก็เพียงพอแล้ว ฉันไม่เห็นลูปสองระดับในรหัส
xhienne

@xhienne: ดูเหมือนว่าคุณจะถูกต้อง! ฉันไม่แน่ใจว่าฉันคิดอะไรอยู่
dhag

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.