আমি কীভাবে ব্যাশ স্ক্রিপ্টে নিয়মিত প্রকাশের সাথে একটি পরীক্ষা প্রত্যাখ্যান করব?


173

জিএনইউ ব্যাশ (সংস্করণ .3.০.৩5 (১) -রিলেজ (x86_64-সুস-লিনাক্স-গনু) ব্যবহার করে আমি নিয়মিত এক্সপ্রেশন দিয়ে একটি পরীক্ষা উপেক্ষা করতে চাই example উদাহরণস্বরূপ, আমি শর্তসাপেক্ষে PATH ভেরিয়েবলের একটি পথ যুক্ত করতে চাই, যদি পথটি ইতিমধ্যে না থাকে তবে যেমন:

TEMP=/mnt/silo/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if [[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH; else PATH=$PATH:$TEMP; fi
export PATH

আমি নিশ্চিত যে এটি করার লক্ষ লক্ষ উপায় রয়েছে তবে আমি কী জানতে চাই যে শর্তসাপেক্ষে কোনওভাবে উপেক্ষা করা যেতে পারে (যেমন ভ্রান্ত):

TEMP=/mnt/silo/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/Scripts:
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
TEMP=/mnt/silo/local/bin
if ![[ ${PATH} =~ ${TEMP} ]] ; then PATH=$PATH:$TEMP; fi
export PATH

উত্তর:


193

আপনার এটি ঠিক আছে, কেবল !এবং এর [[মতো একটি জায়গা রেখে দিনif ! [[


14
ওহে ভে! ঠিক যখন আমি নিরাপদে পার্লের আন্তঃগ্যালাকটিক বিশেষ চরিত্রের উন্মাদনাটিকে পাশ কাটিয়েছি, আমি নিজেকে বাশ স্পেসে (প্লেসমেন্ট) হারিয়েছি! (অজগরটির মতো আমার পেট চেপে যাওয়ার ভয় বোধ করছি।) ধন্যবাদ!
ডেভিড রজার্স

126

আপনি বন্ধনীগুলির ভিতরে উদ্দীপনা চিহ্নটিও রাখতে পারেন:

if [[ ! $PATH =~ $temp ]]

তবে মিথ্যা ধনাত্মক হ্রাস করতে আপনার প্যাটার্নটি অ্যাঙ্কর করা উচিত:

temp=/mnt/silo/bin
pattern="(^|:)${temp}(:|$)"
if [[ ! "${PATH}" =~ ${pattern} ]]

যা শুরুতে বা তার আগে (বা উভয়) আগে বা পরে কোলন দিয়ে কোনও মিল খুঁজে পায়। শেল ভেরিয়েবলের সাথে নামের সংঘর্ষের সম্ভাবনা হ্রাস করার জন্য আমি অভ্যাস হিসাবে ছোট হাতের বা মিক্সড কেস ভেরিয়েবল নামগুলি ব্যবহার করার পরামর্শ দিই।


আহ, অ্যাঙ্করিং সম্পর্কে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ। ছোট হাতের বা মিক্সড ভেরিয়েবলের নাম ব্যবহারের ধারণাটি ব্যাশ শৃঙ্খলাবদ্ধকে বিভ্রান্ত করছে, যেহেতু আমি এখন পর্যন্ত যে পরামর্শটি দেখেছি তা হ'ল বড় হাতের ব্যবহার। আপনি যে পয়েন্টটি তৈরি করছেন তা আমি বুঝতে পেরেছি, তবে আমি রান্না বইয়ের (আমার বোঝার) দিক থেকে বিচ্যুত হওয়া স্বাচ্ছন্দ্য বোধ করার মতো পর্যাপ্ত বাশ স্ক্রিপ্টিং উদাহরণ দেখিনি।
ডেভিড রজার্স

4
@ অনিয়োনিস এটির উপর আমাদের বিশ্বাস করুন। ব্যবহারকারী-সংজ্ঞায়িত বড় হাতের অক্ষর ব্যবহার এড়ানো উচিত। ব্যাশের সমস্ত ভেরিয়েবলগুলি এর সাথে প্রসারিত হয় $সুতরাং এগুলি বড় হয়ে দাঁড় করানোর জন্য বড় হাতের কোনও কারণ নেই।
সিজেএক্স

আমি খুঁজে if [[ ! $foo =~ bar ]]চেয়ে নিরাপদ if ! [[ $foo =~ bar ]], কারণ এটি সহজ করে তোলে আরো অবস্থার পরিচয় করিয়ে দিতেif
CTodea


9

হ্যাঁ আপনি সিজেএক্স ইতিমধ্যে চিহ্নিত করেছেন হিসাবে আপনি পরীক্ষা প্রত্যাখ্যান করতে পারেন ।

তবে এর জন্য আপনার নিয়মিত প্রকাশগুলি ব্যবহার করা উচিত নয় - এটি যদি আপনার পথে বিশেষ অক্ষর থাকে তবে এটি ব্যর্থ হতে পারে। পরিবর্তে এটি চেষ্টা করুন:

[[ ":$PATH:" != *":$1:"* ]]

(উৎস)


1
এই ফর্মটি এটি ব্যবহার করার আর একটি কারণ যা এটি ঘটনাক্রমে সাবস্ট্রিংয়ের সাথে মেলে না (যেমন "/ usr / bin" ইতিমধ্যে রয়েছে বলে "/ বিন" যোগ করতে ব্যর্থ হয়েছে)।
গর্ডন ডেভিসন

বাম দিকের কলোনগুলি কীভাবে আমাকে চাইছিল অ্যাঙ্করিং দিয়েছে তা বুঝতে আমার কিছুটা সময় লেগেছে। স্ট্রিংয়ের সাথে অনুসন্ধানের জন্য উপাদান যুক্ত করে প্যাটার্নটি হ্রাস করার ধারণাটি মনে রাখার মতো। আমি বুঝতে পারি না যে পথে বিশেষ চরিত্রগুলি কেন রেগেক্স সমাধানকে ব্যাহত করবে তবে বাশ প্যাটার্ন সমাধানটি নয়। তুমি কি আমাকে একটা উদাহরণ দিতে পারবে?
ডেভিড রজার্স

আমি মনে করি না এটি সব ক্ষেত্রে নির্ভরযোগ্যভাবে কাজ করবে। উচ্চতর আইএমএইচও
ফিলিপ আলভারেজ

5

আমি এই জাতীয় পরিস্থিতিতে শর্তাধীন অপারেটরগুলি ব্যবহার না করে কোডটি সহজ করতে চাই:

TEMP=/mnt/silo/bin
[[ ${PATH} =~ ${TEMP} ]] || PATH=$PATH:$TEMP
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.