मैं नेस्टेड केस स्टेटमेंट के भीतर से कुछ समय के लूप को कैसे तोड़ सकता हूं? [बन्द है]


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]*)
19

1
आपने अपना कोड संपादित किया जब से मैंने पहली बार उत्तर दिया था, लेकिन किसी भी मामले में ध्यान दें जो $TEST=1होना चाहिए TEST=1, और आपकी स्क्रिप्ट इस परिवर्तन के साथ काम करने की संभावना है।
०११ को ०४:०१

दो, हाँ मैंने देखा कि जब परीक्षण!
the_velour_fog

@ मुझे लगता है कि मैंने आपके संपादन में सुधार किया है - कृपया एक नज़र डालें। ऐसा लगता है कि आपका लक्ष्य कोड को फिर से लिखना है जहां आपका स्वीकृत उत्तर अच्छी तरह से फिट बैठता है, और मुझे लगता है कि यह अब करीब है।
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यह आपकी टिप्पणी के बारे में था, हाँ, मैंने एक चर स्थापित करने की कोशिश की, लेकिन यह काम नहीं किया - Im अनुमान लगा बैश में स्थानीय गुंजाइश है जबकि मामला और ब्लॉक? इसके विपरीत, उदाहरण के लिए PHP
the_velour_fog

नहीं, बैश वैरिएबल स्थानीय नहीं हैं (जब तक कि आप स्पष्ट रूप से उन्हें ऐसा घोषित नहीं करते हैं), इसलिए टेस्ट को उसी तरह से असाइन करना caseजैसा कि आपने लूप के टेस्ट में दर्शाया है।
ढग

आह यह मिला, मैं [Yy]केस ब्लॉक के अंदर एक और असाइनमेंट कर रहा था । प्रतिबिंबित करने के लिए मेरे प्रश्न के अंदर थोड़ा संपादित करें, लेकिन आपका अधिकार यह काम करता है - धन्यवाद मैंने कुछ शांत चीजें सीखीं!
the_velour_fog

उस मामले में, breakपर्याप्त है। मुझे कोड में दो स्तर के लूप नहीं दिख रहे हैं।
13

@xhienne: आप सही प्रतीत होते हैं! मुझे यकीन नहीं है कि मैं क्या सोच रहा था।
ढग

1

@dag का शानदार जवाब है। आप भी उपयोग कर सकते हैं:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.