[[বাশে মামলার সমতুল্যতা


13

নেই

if [[ "$1" = pattern ]]; then
    hook
fi

সর্বদা হিসাবে একই আচরণ

case "$1" in
    pattern) hook;;
esac

নাকি কোন গ্যাটাচস আছে?


1
সেগুলিতে বা তার পরে shoptসেটিংস এবং মানগুলি নির্বিশেষে আমি তাদের কোনও ক্ষেত্রেই খুঁজে পাচ্ছি না । পার্থক্য কেবলমাত্র এটির অধীনে চলমান অবস্থায় আউটপুটটিতে প্রসারিত হয় না । $1pattern$?$1xtrace
কুসালানন্দ

উত্তর:


7

হ্যাঁ, এগুলি (প্রায়) সম্পূর্ণ সমতুল্য।


বিস্তারিত

একটি [ … ]নির্মাণের ভিতরে :

=অপারেটর (অথবা এমনকি অ posix বিকল্প ==) স্ট্রিং মেলা, না প্যাটার্ন ম্যাচিং পরীক্ষা।

একটি [[ ]]কনস্ট্রাক্টের ভিতরে (ম্যান বাশ থেকে):

যখন == এবং! = অপারেটরগুলি ব্যবহার করা হয়, তখন অপারেটরের ডানদিকে স্ট্রিংটিকে একটি প্যাটার্ন হিসাবে বিবেচনা করা হয় এবং প্যাটার্ন ম্যাচিংয়ের অধীনে নীচে বর্ণিত বিধি অনুসারে মেলা ভার । শেল অপশনটি নোকাসেম্যাচ সক্ষম থাকলে, বর্ণমালার অক্ষরের ক্ষেত্রে বিবেচনা না করে ম্যাচটি সম্পাদিত হয় । যদি স্ট্রিংটি (==) মেলে বা (! =) প্যাটার্নের সাথে মেলে না, এবং অন্যথায় 1 টির সাথে প্রত্যাবর্তনের মান 0 হবে। প্যাটার্নের যে কোনও অংশই স্ট্রিং হিসাবে মিলতে বাধ্য করার জন্য উদ্ধৃত করা যেতে পারে।

একটি caseকনস্ট্রাক্টের ভিতরে (ম্যান ব্যাশ, সম্পাদিত এবং জোর দেওয়া খনি থেকে):

কেস শব্দটি [[(প্যাটার্ন [| প্যাটার্ন] ...) তালিকায় ;; ] ... esac
... চেষ্টা ঘুরে প্রতিটি প্যাটার্ন বিরুদ্ধে মেলে, একই ম্যাচিং ব্যবহার বিধি হিসাবে পথনাম সম্প্রসারণ (নীচে পথনাম সম্প্রসারণ দেখুন)। … পরীক্ষা করা প্রতিটি প্যাটার্নটি টিলডে সম্প্রসারণ, পরামিতি এবং পরিবর্তনশীল সম্প্রসারণ, পাটিগণিত প্রতিস্থাপন, কমান্ড প্রতিস্থাপন এবং প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে প্রসারিত করা হয়। শেল অপশনটি নোকাসেম্যাচ সক্ষম থাকলে, বর্ণমালার অক্ষরের ক্ষেত্রে বিবেচনা না করে ম্যাচটি সম্পাদিত হয়

উভয় Pattern Matchingএবং Pathname Expansionব্যাশ ম্যানুয়ালটিতে একই অর্থ ব্যবহৃত হয়।

আমি ম্যানুয়ালটিতে কেবলমাত্র পার্থক্যটি দেখতে পাচ্ছি:

`[[ … ]]`                                   case
tilde  expansion                            tilde expansion
parameter and variable expansion            parameter and variable expansion
arithmetic expansion                        arithmetic substitution
command substitution                        command substitution
process substitution                        process substitution
quote removal

যে quote removalস্পষ্টভাবে ক্ষেত্রে কনস্ট্রাক্ট জন্য তালিকাভুক্ত করা হয় না।
এটি (এটির জন্য [[ … ]]) হুবহু মেলে কাজ করে :

প্যাটার্নের যে কোনও অংশই স্ট্রিং হিসাবে মিলতে বাধ্য করার জন্য উদ্ধৃত করা যেতে পারে।

এই শেষ বিন্দু (বর্তমানে পরিবর্তনশীল পরীক্ষা করার জন্য ব্যবহার করুন না একটি প্যাটার্ন):

case "$1" in
  "$pattern") echo case match
esac

কেন প্রায়?

  1. অন্তর্নিহিত extglob:

    যেহেতু ব্যাশ সংস্করণ 4.3

    যখন '==' এবং '! =' অপারেটরগুলি ব্যবহার করা হয় তখন অপারেটরের ডানদিকে স্ট্রিংটি একটি প্যাটার্ন হিসাবে বিবেচনা করা হয় এবং প্যাটার্ন ম্যাচিংয়ে নীচে বর্ণিত বিধি অনুসারে ম্যাচ করা হয় , যেমন এক্সট্র্লোব শেল বিকল্পটি সক্ষম করা হয়েছিল

    এর অর্থ হ'ল extglob আনসেট অপশনটির সাথে ব্যবহৃত প্যাটার্নটি কেস স্টেটমেন্টে [[বাশ সংস্করণের ৪.৩ সংস্করণের পরে আলাদাভাবে কাজ করবে inside

  2. অন্তর্নিহিত |:

    ক্ষেত্রে সিনট্যাক্সটি হ'ল:

    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

    যার অর্থ এখানে একটি |(ওআর) দ্বারা বিভক্ত বেশ কয়েকটি নিদর্শন থাকতে পারে ।

    এটার মত:

    shopt -s extglob;      p1="+([0-9])";       p2="+([abcde])"
    
    case "$1" in
        $p1|$p2)    echo "or case match" ; ;;
    esac

    যা কেবলমাত্র সংখ্যার একটি স্ট্রিংয়ের সাথে মেলে বা কেবলমাত্র অক্ষরের মধ্যে abcde, যেমন 1234বা aabeeতবে, কিন্তু নয় 12aবা b23

    একটি [[সমানভাবে কাজ করবে যদি রেজেক্স (var p3 দেখুন) ব্যবহার করা হয়:

    #!/bin/bash
    
    shopt -s extglob           ### Use extended globbing.
    shopt -s globasciiranges   ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
    
    pattern="+([0-9])"
    p1="+([0-9])"
    p2="+([a-z])"
    p3="^([0-9]+|[a-z]+)$"
    
    case "$1" in
        $pattern)   echo case1 match ; ;&
        $p1|$p2)    echo case2 match ; ;;
    esac
    
    [[ "$1" == $pattern ]] && echo if1 match
    [[ "$1" =~ $p3 ]] && echo if2 match
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.