বাশ-এ একটি মেনু প্রিন্ট করতে `নির্বাচন` কমান্ডটি ব্যবহার করে


10

আমি selectকমান্ডটি ব্যবহার করে একটি সাধারণ মেনু প্রয়োগ করার চেষ্টা করছি । স্ক্রিপ্টটি (পরীক্ষার উদ্দেশ্যে) নিম্নরূপ:

#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
  case $opt in
        "apache")
          date
          ;;
        "named")
          echo "test"
          ;;
        "sendmail")
          echo "test 2"
          ;;
        *) echo "invalid option";;
  esac
done
echo "*********************"

স্ক্রিপ্টটি আমি প্রদত্ত কোনও বৈধ ইনপুটকে স্বীকৃতি দিচ্ছে না এবং সর্বদা "অবৈধ বিকল্প" বার্তা প্রিন্ট করে। এই লিপিটিতে কী ভুল হচ্ছে?


4
আপনার ইনপুটটি 1, 2 বা 3, তাই না?
— enzotib

উত্তর:


11

আপনার নির্বাচিত দ্বারা প্রদর্শিত মেনু দেখতে পাবেন:

1) apache
2) named
3) sendmail
Select an option and press Enter: 

এই সময়ে, আপনি "1" বা "2" বা "3" লিখুন: আপনি শব্দটি টাইপ করেন না।

এছাড়াও, selectইচ্ছা লুপ পর্যন্ত এটি একটি সূচিত breakকমান্ড, তাই আপনি এই চাই:

  case $opt in
        "apache")
          date
          break
          ;;
        "named")
          echo "test"
          break
          ;;
        "sendmail")
          echo "test 2"
          break
          ;;
        *) echo "invalid option";;
  esac

আপনি যদি ব্যবহারকারীকে সংখ্যা বা শব্দটি প্রবেশের অনুমতি দিতে চান তবে আপনি এটি লিখতে পারেন:

select opt in "${options[@]}"; do
  case "$opt,$REPLY" in
    apache,*|*,apache)     do_something; break ;;
    named,*|*,named)       do_something; break ;;
    sendmail,*|*,sendmail) do_something; break ;;
  esac
done

কমাটির কোনও সিন্ট্যাক্টিকাল তাত্পর্য নেই, এটি কেবলমাত্র $ রিপ্লাই ভেরিয়েবলের (যা ব্যবহারকারী আসলে টাইপ করেছেন) বা $ অপ্ট ভেরিয়েবলের সাথে প্যাটার্ন ম্যাচ করতে সক্ষম হয়েছে


selectকমান্ড একটি প্রয়োজন breakনা case।
— গ্লেন জ্যাকম্যান

ধন্যবাদ! আমি বুঝতে পারি নি যে এটি সংখ্যাগত বিকল্প ছিল। Duhh!
— সুমোদ

হাহ, আমিও সি তে প্রোগ্রাম করি এবং, breakপ্রতিটি বিভাগে আপনার দরকার আছে। তবে আপনার breakকোনও ক্ষেত্রে কোনও প্রয়োজন হবে না ... শেল স্ক্রিপ্টে এস্যাক ব্লক । এগুলি সহজে মিশে যাওয়ার জন্য এটি এত সহজেই ঘটতে পারে। :-)
— সিনট্যাক্সারর

1
@syntaxerror, আপনি সঠিক, আপনি প্রয়োজন হবে না করছি breakজন্য case। তবে লুপটি breakথেকে বাঁচতে আপনার দরকার select।
— গ্লেন জ্যাকম্যান

@glenn jackman আমি এটি আরও সহায়ক মন্তব্যে পরিণত করতে চাই (পরবর্তী দেখুন)। সুতরাং আপনি যদি 12:55 থেকে আপনার মন্তব্য মুছে ফেলার বিষয়ে সম্মত হন তবে এটি দুর্দান্ত হবে। আমি অবশ্যই আমার সাথে একই করব।
— সিনট্যাক্সেরর

3

আপনার $optপরিবর্তনশীলটি ব্যবহারকারী সংখ্যার সাথে সম্পর্কিত বিকল্প শব্দটিতে সেট করা হবে set ব্যবহারকারী আসলে কী টাইপ করেছেন তা যদি আপনি দেখতে চান তবে দেখুন $REPLY।


1
প্রদত্ত যে "অ্যাপাচি", "নাম" এবং "সেন্ডমেল" এর caseসাথে তুলনা $optকরে, এটি সঠিক এবং কিছুই পরিবর্তন করতে হবে না।
— manatwork

@ মান্যাটওয়ার্ক, যদি না ওপি ব্যবহারকারী 1, 2 বা 3 চাপার পরিবর্তে "
— অ্যাপাচি

মজাদার. 123apachenamedsendmail
— PL

@ ফ্রেড, হ্যাঁ, $REPLYব্যবহারকারী যা টাইপ করেছেন তা হ'ল এবং যদি এটি একটি বৈধ সংখ্যা ছিল তবে $optসেই সংখ্যার সাথে সম্পর্কিত শব্দটি হবে।
— কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.