শর্তসাপেক্ষ শর্ত: কীভাবে "এবং" এক্সপ্রেশন? (যদি [! -z $ VAR &&e -e $ VAR])


281

আমার ধারণা আমি কীভাবে "এবং" পরীক্ষা করব সে সম্পর্কে পরিষ্কার নই not আমি নিশ্চিত করতে চেয়েছিলাম যে একটি যুক্তি বিদ্যমান ছিল যা ভালভাবে কাজ করছে [ -e $VAR ], তবে এটি প্রমাণিত হয়েছে যে খালি স্ট্রিংয়ের ক্ষেত্রেও সত্য হিসাবে মূল্যায়ন করা হয়েছিল; যা আমি চাই না।

কীভাবে আমি 'এবং' তাদের একসাথে করব? অথবা এমন কি আরও একটি অ্যানরি পরীক্ষার রয়েছে যা আমি যা চাই তা পূরণ করে?

উত্তর:


532
if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi

9
এই সমাধানটি কঠোরভাবে পসিক্স-কমপ্লায়েন্ট শেলগুলিতেও কাজ করে এবং সেইসাথেও bash; তবে, "বাশিজম" এর পুরো সুবিধা নিতে, দেখুন @ প্যাক্সিডিয়াবলোর উত্তর lo
mklement0

2
অপ্রচলিত পরিবর্তে এটি পরামর্শ দেওয়া দেখে খুব আনন্দিত -a
চার্লস ডাফি

1
- আমি অন্য এক চমৎকার এবং বিস্তারিত ব্যাখ্যা পাওয়া stackoverflow.com/questions/3601515/...
valentt

70

bashম্যানপেজ থেকে :

[[ expression ]] - শর্তাধীন অভিব্যক্তি প্রকাশের মূল্যায়নের উপর নির্ভর করে 0 বা 1 এর একটি স্থিতি ফেরত দিন।

এবং, এক্সপ্রেশন জন্য, বিকল্পগুলির মধ্যে একটি:

expression1 && expression2- সত্য যদি উভয় expression1এবং expression2সত্য হয়।

সুতরাং আপনি andতাদের নীচে একসাথে করতে পারেন ( -nএর বিপরীত -zতাই আমরা এর থেকে মুক্তি পেতে পারি !):

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

তবে, আমি মনে করি না যে এটির ক্ষেত্রে এটির প্রয়োজন আছে, -e xyzzyসত্য যদি xyzzy ফাইলটি বিদ্যমান থাকে এবং খালি স্ট্রিংগুলি সহজেই পরিচালনা করতে পারে। যদি আপনি এটি চান তবে আপনার -zখালি খালি চেকের দরকার নেই:

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

অন্য কথায়, কেবল ব্যবহার করুন:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi

1
আমরা এটি দিয়ে সংক্ষিপ্ত করতে পারি[[ -e "$var" ]] && echo "'$var' exists"
জয়পাল সিংহ

1
হ্যাঁ, যদি এটি ওয়ান-লাইনার হয় (যেমন আমার উদাহরণটি ছিল)। শর্তাধীন ব্লক যদিও আরও জটিল ছিল আমি তা করব না।
paxdiablo

যদি কেবল একটিই থাকে - এমনকি লম্বা এক - কমান্ডও, এই ফর্মটি এটি সংক্ষিপ্ত হিসাবে ব্যবহার করা বোধ করে
avp

9
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

 


10
যেহেতু POSIXআচরণ সংজ্ঞায়িত না [পরীক্ষা জটিল সেট সঙ্গে, আমরা ব্যবহার এড়িয়ে চলা উচিত -aবা -oসঙ্গে [। আমি এখানে এটি পড়েছি ।
জয়পাল সিংহ

2
@ জয়পাল-সিংহ আপনি ঠিক বলেছেন, তবে টপিকটিতে bashট্যাগ রয়েছে এবং পসিক্স সম্পর্কে উল্লেখ করা হয়নি, তাই আমি এই সংস্করণটি পোস্ট করি যা bashকিছু অন্যান্য আধুনিক শেলের অধীনে কাজ করে lls
স্লাভা সেমুশিন

2
আপনি যদি bashবা অন্যান্য আধুনিক শেল ব্যবহারের বিষয়টি ধরে নিচ্ছেন তবে সুপারিশ করার আরও কম কারণ আছে -a
চিপনার

এমনকি বাশ দিয়েও, এই পরীক্ষাগুলি যেভাবে আচরণ করে তা সমস্ত কোণার ক্ষেত্রে যথাযথভাবে সংজ্ঞায়িত হয় না। বিবেচনা করুন [ "$var1" -o "$var2" ]; যদি var1=(এবং var2=)তারপর, কিনা একটি পরীক্ষামূলক কি আমরা আছে -oখালি নয় এমন, হয় হয় বরং কিনা চেয়ে এর var1বা var2অ খালি। এই ধরণের অস্পষ্টতা হ'ল x$varআধুনিক (যে, 90-এর দশকের পরে) testসঠিকভাবে উদ্ধৃতি সহ কমান্ডগুলির একমাত্র বৈধ কারণ , এবং সেই প্রথাটিকে আগুনে মারা যেতে হবে।
চার্লস ডাফি

4

কেবল আপনার পরিবর্তনশীলটি উদ্ধৃত করুন:

[ -e "$VAR" ]

এটি খালি [ -e "" ]কিনা $VARতা মূল্যায়ন করে ।

আপনার সংস্করণটি কাজ করে না কারণ এটি মূল্যায়ন করে [ -e ]। এখন এক্ষেত্রে, ব্যাশ কেবলমাত্র একক যুক্তি ( -e) একটি খালি-স্ট্রিং না তা পরীক্ষা করে দেখুন।

ম্যানপেজ থেকে:

আর্গুমেন্টের সংখ্যার ভিত্তিতে নিয়মের একটি সেট ব্যবহার করে পরীক্ষা এবং [শর্তাধীন অভিব্যক্তিগুলির মূল্যায়ন করুন। ...

1 যুক্তি

যুক্তিটি শূন্য না হলে এবং কেবল যদি অভিব্যক্তিটি সত্য।

(এছাড়াও, এই সমাধানটি ফাঁকা জায়গাগুলি সহ ফাইলের সাথে কাজ করার অতিরিক্ত সুবিধা রয়েছে)


1

আমি এখন একটি উত্তর খুঁজে। আপনার পরামর্শের জন্য ধন্যবাদ!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

তাতে কোন মন্তব্য? এটি দু'বার গ্রেপ করা অকার্যকর বলে মনে হচ্ছে, তবে এটি কাজ করে ...

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