বাশের [[ ]]নির্মাণ সম্পর্কে কয়েকটি গুরুত্বপূর্ণ বিষয় জানতে হবে । প্রথম:
ওয়ার্ড বিভাজন এবং পথনাম সম্প্রসারণ মধ্যে শব্দের উপর সঞ্চালিত হয় না [[এবং ]]; টিলডে এক্সপেনশন, প্যারামিটার এবং ভেরিয়েবল এক্সপেনশন, পাটিগণিতের সম্প্রসারণ, কমান্ড প্রতিস্থাপন, প্রক্রিয়া প্রতিস্থাপন এবং উদ্ধৃতি অপসারণ সম্পাদন করা হয় performed
দ্বিতীয় জিনিস:
অতিরিক্ত বাইনারি অপারেটর, '= ~' উপলভ্য, ... অপারেটরের ডানদিকে স্ট্রিং একটি বর্ধিত নিয়মিত অভিব্যক্তি হিসাবে বিবেচনা করা হয় এবং তদনুসারে ম্যাচ করা হয় ... প্যাটার্নের কোনও অংশই এটির সাথে জোর করতে বাধ্য করা যেতে পারে একটি স্ট্রিং হিসাবে ।
ফলস্বরূপ, এর $vউভয় পাশে =~সেই চলকের মানে প্রসারিত হবে, তবে ফলাফলটি শব্দ বিভাজন বা পথের নাম-প্রসারিত হবে না। অন্য কথায়, বাম-হাতের দিকের পরিবর্তনশীল বিস্তৃতিগুলি নিখুঁতভাবে ছেড়ে দেওয়া পুরোপুরি নিরাপদ তবে আপনার এটি জানতে হবে যে পরিবর্তনশীল বিস্তৃতি ডান হাতের দিকে ঘটবে।
তাই আপনি যদি লিখুন: [[ $x =~ [$0-9a-zA-Z] ]], $0ডান দিকে Regex ভিতরে আগে Regex ব্যাখ্যা করা হয় সম্প্রসারিত হবে, যা সম্ভবত কম্পাইল করার (ব্যর্থ Regex কারণ হবে, যদি না সম্প্রসারণ $0একটি অঙ্ক বা যতিচিহ্ন প্রতীক সঙ্গে প্রান্ত যার ASCII মান কম একটি অঙ্ক)। আপনি যদি ডান হাতের মতো [[ $x =~ "[$0-9a-zA-Z]" ]]একইভাবে উদ্ধৃতি দেন তবে ডান হাতটি একটি সাধারণ স্ট্রিং হিসাবে বিবেচনা করা হবে, রেজেক্স নয় (এবং $0এখনও প্রসারিত হবে)। এই ক্ষেত্রে আপনি যা চান তা হ'ল[[ $x =~ [\$0-9a-zA-Z] ]]
একইভাবে, মধ্যে অভিব্যক্তি [[এবং ]]সামনে Regex ব্যাখ্যা করা হয় শব্দ বিভক্ত করা হয়। সুতরাং রেজেক্সের ফাঁকা স্থানগুলি এড়ানো বা উদ্ধৃত হওয়া দরকার। আপনি অক্ষর, সংখ্যা বা স্পেস মেলে চেয়েছিলেন আপনি ব্যবহার করতে পারে: [[ $x =~ [0-9a-zA-Z\ ] ]]। অন্যান্য চরিত্রগুলিকে একইভাবে পালানো দরকার, যেমনটি #উদ্ধৃত না করা হলে একটি মন্তব্য শুরু করবে। অবশ্যই, আপনি একটি পরিবর্তনশীল মধ্যে প্যাটার্ন লাগাতে পারেন:
pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
রেগেক্সেসের মধ্যে অনেকগুলি অক্ষর রয়েছে যা বাশের লেক্সারের মধ্য দিয়ে যাওয়ার জন্য পালাতে বা উদ্ধৃত হওয়া প্রয়োজন, অনেক লোক এই স্টাইলটিকে পছন্দ করে। তবে সাবধান থাকুন: এক্ষেত্রে আপনি পরিবর্তনশীল প্রসারকে উদ্ধৃত করতে পারবেন না :
if [[ $x =~ "$pat" ]]; then ...
অবশেষে, আমি মনে করি আপনি যা করতে চেষ্টা করছেন তা ভেরিয়েবলটিতে বৈধ অক্ষর রয়েছে কিনা তা যাচাই করা। এই চেকটি করার সহজতম উপায় হ'ল এটি নিশ্চিত করা যে এটিতে কোনও অবৈধ অক্ষর নেই। অন্য কথায়, এর মত একটি প্রকাশ:
valid='0-9a-zA-Z $%&#'
if [[ ! $x =~ [^$valid] ]]; then ...
!পরীক্ষাকে অবহেলা করে, এটিকে "মেলে না" অপারেটর হিসাবে রূপান্তরিত করে এবং একটি [^...]রেজেক্স চরিত্র শ্রেণীর অর্থ "ব্যতীত অন্য কোনও চরিত্র ..."।
প্যারামিটার সম্প্রসারণ এবং রেজেক্স অপারেটরগুলির সংমিশ্রণে বাশকে নিয়মিত এক্সপ্রেশন সিনট্যাক্স তৈরি করতে পারে "প্রায় পাঠযোগ্য", তবে এখনও কিছু গোটাচ রয়েছে। (সর্বদা থাকে না?) একটি হ'ল আপনি প্রথমে বাদে উদ্ধৃতি দিয়ে থাকলেও ]into োকাতে $validপারেন $validনি। (এটা একটা Posix Regex নিয়ম: আপনি অন্তর্ভুক্ত করতে চান ]। একটি অক্ষর বর্গ, এটা শুরুতে যেতে প্রয়োজন -শুরুতে বা শেষে যেতে পারেন, তাই যদি আপনি উভয় প্রয়োজন ]এবং -আপনার সাথে শুরু করতে ]এবং শেষ -, "আমি জানি আমি কি করছি" ইমেটিকনকে রেইজেক্সের দিকে নিয়ে যাওয়া [][-]:)