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


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.