বাশের সাধারণ লজিকাল অপারেটর


255

আমার বেশ কয়েকটি ভেরিয়েবল রয়েছে এবং আমি নিম্নলিখিত শর্তটি দেখতে চাই (শব্দগুলিতে লিখিত, তারপরে ব্যাশ স্ক্রিপ্টিংয়ের ক্ষেত্রে আমার ব্যর্থ চেষ্টা):

if varA EQUALS 1 AND ( varB EQUALS "t1" OR varB EQUALS "t2" ) then 

do something

done.

এবং আমার ব্যর্থ প্রয়াসে, আমি সাথে এলাম:

if (($varA == 1)) && ( (($varB == "t1")) || (($varC == "t2")) ); 
  then
    scale=0.05
  fi

উত্তর:


681

আপনি যা লিখেছেন তা প্রায় কাজ করে (সমস্ত ভেরিয়েবল সংখ্যা হলে এটি কাজ করবে), তবে এটি মোটেও মূর্খতাপূর্ণ উপায় নয়।

  • (…)বন্ধনী একটি সাব-শেল নির্দেশ করে । এগুলির ভিতরে থাকা অন্যান্য ভাষার মতো একটি অভিব্যক্তি নয়। এটি কমান্ডের তালিকা (ঠিক বাইরের বন্ধনীগুলির মতো)। এই কমান্ডগুলি পৃথক সাবপ্রসেসে কার্যকর করা হয়, সুতরাং প্রথম বন্ধনীর ভিতরে সম্পাদিত কোনও পুনর্নির্দেশ, অ্যাসাইনমেন্ট ইত্যাদির প্যারেন্টেসিসের বাইরে কোনও প্রভাব নেই।
    • একটি নেতৃস্থানীয় ডলার চিহ্ন দিয়ে, $(…)একটি হল কমান্ড প্রতিকল্পন আছে: প্রথম বন্ধনী ভিতরে কমান্ড, এবং কমান্ডের ফলাফল কমান্ড লাইন অংশ হিসাবে ব্যবহার করা হয় (অতিরিক্ত প্রসারণও পর যদি না প্রতিকল্পন উদ্ধৃতি চিহ্ন মধ্যে, কিন্তু যে অন্য গল্প ) ।
  • { … }ধনুর্বন্ধনী হ'ল বন্ধনীগুলির মতো যা তারা কমান্ডকে গোষ্ঠী করে তবে তারা কেবল পার্সিংকেই প্রভাবিত করে, দলবদ্ধ করে না। প্রোগ্রামটি x=2; { x=4; }; echo $x4 টি মুদ্রণ করেx=2; (x=4); echo $x 2 টি প্রিন্ট করে ((বন্ধনীর আগে বন্ধনীগুলির চারপাশে ফাঁকা জায়গা এবং অর্ধিকোলনের প্রয়োজন হয়, যদিও বন্ধনীগুলি হয় না That's এটি কেবল একটি বাক্য গঠন মাত্র))
    • শীর্ষস্থানীয় ডলারের চিহ্ন সহ, সম্ভাব্য অতিরিক্ত ট্রান্সফর্মেশন সহ একটি ভেরিয়েবলের মান পর্যন্ত প্রসারিত করে ${VAR}একটি প্যারামিটার সম্প্রসারণ করা হয়।
  • ((…))ডাবল বন্ধনীগুলি একটি গাণিতিক নির্দেশকে ঘিরে , অর্থাত্, অন্যান্য প্রোগ্রামিং ভাষার অনুরূপ একটি বাক্য গঠন সহ পূর্ণসংখ্যার উপর একটি গণনা। এই বাক্য গঠনটি বেশিরভাগ ক্ষেত্রে অ্যাসাইনমেন্ট এবং শর্তসাপেক্ষে ব্যবহৃত হয়।
    • পাটিগণিতের এক্সপ্রেশনগুলিতে একই বাক্য গঠন ব্যবহার করা হয় $((…))যা অভিব্যক্তির পূর্ণসংখ্যার মান পর্যন্ত প্রসারিত হয়।
  • [[ … ]]ডাবল বন্ধনী শর্তসাপেক্ষ প্রকাশের চারপাশে । শর্তসাপেক্ষ এক্সপ্রেশনগুলি বেশিরভাগ অপারেটরগুলিতে নির্মিত হয় যেমন -n $variableভেরিয়েবলটি খালি -e $fileরয়েছে কিনা তা পরীক্ষা করা এবং কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষা করা। স্ট্রিং ইক্যুয়ালিটি অপারেটরগুলিও রয়েছে: "$string1" == "$string2"(সাবধান যে ডান দিকের দিকটি একটি প্যাটার্ন, উদাহরণস্বরূপ [[ $foo == a* ]]টেস্টগুলি $fooশুরু হওয়ার সাথে সাথে শুরু aহলে [[ $foo == "a*" ]]পরীক্ষা করা $fooহয় a*), এবং পরিচিত !, &&এবং ||অবহেলা, সংমিশ্রণ এবং বিভাজনের জন্য অপারেটরগুলির পাশাপাশি গ্রুপিংয়ের জন্য প্রথম বন্ধনী রয়েছে। নোট করুন যে আপনার প্রতিটি অপারেটরের চারপাশে একটি স্থান প্রয়োজন (যেমন [[ "$x" == "$y" ]], না [[ "$x"=="$y" ]]) এবং ;বন্ধনীগুলির ভিতরে এবং বাইরে উভয় জায়গার মতো একটি স্থান বা একটি অক্ষর (যেমন [[ -n $foo ]], নয়)[[-n $foo]])।
  • [ … ]একক বন্ধনী শর্তসাপেক্ষ এক্সপ্রেশনগুলির বিকল্প ফর্ম যা আরও বেশি quirks (তবে পুরানো এবং আরও বহনযোগ্য)। আপাতত কিছু লিখবেন না; আপনি যখন এতে স্ক্রিপ্টগুলি অন্তর্ভুক্ত করেন তখন তাদের নিয়ে উদ্বেগ শুরু করুন।

