নেস্টেড কেস স্টেটমেন্টের মধ্যে থেকে কীভাবে আমি কিছুক্ষণের লুপটি ভেঙে ফেলব? [বন্ধ]


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]*)
ধাগ

1
আপনি যে কোনো ক্ষেত্রে যে আপনার কোড যেহেতু আমি প্রথম উত্তর দিলেন, কিন্তু নোট সম্পাদিত $TEST=1হওয়া উচিত TEST=1, এবং আপনার স্ক্রিপ্ট এই পরিবর্তন এর সাথে কাজ করা খুব সম্ভাবনা রয়েছে।
ধাগ

দোহ, হ্যাঁ আমি দেখেছি যখন পরীক্ষার সময়!
the_velour_fog 20

@ ধাগ আমার ধারণা আমি আপনার সম্পাদনার উন্নতি করেছি — দয়া করে একবার দেখুন take মনে হচ্ছে আপনার লক্ষ্যটি কোডটিকে এমন কোনও কিছুতে পুনর্লিখন করা যেখানে আপনার গৃহীত উত্তরগুলি ভাল ফিট করে এবং আমি মনে করি এটি এখনই নিকটে।
ডার্বার্ট

@ডারবার্ট: আপনার সম্পাদনাটি আমার কাছে দুর্দান্ত দেখাচ্ছে; এটি অবশ্যই প্রশ্নকে আরও পরিষ্কার করে দেয়।
ধাগ

উত্তর:


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এটি করেছে, উপরের আপনার মন্তব্য সম্পর্কে, হ্যাঁ আমি একটি পরিবর্তনশীল সেট করার চেষ্টা করেছি, তবে এটি কার্যকর হয়নি - আমি অনুমান করছি যে ব্যাশের স্থানীয় সুযোগ আছে এবং কেস ব্লক রয়েছে? বিপরীতে, উদাহরণস্বরূপ পিএইচপি
দ্য_ভালোয়ার_ফোগ

না, ব্যাশ ভেরিয়েবলগুলি স্থানীয় নয় (আপনি যদি এগুলি স্পষ্টভাবে প্রকাশ না করেন), সুতরাং আপনার caseযেমন করা হয়েছে তেমনই টেস্টকে বরাদ্দ করা হবে যখন লুপের জন্য পরীক্ষায় প্রতিফলিত হওয়া উচিত।
ধাগ

আহ এটা পেয়েছে, আমি [Yy]কেস ব্লকের ভিতরে আরও একটি কার্য সম্পাদন করছি । প্রতিবিম্বিত করতে আমার প্রশ্নের ভিতরে একটি সামান্য সম্পাদনা করেছেন, তবে আপনার ঠিক কাজ করে - ধন্যবাদ আমি বেশ কয়েকটি দুর্দান্ত জিনিস শিখেছি!
the_velour_fog

সেক্ষেত্রে breakযথেষ্ট। আমি কোডে দুটি স্তরের লুপ দেখতে পাচ্ছি না।
xhienne

@ শিহেন: আপনি ঠিক আছেন বলে মনে হচ্ছে! আমি কী ভাবছিলাম তা নিশ্চিত নই।
haগস্ট

1

@ ধাগের দুর্দান্ত উত্তর রয়েছে। আপনি এটি ব্যবহার করতে পারেন:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.