কেস + সিনট্যাক্সের ক্ষেত্রে সমান বা কম বা তার চেয়ে বেশি কার্যকর কীভাবে করা যায়


9

আমার লক্ষ্যটি হ'ল (কেবলমাত্র case+ সহ esac) সংখ্যার একটি ব্যাপ্তি যাচাই করা এবং পরিসীমাটি মুদ্রণ করা। উদাহরণস্বরূপ:

  • সংখ্যাটি যদি 0 থেকে 80 এর মধ্যে হয় তবে মুদ্রণ করুন >=0<=80
  • সংখ্যাটি যদি 81 থেকে 100 এর মধ্যে হয় তবে মুদ্রণ করুন >=81<=100
  • প্রভৃতি

আমার স্ক্রিপ্টের নীচে সমস্যা কেবল >=0<=90তখনই 0 এবং 9 এর মধ্যে সংখ্যা মুদ্রণ করে তবে কীভাবে আমার স্ক্রিপ্ট ঠিক করবেন, যাতে এটি সংখ্যার পরিসর অনুসারে সঠিক আউটপুট প্রিন্ট করবে?

#!/bin/ksh
read number 
case $number in 
 [0-80])  echo ">=0<=80";; 
 [81-100]) echo ">=81<=100";; 
 [101-120]) echo ">=101<=120";;
 [121-300]) echo ">=121<=300";;
esac

উত্তর:


6

caseএটি কেবলমাত্র প্যাটার্ন মিলের জন্য, এটি পাটিগণিত মূল্যায়ন করবে না (যদি আপনি zshএর <x-y>বর্ধিত প্যাটার্ন মেলানো অপারেটর বিবেচনা করেন তবে) except [...]শুধুমাত্র মেলে হয় এক চরিত্র (অথবা ক্রমানুসারে সাজানো উপাদান মধ্যে নিদিষ্ট সেট উপর ভিত্তি করে কিছু বাস্তবায়নের মধ্যে)। সুতরাং উদাহরণস্বরূপ [0-80]মেলে দিবে এক চরিত্র যদি এটা এক 0করার 8বা 0(যে, এক 0, 1, 2, 3, 4, 5, 6, 7, 8)।

আপনি যেমন নিদর্শনগুলির সাথে সংখ্যার সাথে মেলে ফেলতে পারেন:

case $(($number)) in
  ([0-9]|[1-7][0-9]|80) echo ">=0<=80";;
  (8[1-9]|9[0-9]|100) echo ">=81<=100";;
  ... and so on
esac

তবে আপনি সহজেই দেখতে পাচ্ছেন যে এটি সঠিক সরঞ্জাম নয়।

[...]ম্যাচ এক নির্দিষ্ট অক্ষরের তালিকা বিরুদ্ধে চরিত্র তাই [121-300]কোনো চরিত্র পারেন 1, 2, 1 থেকে 3, 0 অথবা 0 যে, তাই এটি হিসাবে একই জন্য ম্যাচ [0-3]বা [0123]

ব্যবহার করুন:

if [ "$number" -ge 0 ] && [ "$number" -le 80 ]; then
  echo ">=0<=80"
elif [ "$number" -ge 81 ] &&  [ "$number" -le 100 ]; then
  echo ">=81<=100"
elif ... and so on
  ...
fi

ব্যবহারের আরেকটি উপায় হ'ল case:

case $((
  (number >= 0 && number <= 80)   * 1 +
  (number > 80 && number <= 100)  * 2 +
  (number > 100 && number <= 120) * 3 +
  (number > 120 && number <= 300) * 4)) in
  (1) echo ">=0<=80";;
  (2) echo ">=81<=100";;
  (3) echo ">=101<=120";;
  (4) echo ">=121<=300";;
  (0) echo "None of the above";;
esac

বা টার্নারি অপারেটর ব্যবহার করুন ( x ? y : z):

case $((
  number >= 0 && number <= 80   ? 1 :
  number > 80 && number <= 100  ? 2 :
  number > 100 && number <= 120 ? 3 :
  number > 120 && number <= 300 ? 4 : 0)) in...

