পতনের সাথে মামলা স্যুইচ করবেন?


193

আমি ব্যাশে পতিত হওয়া মামলাগুলির সাথে স্যুইচ বিবৃতিটির সঠিক বাক্য গঠনটি খুঁজছি (আদর্শ ক্ষেত্রে সংবেদনশীল)। পিএইচপি-তে আমি এটির মতো প্রোগ্রাম করতাম:

switch($c) {
    case 1:
        do_this();
        break;
     case 2:
     case 3:
        do_what_you_are_supposed_to_do();
        break;
     default:
        do_nothing(); 
}

আমি বাশে একই চাই:

case "$C" in
    "1")
        do_this()
        ;;
    "2")
    "3")
        do_what_you_are_supposed_to_do()
        ;;
    *)
        do_nothing();
        ;; 
esac

এটি কোনওভাবে কাজ করে না: do_what_you_are_supposed_to_do()$ C 2 বা 3 হয় তখন ফাংশনটি বরখাস্ত করা উচিত।


4
পেরেনদের সাথে কল ফাংশন ব্যবহার করবেন না !!! যেহেতু আপনি বাশে কোনও ফাংশন সংজ্ঞায়িত করতে পারেন function fname { echo "Inside fname"; return 0; }বা fname() { echo "inside fname"; return 0; }কোনও ফাংশন কলে পেরেন রেখেছেন এটি কোনও ফাংশন সংজ্ঞা হিসাবে দেখতে পারে। কার্যাবলী অন্য কোন কমান্ড লাইন প্রোগ্রাম যেমন মত বলা উচিত mv, cp, rsync, ls, cd, ইত্যাদি ... এই ক্ষেত্রে আমরা কলে fname যেমন: fname $ARGS
চার্লস অ্যাডিস

do_nothing()একটি এসকিআইপি বিবৃতি হবে? ব্যবহার :
sjas

উত্তর:


309

|"বা" এর জন্য একটি উল্লম্ব বার ( ) ব্যবহার করুন।

case "$C" in
"1")
    do_this()
    ;;
"2" | "3")
    do_what_you_are_supposed_to_do()
    ;;
*)
    do_nothing()
    ;;
esac

30
অথবা এই সাধারণ ক্ষেত্রে একটি অক্ষর শ্রেণি[23])
সিজেএক্সএক্স

4
@ মিশচকা - আমি মনে করি আপনি এই উত্তরটি গ্রহণ করেননি, কারণ এটি প্রশ্নের উত্থানের অংশটির উত্তর দেয় না? do_what_you_are_supposed_to_do()"2" এবং "3" উভয়কেই একক ক্ষেত্রে ভাগ করে দেওয়ার জন্য যেখানে বিশেষ প্রসেসিংয়ের আগে বিশেষ প্রসেসিং হওয়া উচিত , ফলস্রো যুক্তিটি কার্যকর this এই বিষয়টিকে পরিষ্কার করার জন্য প্রশ্নটি সম্পাদনা করা যুক্তিসঙ্গত কিনা আমি নিশ্চিত নই, কেননা এটি স্পষ্টই যে বহু লোক এই উত্তরকে সহায়ক বলে মনে করেছে।
টাইসন

1
@ টাইসন ওপি উত্তরটি গ্রহণ করে নি, কারণ এটি নিবন্ধভুক্ত ব্যবহারকারী। "ফল-থ্রু" যুক্তি হিসাবে, সাধারণত প্রোগ্রামারদের দ্বারা বোঝা যায়, প্রশ্ন সংস্থার পতনের মধ্য দিয়ে যুক্তি নয় , অবস্থার বিপর্যয় দেখায় । (লক্ষ্য করুন ব্যবহারের breakপিএইচপি কোডে।) প্রশ্ন, অথবা তার শিরোনাম সম্পাদনা করা, এই তারিখে উত্তর যার অনেকগুলোই বাতিল হবে না প্রদান যুক্তিবিজ্ঞান পতনের মাধ্যমে, এবং সম্ভবত সম্পন্ন করা উচিত নয়। অন্যান্য ব্যবহারকারীদের বেশ কয়েকটি সম্পাদনা না হওয়া পর্যন্ত শিরোনামে পতন হয়নি, তবে এখনই এটি আবার বের করতে দেরি হয়ে গেছে।
ব্যবহারকারী 7412956

100

সাম্প্রতিক bashসংস্করণ অনুমতি পতনের মাধ্যমে ব্যবহার করে ;&পরিবর্তে ;;, আর তারা তা ব্যবহার করে কেস চেক চালু করার অনুমতি ;;&নেই।

for n in 4 14 24 34
do
  echo -n "$n = "
  case "$n" in
   3? )
     echo -n thirty-
     ;;&   #resume (to find ?4 later )
   "24" )
     echo -n twenty-
     ;&   #fallthru
   "4" | [13]4)
     echo -n four 
     ;;&  # resume ( to find teen where needed )
   "14" )
     echo -n teen
  esac
  echo 
done

নমুনা আউটপুট

4 = four
14 = fourteen
24 = twenty-four
34 = thirty-four

