শেলের একটি জটিল অবস্থার সিনট্যাক্স কী?


11

শেল (sh) এ নিম্নলিখিত পরীক্ষাটি প্রকাশ করতে চাইলে:

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

এখনও অবধি, আমি সবচেয়ে ভাল লিখতে পেরেছি এটি হ'ল:

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

কীভাবে যৌগিক && এবং করা যায় তা আমি জানি না || সঠিক নজির সহ। গুগলিং আমাকে কোন উত্তর দেয় নি (টিউটোরিয়ালগুলি কেবলমাত্র যদি প্রাথমিক উদাহরণ দেয় তবে)

ঐ দুই একত্রিত করতে সিনট্যাক্স কি যদি এক মধ্যে?


1
ব্যবহার না করার কোনও কারণ ksh? তারপরে আপনার প্রারম্ভিক if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
— কোডটির

উত্তর:


15

মনে রাখবেন যে [[ ]]বোর্ন বা পসিক্সের মধ্যে নেই sh। সত্য shবাক্য গঠনের জন্য, এটি করার বিভিন্ন উপায় রয়েছে।

শুধুমাত্র একটি [ ]জোড়া ব্যবহার করে

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

বা পসিক্স -aএবং -oবিকল্পগুলি এড়ানো 1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

1 এক এড়ানো জন্য কারণ -aএবং -oসর্বাধিক বহনযোগ্যতা হয় - সব না testবা [বাস্তবায়নের চেয়ে বেশি 4 আর্গুমেন্ট, যা অবিকল হলে আপনার সাথে এক্সপ্রেশন চেইন যেটা তুমি কি পেতে সব ব্যবস্থা করতে সক্ষম -aএবং -oএবং \( \)।


আমার স্ক্রিপ্টগুলিতে # আছে! / বিন / SH কুঁড়েঘর এবং ডিফল্ট শেল হল ksh । কেন sh ব্যবহার করা হবে না?
— অফির্মো

2
@ ওফিরমো আপনি যদি আপনার স্ক্রিপ্টটিকে এই হিসাবে ঘোষণা করেন /bin/shতবে স্ক্রিপ্টটি এতে না থাকা বৈশিষ্ট্যগুলি ব্যবহার করে লেখা ভুল sh। আপনার সচেতন হওয়া উচিত যা kshতা নয় sh, বরং এটি সুপারস্টেট sh। আপনি যদি নিজের ksh-বিট-ঘোষিত-হিসাবে- shস্ক্রিপ্টটিকে এমন কোনও সিস্টেমে নিয়ে যান যেখানে shসিমলিংক নেই ksh, এটি ভেঙে যেতে পারে। আপনার স্ক্রিপ্ট ঘোষণার সাথে মেলে তা নিশ্চিত করে আপনি এই সমস্যাটি এড়াতে পারেন।
— jw013

আমি ভেবেছিলাম শেবাং হিসাবে সেটিং / বিন / শ সেট করা আমার স্ক্রিপ্টগুলিকে / বিন / এস-এর মাধ্যমে চালিত করবে । আপনি কি বলতে চান যে আমার ডিফল্ট শেল (ksh) শেবাং উপেক্ষা করে সরাসরি ব্যাখ্যা করবে?
— অফির্মো

@ ওফিরমো আপনি সঠিক: একটি শেবাং /bin/shপ্রার্থনা করবে /bin/sh। সমস্যাটি মানা /bin/shহয় না [[। আপনি হয় [[শেল ব্যবহার করতে বা ব্যবহার করতে পারবেন না যা গ্রহণযোগ্য [[, যেমন kshআপনার শেবাং হিসাবে।
— jw013

2
সমস্যাটি এতটা নয় যে -a/ -oকিছু বাস্তবায়ন দ্বারা সমর্থিত হয় না তবে এটি স্বেচ্ছাচারী যুক্তিগুলির জন্য নির্ভরযোগ্য নয়। ভালো লেগেছে [ "$a" = "$b" -o "$b" = "$c" ]এর মানের জন্য ব্যর্থ হবে $aমত !অনেক সঙ্গে [বাস্তবায়নের।
— স্টাফেন চেজেলাস

2

আমি কিছু বাক্য গঠন চেষ্টা করেছি এবং এটি খুঁজে পেয়েছি

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

কাজ করছে.


1
এটি উপরের বাশ সংস্করণে 4 এর জন্য কাজ করে
— নিখিল মুলি


0

নিছক দিয়ে এটি করার সঠিক উপায় shell:

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

ব্যাখ্যা:

testএখানে প্রথম বন্ধনী হিসাবে এবং -oযৌক্তিক বা হিসাবে কাজ করে । যদি আপনি একটি যৌক্তিক এবং "বন্ধনী" এর অভ্যন্তরে ব্যবহার করেন -a।

আরও এখানে পাওয়া যাবে

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