অথবা @ মিমকিজারের মতো, বাক্সের বাইরে ভাবুন, যুক্তিটি বিপরীত করুন caseএবং1 সেইগুলি গণিতের তুলনার মানের সাথে মেলে


1
+1, বিবেচনা করুন if [ n < 0 ] - elif [ n <= 80 ] - elif [ n <= 100 ] ... - else। কম টাইপিং, ত্রুটি-প্রবণতা কম।
পিটারফ

@ পেটারফ এটি চালাতে আরও বেশি সময় নেয়।
কেন শার্প

4

আসলে এটি করা সহজ। বিষয়টি caseহ'ল এটি কোনও প্যাটার্নের বিপরীতে প্রথম ম্যাচটি খুঁজে পাওয়ার জন্য কেবল যতটা প্রয়োজন প্রসারিত হবে। এটা নির্দিষ্ট আচরণ। এবং তাই আপনি এটি কেবল একটি পরিচিত স্ট্রিংয়ের সাথে সেট আপ করতে পারেন এবং নিদর্শনগুলির বিস্তৃতি মূল্যায়ন করতে পারেন।

case  1:${number:--} in
(1:*[!0-9]*|1:0*[89]*)
  ! echo NAN
;;
($((number<81))*)
    echo "$number >=0<=80"
;;
($((number<101))*)
    echo "$number >=81<=100"
;;
($((number<121))*)
    echo "$number >=101<=120"
;;
($((number<301))*)
    echo "$number >=121<=300"
;;
esac

caseপ্যাটার্নে একটি শীর্ষস্থানীয় 1 সন্ধান করার জন্য এই ধরণের নিদর্শনগুলির আর কখনও প্রসারিত হবে না। এটি ব্যবহারকারীর ইনপুট নিয়ে কাজ করার সময় বিশেষভাবে গুরুত্বপূর্ণ, কারণ এর অর্থ আপনি $numberএটি গণিতের বিস্তারে রাখার ক্ষেত্রে একই ক্ষেত্রে বিবৃতিতে পাটিগণিতের সম্প্রসারণ প্রসঙ্গে রাখার চেষ্টা করার আগে এর সামগ্রীগুলি নিরাপদে যাচাই করতে পারবেন ।


Box বাক্সের বাইরে / চারপাশে আপনি যেভাবে ভাবছেন তা পছন্দ করি।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস - আমি পছন্দ করি case। কিছু অসাধারণ জিনিস রয়েছে যা আপনি $((গণিতের সাথে করতে পারেন ))এবং case- বিশেষত আশেপাশের কার্যভারগুলি যেমন নিখুঁতভাবে কখনও না ঘটে ততক্ষণ ঘটে না - এবং আপনি এমন কোনও পার্স গাছও বানাতে পারেন যা নেস্টেড পুনরাবৃত্তিগুলি প্রসারিত করে যদি আপনি একটি aliasশৃঙ্খলে নিদর্শনগুলি বিশিষ্ট করেন । অক্ষর অনুবাদ যেমন স্টাফ করতে শেল পেতে এবং বাইট মানগুলির জন্য অক্ষর অদলবদল করার জন্য এটি সবচেয়ে দ্রুততম উপায় এটি বেশ দ্রুত হতে পারে - সি-লোকেল এএসসিআই + <> অক্টাল খুব খারাপ পরিস্থিতি হ'ল 7 টি বেসিক পসিক্স প্যাটার্নের বিস্তৃতি।
মাইকজার্ভ

1

এটি খুব সুন্দর নয় তবে আপনি এটি ব্যবহার করতে পারেন:

 #!/bin/ksh

read number  

case $number in
[0-9]|[1-7][0-9]|80) echo  echo ">=0<=80";;
8[1-9]|9[0-9]|100) echo ">=81<=100";;
10[1-9]|11[0-9]|120) echo ">=101<=120";;
12[1-9]|130) echo ">=121<=300";;
esac

আপনি "001" বা "0x99" এর মতো সংখ্যার জন্য কভার করতে $ (($ সংখ্যা)) দিয়ে নম্বরটি "ক্যানোনাইফাই" করতে চাইতে পারেন ... এটি "12" এবং "12 + 12" এর জন্যও কভার করতে পারে যা হতে পারে বা হতে পারে কাম্য না।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.