1
এই উদাহরণে এই যুক্তি অনুসরণ করা কঠিন ছিল। এছাড়াও, আমি মনে করি না এই উদাহরণটি সত্যই ;&এবং এর মধ্যে পার্থক্য প্রদর্শন করে ;;&। আমি পরিবর্তন "24"করতে ;;& # resumeএবং একই ফলাফল পেয়েছেন, তাই আমি এখনও ভাবছি করছি যখন আপনি ব্যবহার করেন ;&fallthrough।
উইসবাকি

1
এটি একটি জটিল জিনিসের জন্য একটি সহজ উদাহরণ - আমি পরিবর্তিত ?4করতে [13]4এটি আরো সুস্পষ্ট করা, এবং আপনার পরিবর্তন একটি অবিচ্ছিন্ন পরিবর্তন করতে
Jasen

26
  • ব্যবহার করবেন না ()আপনি ব্যাখ্যায় ফাংশন নামের পিছনে যদি না আপনি সেগুলি সংজ্ঞায়িত করতে চান।
  • [23]মেলে ক্ষেত্রে ব্যবহার করুন 2বা3
  • স্থিতিশীল স্ট্রিং ক্ষেত্রে এর ''পরিবর্তে সংযুক্ত করা উচিত""

যদি সংযুক্ত থাকে "", দোভাষী (অযথা) মিলের আগে মানটিতে সম্ভাব্য ভেরিয়েবলগুলি প্রসারিত করার চেষ্টা করে।

case "$C" in
'1')
    do_this
    ;;
[23])
    do_what_you_are_supposed_to_do
    ;;
*)
    do_nothing
    ;;
esac

সংবেদনশীল মিলের ক্ষেত্রে, আপনি অক্ষর শ্রেণিগুলি (যেমন [23]) ব্যবহার করতে পারেন :

case "$C" in

# will match C='Abra' and C='abra'
[Aa]'bra')
    do_mysterious_things
    ;;

# will match all letter cases at any char like `abra`, `ABRA` or `AbRa`
[Aa][Bb][Rr][Aa])
    do_wild_mysterious_things
    ;;

esac

কিন্তু abra কোনও দিন আঘাত করেনি কারণ এটি প্রথম কেসের সাথে মিলে যাবে।

যদি প্রয়োজন হয়, আপনি ;;নিম্নলিখিত ক্ষেত্রেও ম্যাচের জন্য পরীক্ষা চালিয়ে যেতে প্রথম ক্ষেত্রে বাদ দিতে পারেন । ( ;;লাফানো esac)


case "${C,,}" in
কেসটি

1
আপনি যদি বাদ দেন তবে কী হবে ;;? আপনি ;&পতনের জন্য ব্যবহার করার কথা না ?
হ্যালো গুডবাই

1
আমি পরীক্ষা চালিয়ে যেতে চাইলে আমাকে ;; ব্যবহার করা দরকার বাদ দিলে আমি একটি সিনট্যাক্স ত্রুটি পাই ;;&
জেসেন

do_wild_mysterious_thingsআমার দিনটি তৈরি করেছে
জুলিয়েন__

14

এটা চেষ্টা কর:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
special)
    echo -n "This does "
    ;&
fallthrough)
    echo "fall-through"
    ;;
esac

1
এটি একটি খুব সহায়ক টিপ। কমপক্ষে 4.3.11 বাশের জন্য। আমি এটি অন্য কারও জন্য চেষ্টা করার বিরক্ত করি না।
ড্যানিয়েল

3
দ্রষ্টব্য: এটি ব্যাশ 3.2 এর জন্য কাজ করে না, যা এখনও ম্যাকোজে ডিফল্ট ব্যাশ।
ড্যানি কির্চমিয়ার

13

মানগুলি যদি পূর্ণসংখ্যা হয় তবে আপনি ব্যবহার করতে পারেন [2-3]বা [5,7,8]অ অবিচ্ছিন্ন মানগুলির জন্য ব্যবহার করতে পারেন ।

#!/bin/bash
while [ $# -gt 0 ];
do
    case $1 in
    1)
        echo "one"
        ;;
    [2-3])
        echo "two or three"
        ;;
    [4-6])
        echo "four to six"
        ;;
    [7,9])
        echo "seven or nine"
        ;;
    *)
        echo "others"
        ;;
    esac
    shift
done

মানগুলি যদি স্ট্রিং হয় তবে আপনি ব্যবহার করতে পারেন |

#!/bin/bash
while [ $# -gt 0 ];
do
    case $1 in
    "one")
        echo "one"
        ;;
    "two" | "three")
        echo "two or three"
        ;;
    *)
        echo "others"
        ;;
    esac
    shift
done

shiftএর শেষে কি ?
মিল্কনকুকিজ

1
shiftসি এল এল আর্গুমেন্ট তালিকার প্রথম যুক্তি সরিয়ে দেয়। মূলত এই লুপের প্রতিটি পুনরাবৃত্তির উপরে সর্বদা $1CLI আর্গুমেন্ট তালিকা থেকে প্রতিটি যুক্তির সাহায্যে ব্যবহৃত হয় shift
রাশোক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.