একাধিক লজিকাল অপারেটর, ((এ || বি) ও& সি), এবং "অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি"


24

আমি বাশ 3 এর সাথে কাজ করছি এবং আমি শর্তসাপেক্ষ গঠনের চেষ্টা করছি। সি / C ++, তার মৃত সহজ: ((A || B) && C)। বাশ-এ, এটি পরিণত হয়নি (আমার মনে হয় গিট লেখকরা অন্য প্রচেষ্টায় যাওয়ার আগে অবশ্যই এই কোডটি অবদান রেখেছিলেন)।

এটা কাজ করে না. নোট যে <0 or 1>স্ট্রিং আক্ষরিক নয়; এর অর্থ 0 বা 1 (সাধারণত আসে grep -i)।

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi

এটির ফলাফল:

line 322: syntax error near unexpected token `[['

আমি তখন চেষ্টা করেছি:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi

এটির ফলাফল:

line 322: syntax error near unexpected token `[['

সমস্যার অংশটি হ'ল অনুসন্ধানের ফলাফলগুলি তুচ্ছ উদাহরণ এবং যৌগিক শর্তযুক্ত আরও জটিল উদাহরণ নয়।

আমি কীভাবে ((A || B) && C)ব্যাশে সরল পারফর্ম করব?


আমি কেবল এটি তালিকাভুক্ত করা এবং একাধিক ব্লকে একই আদেশগুলি পুনরাবৃত্তি করতে প্রস্তুত:

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>

if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
    ...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
    ... 
fi

উত্তর:


42

বাশের সিনট্যাক্সটি সি-এর মতো নয়, এমনকি যদি এর সামান্য অংশ সি দ্বারা অনুপ্রাণিত হয় তবে আপনি কেবল সি কোড লেখার চেষ্টা করতে পারবেন না এবং এটি কাজ করবে বলে আশা করতে পারে না।

শেলের মূল পয়েন্ট হ'ল কমান্ডগুলি চালানো। ওপেন-বন্ধনী কমান্ড [একটি কমান্ড, যা একটি একক পরীক্ষা সম্পাদন করে ¹ আপনি এটি test(চূড়ান্ত বন্ধনী বন্ধনী ব্যতীত) হিসাবে লিখতেও পারেন। ||এবং &&অপারেটরদের শেল অপারেটার, তারা একত্রিত কমান্ড , পরীক্ষা না।

সুতরাং আপনি যখন লিখুন

[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]

যে হিসাবে পার্স করা

[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]

যা হিসাবে একই

test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"

ভারসাম্যহীন বন্ধনী লক্ষ্য করুন? হ্যাঁ, ভাল না। প্রথম বন্ধনীগুলির সাথে আপনার প্রয়াসের একই সমস্যা: উত্সাহী বন্ধনী।

গ্রুপ কমান্ডের একসাথে সিনট্যাক্স হ'ল বন্ধনী। ব্রেসগুলি যেভাবে পার্স করা হয় সেগুলির জন্য একটি সম্পূর্ণ কমান্ডের প্রয়োজন, সুতরাং আপনাকে একটি নতুন লাইন বা সেমিকোলন দিয়ে ব্রেসগুলির অভ্যন্তরে কমান্ডটি শেষ করতে হবে।

if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then 

একটি বিকল্প উপায় আছে যা ডাবল বন্ধনী ব্যবহার করা। একক বন্ধনী থেকে পৃথক, ডাবল বন্ধনী হ'ল বিশেষ শেল সিনট্যাক্স। তারা শর্তাধীন অভিব্যক্তি সীমানা । ডাবল বন্ধনীগুলির ভিতরে, আপনি বন্ধনী এবং অপারেটরগুলি পছন্দ করতে &&এবং পছন্দ করতে পারেন ||। যেহেতু ডাবল বন্ধনী শেল সিনট্যাক্স, শেলটি জানে যে এই অপারেটরগুলি যখন বন্ধনীগুলির ভিতরে থাকে তখন তারা শর্তসাপেক্ষ অভিব্যক্তি সিনট্যাক্সের অংশ, সাধারণ শেল কমান্ড সিনট্যাক্সের অংশ নয়।

if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then 

যদি আপনার সমস্ত পরীক্ষাগুলি সংখ্যাসূচক হয় তবে আর একটি উপায় আছে, যা প্রত্নতাত্ত্বিক ভাব প্রকাশ করে । পাটিগণিতের এক্সপ্রেশন খুব সি-এর মতো বাক্য গঠন সহ পূর্ণসংখ্যা গণনা সম্পাদন করে।

if (((A == 0 || B != 0) && C == 0)); then 

আপনি আমার বাশ বন্ধনী প্রাইমার দরকারী খুঁজে পেতে পারেন ।

[প্লেইন এসএইচ ব্যবহার করা যেতে পারে। [[এবং ((বাশ (এবং ksh এবং zsh) এর জন্য নির্দিষ্ট।

¹ এটি বুলিয়ান অপারেটরগুলির সাথে একাধিক পরীক্ষার সংমিশ্রণও করতে পারে তবে এটি ব্যবহার করা জটিল এবং সূক্ষ্ম ক্ষতির কারণ তাই আমি এটি ব্যাখ্যা করব না।


ধন্যবাদ গাইলস এটি কি ব্যাশ 4 এর মাধ্যমে ব্যাশ 2 এর জন্য ধারণ করে? আমি কিছু প্রয়োজন আস্তে বহনযোগ্যতা কিন্তু Kusalananda কিছু জিনিস আমি উল্লেখ না করছেন পোর্টেবল হয় (যে পরোক্ষভাবে আমি কি করছি? কি ভাবে না পোর্টেবল?)। এখানে, হালকাভাবে বাশ 2 এর মাধ্যমে ব্যাশ 2 এর অর্থ হল

@jww [[ … ]]ব্যাশ ২.০২ তে যোগ করা হয়েছিল। ((…))বাশ ২.০ এ যুক্ত হয়েছিল।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গাইলস - ধন্যবাদ ব্যাশ 2 সম্ভবত সর্বাধিক হাস্যকর। এটি আমাদের শাসনের কারণে এবং পুরানো প্ল্যাটফর্মগুলি ত্যাগ করতে অনীহা প্রকাশের কারণে। বাশ 2 এবং জিসিসি 3 আমাদের ফেডোরা 1 পরীক্ষায় প্রদর্শিত হবে। আমরা উপলক্ষে একটি পুরানো প্ল্যাটফর্ম যেতে দেব, তবে এর কারণ থাকতে হবে। আমরা অ্যাপল, মাইক্রোসফ্ট, মজিলা, ইত্যাদির নীতিটি সাবস্ক্রাইব করি না।

@jww দয়া করে এর প্রাধান্য বুঝতে ||এবং &&থেকে পরিবর্তন [করতে [[এবং ((। সমান প্রাধান্য মধ্যে [(ব্যবহারের প্রথম বন্ধনী মূল্যায়ন ক্রম নিয়ন্ত্রণ করতে), কিন্তু && উচ্চতর প্রাধান্য রয়েছে [[এবং ((তুলনায় ||(সি হিসাবে)।

6

ব্যবহার [[:

if [[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]; then ...

আপনি যদি পছন্দ করেন [তবে নিম্নলিখিতগুলি কাজ করে:

if [ \( "$A" -eq "0" -o "$B" -ne "0" \) -a "$C" -eq "0" ]; then ...

3

-oআপনার নেস্টেডের পরিবর্তে অপারেটরটি ব্যবহার করুন || -aআপনার অন্যান্য বিবৃতিতে প্রয়োজন হলে আপনি && প্রতিস্থাপনের জন্যও ব্যবহার করতে পারেন ।

   EXPRESSION1 -a EXPRESSION2
          both EXPRESSION1 and EXPRESSION2 are true

   EXPRESSION1 -o EXPRESSION2
          either EXPRESSION1 or EXPRESSION2 is true


if [  "$A" -eq "0" -o "$B" -ne "0"  ] && [ "$C" -eq "0" ]; then echo success;fi

ধন্যবাদ। আমি জুড়ে এসেছিল -aএবং -o, কিন্তু আমি তাদের নিয়ে পরীক্ষা করা হয়নি। স্ট্যাক ওভারফ্লোতে থাকা কেউ এটিকে এড়াতে বলেছিলেন। আমি বেশিরভাগই তাদের সাথে একমত হয়েছি যেহেতু স্ক্রিপ্টটি ব্যবহার করে কম পাঠযোগ্য।

... তবে আরও বহনযোগ্য।
কুসালানন্দ

@ কুসালানন্দ - বহনযোগ্যতার বিষয়ে শীর্ষস্থানীয়দের জন্য ধন্যবাদ। স্ক্রিপ্টটি ব্যাশ 2 এর মাধ্যমে ব্যাশ 2 এর মাধ্যমে সিস্টেমে চলতে হবে [[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]them তাদের কি সমস্যা হবে?

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