শেল প্রম্পট থেকে 'হ্যাঁ' এর বিভিন্নতা গ্রহণের আরও ভাল উপায়


27

আমি লিখেছিলাম একটি শেল স্ক্রিপ্টের ব্যবহারযোগ্যতা পরীক্ষায় দেখা গেছে যে লোকেরা কীভাবে একটি প্রশ্নের উত্তর দিতে পারে যা 'হ্যাঁ' উত্তর হিসাবে প্রত্যাশিত তার উত্তর দেওয়ার ক্ষেত্রে বিভিন্ন প্রত্যাশা ছিল। নীচের কোড উদাহরণে প্রকরণগুলি দেখুন।

অবশ্যই এখানে আরও ভাল উপায় থাকতে হবে যা আমি সামনে এলাম? আপনার পাঠযোগ্য এবং খাটো ফর্মটি এটিকে কী গ্রহণ করবে?

read -p 'Answer this question with yes: ' answer
if [ "$answer" = 'Y'
  -o "$answer" = 'YES'
  -o "$answer" = 'Yes'
  -o "$answer" = 'y'
  -o "$answer" = 'yes'
  -o some-alternate-condition ]; then

  echo 'Surely this can be written better?'
fi

2
ভোট বন্ধ। যদিও আমি প্রশ্নটিতে আগ্রহী, এটি সম্ভবত একটি প্রোগ্রামিং প্রশ্ন বেশি, তাই এসও থাকা উচিত।
ফুনেহে

একটি প্রোগ্রামিং উত্তর ভালো কিছু হতে পারে ব্যাশ: চেক যদি অ্যারের উপাদান বিদ্যমান
phunehehe

3
@ ফুনেহেহে: আমি এসও-তে যাওয়ার বিষয়ে একমত নই, কেবল আমাদের শেল প্রোগ্রামিংয়ের ইতিহাস রয়েছে বলে নয়, এটি কীভাবে করা যায় তা নয়, তবে অনুমানটি কী হওয়া উচিত তাও একটি প্রশ্ন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

4
আমি এরকম স্ক্রিপ্ট একবার লিখেছি। তারপরে প্রোগ্রামটি ফরাসি এবং সরলীকৃত চীনা অনুবাদ করা হয়েছিল। আমি ফরাসি সংস্করণটি স্কিম করেছিলাম এবং দেখেছিলাম যে আমার প্রম্পটটি "প্রবেশ করুন ওউই বা নন" তে অনুবাদ করা হয়েছে তবে অবশ্যই কোডটি এখনও "ওয়াই *" বা "এন *" চেয়েছিল
বেন জ্যাকসন

উত্তর:


15

একটি ব্যবহার caseকিছুটা সমতুল্য তবে সঠিক নয় কারণ বিবৃতি YEগ্রহণ করা হয়।

read -p 'Answer this question with yes: ' answer
case "${answer}" in
    [yY]|[yY][eE][sS])
        echo 'Surely this can be written better?' ;;
esac

3
আমি বলব যে ব্যবহারকারীর অভিপ্রায়টি 'ইয়ে' থেকে সম্পূর্ণ পরিষ্কার।
আইয়িউন

48

ইউএনআইএক্স স্ট্যান্ডার্ডটি localeইউটিলিটিটি ব্যবহার করে এর জন্য উদাহরণ কোড সরবরাহ করে :

if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
    affirmative processing goes here
else
    non-affirmative processing goes here
fi

লোকালে POSIX(এবং রিয়েল সিস্টেমগুলিতে ইংলিশ লোকালগুলিতে) 'ইয়েসেক্সপ্র'-এর মান "^[yY]"। এটি বর্ধিত নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা করা উচিত। নেক্সারপ্রাইজও দেখুন।


1
খুশী হলাম। তবে আমি নিজেকে বোকা বলে মনে হচ্ছে। আমি যে আর্গুমেন্ট localeসম্পর্কে জানি তার একটি তালিকা কোথায় পাব? আমার ম্যাক ওএস 10.5 বাক্সের ম্যান পৃষ্ঠাটি তাদের কাছে নেই বলে মনে হচ্ছে।
dmckee

খুশী হলাম। আপনি কি উত্সটিতে আবার লিঙ্ক করতে পারেন?
আইয়িউন

3
@ ডিএমকেকে আপনি locale -k LC_MESSAGES(এবং অন্যান্য এলসি_ও যে কোনও ক্ষেত্রে) করতে পারেন , বা মান দ্বারা সংজ্ঞায়িত ব্যক্তিদের জন্য এখানে দেখুন । @ ড্যানিয়েল আমি যে লোকাল ইউটিলিটি পৃষ্ঠাটি লিঙ্ক করেছি তা ছাড়া অন্য কোন উত্স?
র্যান্ডম 832

1
দুর্দান্ত উত্তর, অবশ্যই গ্রহণযোগ্য হওয়া উচিত।
jlliagre

6

ব্যাশে থাকা (বা আপনি যদি স্বতন্ত্রভাবে প্রম্পটটি প্রদর্শন করেন তবে অন্য কোনও শেল):

case $answer in
  [Yy]*) echo Ok;;
  *) echo "Can't you read? I said to say yes.";;
esac

এটি ynহ্যাঁ,  y(প্রাথমিক স্থান সহ) হিসাবে না এবং wlkjzuhfodএবং না হিসাবে প্রতিক্রিয়াগুলি গ্রহণ করে , যা সর্বোত্তম নাও হতে পারে তবে সাধারণত শেল প্রম্পটের সাথে সামঞ্জস্যপূর্ণ: এটিই rm -i, find -okএবং অন্যরা এটি করে।

এটি আন্তর্জাতিকীকরণের পুরো বিষয়টিটিকে রক্ষা করে: অন্যান্য ভাষায়, আপনার প্রত্যাশিত প্রতিক্রিয়াগুলি অনুবাদ করতে হবে। তখন কোনও আদর্শ শেল পদ্ধতি নেই; আপনি কথোপকথনে ফিরে যেতে পারেন , তবে তারপরে আপনার স্ক্রিপ্টটি এটি ইনস্টল করা প্রয়োজন (এটি অনেকগুলি বিতরণে পাওয়া যায় তবে সর্বদা ডিফল্টরূপে ইনস্টল হয় না) not

if dialog --yesno "Choose yes" 0 0; then 

3

আমি সাধারণত একটি সাধারণ ফাংশন ব্যবহার করি:

Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }

ফাংশন শুধু ফেরৎ 0যদি Yবা yপ্রবেশ করানো হয় এবং 1যদি অন্য কিছু প্রবেশ করানো হয়। এটি এর সাথে ব্যবহার করা যেতে পারে if...fi:

if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi

বা ঠিক এর মতো:

Confirm "Type y" && echo "You typed y"

-sকি টাইপ করা হয়েছে তার চাক্ষুষ ইতিহাস পেতে বন্ধ করুন ।
টম হেল

0

কেবলমাত্র @Fif উত্তরগুলি পুনরায় সংশোধন করা হয়েছে

YesOrNo() {
        while :
        do
                read -p 'Do you want to Continue (yes/no?): ' answer
                case "${answer}" in
                    [yY]|[yY][eE][sS]) exit 0 ;;
                        [nN]|[nN][oO]) exit 1 ;;
                esac
        done
}


if $( YesOrNo ); then
        echo "Ans is yes.. Do something....."
else
        echo "Ans is No... skip.."
fi

পরীক্ষা

root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):  # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.