এটি আপনার পরীক্ষাকে বাশিতে লেখার মূio় উপায়:

if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then

আপনার যদি অন্যান্য শেলগুলির বহনযোগ্যতা প্রয়োজন হয় তবে এই উপায়টি হবে (প্রতিটি স্বতন্ত্র পরীক্ষার চারপাশে অতিরিক্ত উদ্ধৃতি এবং বন্ধনীগুলির পৃথক সেট =এবং ksh / bash / zsh ==বৈকল্পিকের পরিবর্তে theতিহ্যবাহী অপারেটরের ব্যবহারগুলি নোট করুন ):

if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then

31
দুর্দান্ত পোস্ট, বন্ধনী সারাংশ ঠিক আদর্শ।
কমডোডেভ

10
==পরিবর্তনশীল (যা এটিও =) নির্ধারণের চেয়ে তুলনাটি আলাদা করার জন্য এটি ব্যবহার করা ভাল
উইল শেপার্ড

1
ওহ, আমি একক (বৃত্তাকার) প্রথম বন্ধনী বোঝাতে চাইছি, বিভ্রান্তির জন্য দুঃখিত। বেশী [[ $varA = 1 && ($varB = "t1" || $varC = "t2") ]]একটি উপ প্রক্রিয়া শুরু না যদিও প্রথম বুলেট পয়েন্ট স্পষ্টভাবে বলছে: "ভিতরে কি [প্রথম বন্ধনী] একটি অভিব্যক্তি নয় অনেক অন্য ভাষায় মত" - কিন্তু এটা অবশ্যই এখানে! এটি সম্ভবত অভিজ্ঞ বাশ উইজের কাছে সুস্পষ্ট, তবে তাত্ক্ষণিকভাবে আমার কাছেও তা নয়। বিভ্রান্তি দেখা দিতে পারে কারণ একক প্রথম বন্ধনী এক বিবৃতিতে ব্যবহার করা যেতে পারেif , কেবল ডাবল বন্ধনীগুলির ভিতরে প্রকাশের ক্ষেত্রে নয়।
পিটার - মনিকা

2
@ চরিত্রটি ==সত্যিকারের চেয়ে "বেশি মূর্তিমান " নয় =। তাদের একই অর্থ রয়েছে তবে ==এটি একটি কেএসএস বৈকল্পিক যা ব্যাশ এবং জেডএসেও পাওয়া যায়, যেখানে =বহনযোগ্য। ব্যবহার করার সত্যিই কোনও সুবিধা ==নেই, এবং এটি সরল sh এ কাজ করে না।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

