bash - ব্যাশে সহজ লজিক্যাল অপারেটর



logical-operators (4)

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

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

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

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

যদি আপনার অন্যান্য শেলগুলিতে পোর্টেবিলিটি দরকার হয়, তবে এটি হবে (অতিরিক্ত উদ্ধৃতি এবং প্রতিটি পৃথক পরীক্ষার চারপাশে বন্ধনীগুলির পৃথক সেটগুলি মনে রাখবেন):

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

https://ffff65535.com

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

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

একটি খুব পোর্টেবল সংস্করণ (এমনকি legacy বোর্ন শেল যাও):

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

এটিতে সর্বাধিক মাত্র একটি উপ-প্রসেস চালানোর অতিরিক্ত গুণমান রয়েছে (যা প্রক্রিয়া '['), যা শেলের গন্ধ।

ভেরিয়েবল সংখ্যাসূচক মান থাকে, যেমন "=" সঙ্গে "=" প্রতিস্থাপন করুন, উদাহরণস্বরূপ

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

খুব কাছে

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

কাজ করা উচিত.

এটা ভেঙ্গে

[[ $varA -eq 1 ]] 

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

$varB == 't1'

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

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


if ([ $NUM1 == 1 ] || [ $NUM2 == 1 ]) && [ -z "$STR" ]
then
    echo STR is empty but should have a value.
fi




logical-operators