আমি বলতে চাই যে $string
একটি গ্লোব প্যাটার্নের সাথে কোনও স্ট্রিং মিলছে কিনা $pattern
। $string
বিদ্যমান ফাইলের নাম বা নাও থাকতে পারে। কিভাবে আমি এটি করতে পারব?
আমার ইনপুট স্ট্রিংগুলির জন্য নিম্নলিখিত ফর্ম্যাটগুলি ধরে নিন:
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
আমি একটি ব্যাশ বাগ্ধারা নির্ধারণ করে যে যদি এটি চাই $string
দ্বারা মেলানো হবে $pattern1
, $pattern2
, বা অন্য কোন অবাধ উল্লিখিত glob প্যাটার্ন। আমি এখন পর্যন্ত যা চেষ্টা করেছি তা এখানে:
[[ "$string" = $pattern ]]
এটি প্রায় কাজ করে, ব্যতীত
$pattern
স্ট্রিং প্যাটার্ন হিসাবে ব্যাখ্যা করা হয় এবং গ্লোব প্যাটার্ন হিসাবে নয়।[ "$string" = $pattern ]
এই পদ্ধতির সাথে সমস্যাটি
$pattern
হ'ল প্রসারিত হয় এবং তারপরে$string
এবং এর প্রসারণের মধ্যে স্ট্রিং তুলনা করা হয়$pattern
।[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
এটি কাজ করে, তবে কেবলমাত্র যদি
$string
এমন কোনও ফাইল থাকে যা বিদ্যমান থাকে।[[ $string =~ $pattern ]]
এটি কাজ করে না কারণ
=~
অপারেটর$pattern
একটি গ্লোব বা ওয়াইল্ডকার্ড প্যাটার্ন নয়, বর্ধিত নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা করার কারণ ঘটায় ।
ls /foo/*
এখন আপনি একটি
foo/{bar,baz}
আসলে একটি ব্রেস এক্সপেনশন (প্যারামিটার এক্সপেনশন নয়) যখন পথের foo/*
নাম সম্প্রসারণ। $string
প্যারামিটার সম্প্রসারণ। এগুলি বিভিন্ন সময়ে এবং বিভিন্ন প্রক্রিয়া দ্বারা সম্পন্ন হয়।
case
বিবৃতিটি ব্যাশ ম্যানুয়াল অনুসারে পাথনাম এক্সপেনশন ("গ্লোব্বিং") সম্পাদন করে।
{bar,baz}
কোনও নিদর্শন নয়। এটি প্যারামিটার সম্প্রসারণ। এর মধ্যে সূক্ষ্ম তবে সমালোচনামূলক পার্থক্যটি{bar,baz}
খুব তাড়াতাড়ি একাধিক যুক্তিতে প্রসারিত হয়bar
এবংbaz
।