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


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.