2
@ উইলশেপার্ড তুলনা এবং অ্যাসাইনমেন্টের মধ্যে ইতিমধ্যে আরও অনেক পার্থক্য রয়েছে: তুলনা বন্ধনীর ভিতরে রয়েছে, অ্যাসাইনমেন্ট নয়; তুলনার অপারেটরের চারপাশে স্পেস রয়েছে, অ্যাসাইনমেন্ট নেই; অ্যাসাইনমেন্টের বামে একটি পরিবর্তনশীল নাম রয়েছে, তুলনা করার ক্ষেত্রে খুব কমই বামদিকে ভেরিয়েবল নামের মতো কিছু পাওয়া যায় এবং আপনি যে কোনও উপায়ে রাখতে পারেন এবং রাখতে পারেন। আপনি ==ভিতরে লিখতে পারেন [[ … ]], যদি আপনি চান তবে =এতে কাজ করার সুবিধাও রয়েছে [ … ], তাই আমি মোটেও ব্যবহার করার অভ্যাসে না যাওয়ার পরামর্শ দিই ==
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

34

খুব কাছে

if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]]; 
  then 
    scale=0.05
  fi

কাজ করা উচিত.

এটি ভেঙে

[[ $varA -eq 1 ]] 

একটি পূর্ণসংখ্যার তুলনা যেখানে হিসাবে

$varB == 't1'

একটি স্ট্রিং তুলনা। অন্যথায়, আমি কেবল সঠিকভাবে তুলনাগুলি গোষ্ঠীভুক্ত করছি।

ডাবল বর্গাকার বন্ধনী শর্তসাপেক্ষ এক্সপ্রেশন সীমিত করে। এবং, আমি এই বিষয়টিতে নীচের বিষয়গুলিকে একটি ভাল পঠনযোগ্য বলে মনে করি: "(আইবিএম) পরীক্ষা নিরঙ্কুশ করা, [, [[, ((, এবং যদি-তবে-অন্যথায়"))


কেবলমাত্র নিশ্চিত হওয়াতে: উদ্ধৃতিটি 't1'অপ্রয়োজনীয়, তাই না? কারণ ডাবল বন্ধনীগুলিতে গাণিতিক নির্দেশনার বিপরীতে, যেখানে t1পরিবর্তনশীল হবে t1ডাবল বন্ধনীতে শর্তাধীন অভিব্যক্তিটি কেবল একটি আক্ষরিক স্ট্রিং। অর্থাৎ [[ $varB == 't1' ]]ঠিক ঠিক মতো [[ $varB == t1 ]], তাই না?
পিটার - মনিকা পুনরায়

6

একটি খুব বহনযোগ্য সংস্করণ (এমনকি উত্তরাধিকারী বোর্ন শেল থেকেও):

if [ "$varA" = 1 -a \( "$varB" = "t1" -o "$varB" = "t2" \) ]
then    do-something
fi

এতে বেশিরভাগ ক্ষেত্রে কেবলমাত্র একটি সাব-প্রসেস চালানোর অতিরিক্ত গুণ রয়েছে (এটি প্রক্রিয়া [ শেলের স্বাদ যাই হোক না কেন, ) ।

ভেরিয়েবলের যদি সংখ্যাসূচক মান থাকে তবে এর =সাথে প্রতিস্থাপন করুন-eq

  • 3 -eq 03 সত্য, কিন্তু
  • 3 = 03মিথ্যা (স্ট্রিং তুলনা)

3

যদি-তবে-অন্য বিবৃতিটির সংক্ষিপ্ত সংস্করণের কোড এখানে:

( [ $a -eq 1 ] || [ $b -eq 2 ] ) && echo "ok" || echo "nok"

নিম্নলিখিত মনোযোগ দিন:

  1. ||এবং &&শর্ত (যেমন বৃত্তাকার বন্ধনীগুলির মধ্যে) এর ভিতরে অপারেশনগুলি লজিক্যাল অপারেশন (বা / এবং) হয়

  2. ||এবং &&বাইরে অপারেশন যদি শর্তটি তখন / অন্যথায় হয়

কার্যত বিবৃতিতে বলা হয়েছে:

যদি (a = 1 বা b = 2) তবে "ঠিক আছে" অন্য "নোক"


প্যারেন্টেসিস ( ... )একটি সাব- শেল তৈরি করে। { ... }পরিবর্তে ধনুর্বন্ধনী ব্যবহার করতে চাই । সাব-শেলের তৈরি কোনও রাজ্য কলারটিতে দৃশ্যমান হবে না।
ক্লিন্ট পাচল

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