আমি কীভাবে লিনাক্স শেল স্ক্রিপ্টে হ্যাঁ / না / ইনপুট বাতিল করার অনুরোধ করব?


1443

আমি শেল স্ক্রিপ্টে ইনপুটটি বিরতি দিতে এবং ব্যবহারকারীকে পছন্দগুলির জন্য অনুরোধ করতে চাই।
মানক Yes, Noবা Cancelটাইপ প্রশ্ন।
আমি কীভাবে একটি সাধারণ ব্যাশ প্রম্পটে এটি সম্পাদন করব?


11
ঠিক যেমন একটি নোট: প্রম্পটের জন্য কনভেনশনটি এমন যে আপনি যদি কোনও [yn]বিকল্প উপস্থাপন করেন তবে মূলধনটি হ'ল ডিফল্ট, অর্থাত্ [Yn]"হ্যাঁ" এর [yN]ডিফল্ট এবং "না" তে ডিফল্ট। Ux.stackexchange.com/a/40445/43532
টাইজয়েড

জেডএসএইচ থেকে যে কেউ এখানে আসছেন, কীভাবে read
অনুরোধটি

উত্তর:


1614

শেল প্রম্পটে ব্যবহারকারী ইনপুট পাওয়ার সহজ ও বহুল ব্যবহৃত পদ্ধতি হ'ল readকমান্ড। এর ব্যবহার চিত্রিত করার সর্বোত্তম উপায় হ'ল একটি সাধারণ প্রদর্শনী:

while true; do
    read -p "Do you wish to install this program?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

আরেকটি পদ্ধতি, নির্দিষ্ট দ্বারা স্টিভেন Huwig , ব্যাশ কারো নির্দেশ চলে না selectকমান্ড। এখানে একই উদাহরণ ব্যবহার করে select:

echo "Do you wish to install this program?"
select yn in "Yes" "No"; do
    case $yn in
        Yes ) make install; break;;
        No ) exit;;
    esac
done

সঙ্গে selectআপনি ইনপুট নির্বিষ করার প্রয়োজন হবে না - এটি উপলব্ধ পছন্দ প্রদর্শন করে, এবং আপনি একটি নম্বর আপনার পছন্দ সংশ্লিষ্ট টাইপ করুন। এটি স্বয়ংক্রিয়ভাবে লুপ হয়, তাই কোনও প্রয়োজন নেই nowhile true তারা যদি অবৈধ ইনপুট দেয় তবে পুনরায় চেষ্টা করার লুপের ।

এছাড়াও, লিয়া গ্রিস তার উত্তরে অনুরোধের ভাষাটি অজ্ঞেয়বাদী করার একটি উপায় প্রদর্শন করেছিলেন । একাধিক ভাষাগুলি আরও ভালভাবে পরিবেশন করতে আমার প্রথম উদাহরণটি রূপান্তরিত হতে পারে:

set -- $(locale LC_MESSAGES)
yesptrn="$1"; noptrn="$2"; yesword="$3"; noword="$4"

while true; do
    read -p "Install (${yesword} / ${noword})? " yn
    case $yn in
        ${yesptrn##^} ) make install; break;;
        ${noptrn##^} ) exit;;
        * ) echo "Answer ${yesword} / ${noword}.";;
    esac
done

স্পষ্টতই অন্যান্য যোগাযোগের স্ট্রিংগুলি এখানে অপরিকল্পিত থেকে যায় (ইনস্টল করুন, উত্তর) যা আরও সম্পূর্ণরূপে সম্পূর্ণ অনুবাদে সম্বোধন করা দরকার, তবে একটি আংশিক অনুবাদও অনেক ক্ষেত্রে সহায়ক হবে।

অবশেষে, দয়া করে এফ হাউরির দুর্দান্ত উত্তরটি দেখুন


30
OS X এর চিতা মধ্যে ব্যাশ ব্যবহার করে, আমি পরিবর্তন exitকরতে breakট্যাব বন্ধ যখন আমি নির্বাচিত 'না' থেকে রাখা।
ট্রে পাইপমিয়ার

1
হ্যাঁ বা না এর চেয়ে দীর্ঘ বিকল্পগুলির সাথে এটি কীভাবে কাজ করবে? ক্ষেত্রে দফায় আপনি কি এমন কিছু লেখেন: প্রোগ্রাম ইনস্টল করুন এবং পরে কিছু করবেন না) ইনস্টল করুন; বিরতি;
শান

1
@ শ্যাশন রিড ব্যবহার করে আপনি অবশ্যই বাশ শেলের সুইচ স্টেটমেন্ট দ্বারা সমর্থিত যে কোনও গ্লোব বা রেজেক্স প্যাটার্ন ব্যবহার করতে পারেন। এটি কোনও মিল খুঁজে না পাওয়া পর্যন্ত এটি আপনার নিদর্শনগুলিতে টাইপ করা পাঠ্যের সাথে কেবল মিলছে। নির্বাচন ব্যবহার করে , পছন্দগুলির তালিকা কমান্ডকে দেওয়া হয় এবং এটি তাদের ব্যবহারকারীর কাছে প্রদর্শন করে। তালিকার আইটেমগুলি আপনার পছন্দ মতো দীর্ঘ বা ছোট হিসাবে থাকতে পারে। বিস্তৃত ব্যবহারের তথ্যের জন্য আমি তাদের ম্যান পৃষ্ঠাগুলি চেক করে পুনরায় সুপারিশ করছি।
মায়ার্ডিন এমরিস

3
কেন একটি হল breakমধ্যে selectযদি কোন লুপ?
জয়েন

1
@akostadinov আমার সত্যই আমার সম্পাদনার ইতিহাস আরও পড়তে হবে should আপনি সঠিক, আমি ভুল, এবং আমি জয় এর পরামর্শ অনুসরণ করে একটি বাগ প্রবর্তিত, হাহ। বাগটি পরে ঠিক করা হয়েছিল, তবে সম্পাদনাগুলি এতদূর পৃথক ছিল আমি এটিকে পরিবর্তন করার কথা মনেও করি নি।
মুর্ডদিন এমরিস

524

একটি জেনেরিক প্রশ্নের কমপক্ষে পাঁচটি উত্তর।

উপর নির্ভর করে

  • অনুবর্তী: জেনেরিক সহ দরিদ্র সিস্টেমে কাজ করতে পারে পরিবেশের
  • নির্দিষ্ট: তথাকথিত বাশিজম ব্যবহার করে

এবং যদি আপনি চান

  • সরল `line লাইনে '' প্রশ্ন / উত্তর (জেনেরিক সমাধান)
  • মত সুন্দর ফর্ম্যাট ইন্টারফেস বা আরও গ্রাফিকাল ব্যবহার করে libgtk বা libqt ...
  • শক্তিশালী পাঠ্যরেখার ইতিহাসের ক্ষমতা ব্যবহার করুন

1. পসিক্স জেনেরিক সমাধান

আপনি readকমান্ডটি ব্যবহার করতে পারেন , তারপরে if ... then ... else:

echo -n "Is this a good question (y/n)? "
read answer

# if echo "$answer" | grep -iq "^y" ;then

if [ "$answer" != "${answer#[Yy]}" ] ;then
    echo Yes
else
    echo No
fi

( অ্যাডাম কাটজের মন্তব্যে ধন্যবাদ : উপরের পরীক্ষাটি এমন একটি দিয়ে প্রতিস্থাপন করা হয়েছে যা আরও বহনযোগ্য এবং একটি কাঁটাচামচ এড়ানো যায় :)

পসিক্স, তবে একক কী বৈশিষ্ট্য

তবে আপনি যদি না চান যে ব্যবহারকারীকে আঘাত করতে হবে Return, আপনি লিখতে পারেন:

( সম্পাদিত: হিসাবে @JonathanLeffler ন্যায়ত পরামর্শ দিচ্ছি, সংরক্ষণ stty কনফিগারেশন ভাল চেয়ে কেবল করতে বাধ্য হতে পারে বিবেকী ।)

echo -n "Is this a good question (y/n)? "
old_stty_cfg=$(stty -g)
stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty
if echo "$answer" | grep -iq "^y" ;then
    echo Yes
else
    echo No
fi

দ্রষ্টব্য: এটির অধীনে পরীক্ষা করা হয়েছিল, , , এবং !

একই, তবে এর জন্য yবা স্পষ্টভাবে অপেক্ষা করছি n:

#/bin/sh
echo -n "Is this a good question (y/n)? "
old_stty_cfg=$(stty -g)
stty raw -echo
answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done )
stty $old_stty_cfg
if echo "$answer" | grep -iq "^y" ;then
    echo Yes
else
    echo No
fi

উত্সর্গীকৃত সরঞ্জাম ব্যবহার করে

অনেক টুলস আছে যা ব্যবহার করে নির্মিত হয় libncurses, libgtk, libqtবা অন্যান্য গ্রাফিক্যাল লাইব্রেরি। উদাহরণস্বরূপ, ব্যবহার করে whiptail:

if whiptail --yesno "Is this a good question" 20 60 ;then
    echo Yes
else
    echo No
fi

আপনার সিস্টেমের উপর নির্ভর করে আপনার whiptailঅন্য একটি সাদৃশ্য সরঞ্জাম দিয়ে প্রতিস্থাপনের প্রয়োজন হতে পারে :

dialog --yesno "Is this a good question" 20 60 && echo Yes

gdialog --yesno "Is this a good question" 20 60 && echo Yes

kdialog --yesno "Is this a good question" 20 60 && echo Yes

যেখানে 20লাইনের সংখ্যায় ডায়ালগ বক্সের উচ্চতা এবং ডায়ালগ বক্সের 60প্রস্থ। এই সরঞ্জামগুলির সকলের কাছে একই বাক্য গঠন রয়েছে।

DIALOG=whiptail
if [ -x /usr/bin/gdialog ] ;then DIALOG=gdialog ; fi
if [ -x /usr/bin/xdialog ] ;then DIALOG=xdialog ; fi
...
$DIALOG --yesno ...

২. নির্দিষ্ট সমাধান সমাধান

লাইন পদ্ধতিতে বেসিক

read -p "Is this a good question (y/n)? " answer
case ${answer:0:1} in
    y|Y )
        echo Yes
    ;;
    * )
        echo No
    ;;
esac

আমি ব্যবহার করতে পছন্দ করি caseতাই আমি পরীক্ষাও করতে পারিyes | ja | si | oui প্রয়োজনে ...

একক কী সঙ্গে লাইন বৈশিষ্ট্যের

বাশের অধীনে, আমরা readকমান্ডটির জন্য উদ্দেশ্যে ইনপুটটির দৈর্ঘ্য নির্দিষ্ট করতে পারি :

read -n 1 -p "Is this a good question (y/n)? " answer

বাশের অধীনে, readকমান্ড একটি সময়সীমা পরামিতি গ্রহণ করে , যা দরকারী হতে পারে।

read -t 3 -n 1 -p "Is this a good question (y/n)? " answer
[ -z "$answer" ] && answer="Yes"  # if 'yes' have to be default choice

3. উত্সর্গীকৃত সরঞ্জামের জন্য কিছু কৌশল

সাধারণ yes - noউদ্দেশ্যগুলি ছাড়িয়ে আরও পরিশীলিত ডায়ালগ বাক্স :

dialog --menu "Is this a good question" 20 60 12 y Yes n No m Maybe

অগ্রগতি বার:

dialog --gauge "Filling the tank" 20 60 0 < <(
    for i in {1..100};do
        printf "XXX\n%d\n%(%a %b %T)T progress: %d\nXXX\n" $i -1 $i
        sleep .033
    done
) 

ছোট্ট ডেমো:

#!/bin/sh
while true ;do
    [ -x "$(which ${DIALOG%% *})" ] || DIALOG=dialog
    DIALOG=$($DIALOG --menu "Which tool for next run?" 20 60 12 2>&1 \
            whiptail       "dialog boxes from shell scripts" >/dev/tty \
            dialog         "dialog boxes from shell with ncurses" \
            gdialog        "dialog boxes from shell with Gtk" \
            kdialog        "dialog boxes from shell with Kde" ) || exit
    clear;echo "Choosed: $DIALOG."
    for i in `seq 1 100`;do
        date +"`printf "XXX\n%d\n%%a %%b %%T progress: %d\nXXX\n" $i $i`"
        sleep .0125
      done | $DIALOG --gauge "Filling the tank" 20 60 0
    $DIALOG --infobox "This is a simple info box\n\nNo action required" 20 60
    sleep 3
    if $DIALOG --yesno  "Do you like this demo?" 20 60 ;then
        AnsYesNo=Yes; else AnsYesNo=No; fi
    AnsInput=$($DIALOG --inputbox "A text:" 20 60 "Text here..." 2>&1 >/dev/tty)
    AnsPass=$($DIALOG --passwordbox "A secret:" 20 60 "First..." 2>&1 >/dev/tty)
    $DIALOG --textbox /etc/motd 20 60
    AnsCkLst=$($DIALOG --checklist "Check some..." 20 60 12 \
        Correct "This demo is useful"        off \
        Fun        "This demo is nice"        off \
        Strong        "This demo is complex"        on 2>&1 >/dev/tty)
    AnsRadio=$($DIALOG --radiolist "I will:" 20 60 12 \
        " -1" "Downgrade this answer"        off \
        "  0" "Not do anything"                on \
        " +1" "Upgrade this anser"        off 2>&1 >/dev/tty)
    out="Your answers:\nLike: $AnsYesNo\nInput: $AnsInput\nSecret: $AnsPass"
    $DIALOG --msgbox "$out\nAttribs: $AnsCkLst\nNote: $AnsRadio" 20 60
  done

আরও নমুনা? ইউএসবি ডিভাইস এবং ইউএসবি অপসারণযোগ্য স্টোরেজ নির্বাচনকারী নির্বাচন করার জন্য হুইপটেল ব্যবহার করে দেখুন : ইউএসবিকিচুসার

৫. পঠনের ইতিহাস ব্যবহার

উদাহরণ:

#!/bin/bash

set -i
HISTFILE=~/.myscript.history
history -c
history -r

myread() {
    read -e -p '> ' $1
    history -s ${!1}
}
trap 'history -a;exit' 0 1 2 3 6

while myread line;do
    case ${line%% *} in
        exit )  break ;;
        *    )  echo "Doing something with '$line'" ;;
      esac
  done

এই ফাইল তৈরি করবে .myscript.historyআপনার $HOMEডিরেক্টরির চেয়ে আপনি readline ইতিহাসে কমান্ড ব্যবহার করতে পারে, মত Up, Down, Ctrl+ + rএবং অন্যদের।


4
লক্ষ্য করুন sttyপ্রদান করে -gব্যবহারের জন্য বিকল্প: old_stty=$(stty -g); stty raw -echo; …; stty "$old_stty"। এটি সেটিংটি ঠিক যেমন পাওয়া গেছে ঠিক তেমন পুনরুদ্ধার করে যা এর মতো হতে পারে এবং নাও হতে পারে stty -sane
জোনাথন লেফলার

3
read answerফাঁকা স্থান এবং লাইন ফিডগুলির আগে ব্যাকস্ল্যাশগুলির ব্যাখ্যা করবে এবং অন্যথায় এগুলি কেটে ফেলা হবে যা বিরল উদ্দেশ্যযুক্ত। read -r answerপরিবর্তে SC2162 অনুযায়ী ব্যবহার করুন ।
vlfig

1
"রিডলাইনের ইতিহাস ব্যবহার করা" পদ্ধতিটি ওপি-র প্রশ্নের পক্ষে মারাত্মকভাবে অনুপযুক্ত। আমি আনন্দিত আপনি যেভাবেই এটি অন্তর্ভুক্ত করেছেন। আমার কাছে আরও অনেক জটিল স্ক্রিপ্ট রয়েছে যা আমি সেই প্যাটার্নটি দিয়ে আপডেট করতে চাইছি!
ব্রুনো ব্রোনোস্কি

5
আপনি caseপসিক্স পাশাপাশি ব্যাশের জন্যও ব্যবহার করতে পারেন (ব্যাশ সাবস্ট্রিংয়ের পরিবর্তে ওয়াইল্ডকার্ড শর্তটি ব্যবহার করুন case $answer in; [Yy]* ) echo Yes ;;:) তবে আমি পরিবর্তে শর্তসাপেক্ষ বিবৃতি ব্যবহার করতে পছন্দ করি, [ "$answer" != "${answer#[Yy]}" ]আপনার পক্ষপাতিত্ব করে echo "$answer" | grep -iq ^y। এটি আরও বহনযোগ্য (কিছু নন-জিএনইউ গ্রেপস -qসঠিকভাবে প্রয়োগ করে না) এবং এতে সিস্টেম কল নেই। ${answer#[Yy]}অপসারণের জন্য Yবা yশুরু থেকে প্যারামিটার সম্প্রসারণ ব্যবহার করে $answer, যখন উপস্থিত থাকে তখন একটি বৈষম্য তৈরি করে। এটি কোনও পসিক্স শেল (ড্যাশ, কেএসএস, ব্যাশ, জেডএস, ব্যস্তবক্স, ইত্যাদি) এ কাজ করে।
আদম কাটজ

1
@ কার্টারপেইপ হ্যাঁ, এটি একটি রসিকতা ছিল! তবে এই স্থগিত উত্তরে আপনি অনেক টিপস পেতে পারেন (দ্বিতীয় পয়েন্টটি কমপক্ষে 3 টি ভিন্ন পদ্ধতি উপস্থাপন করুন)! এবং ... এখন থেকে প্রায় 5 বছর থেকে, আপনি আমার গণনা পদ্ধতি সম্পর্কে প্রথমে বলবেন! ;-))
এফ। হাউরি

349
echo "Please enter some input: "
read input_variable
echo "You entered: $input_variable"

25
আমি দ্বিমত পোষণ করছি, কারণ এটি কেবল ডসটিতে 'হ্যাঁ, না, বাতিল করুন' কথোপকথনের কার্যকারিতার একটি অংশ প্রয়োগ করে। যে অংশটি এটি প্রয়োগ করতে ব্যর্থ তা হ'ল ইনপুট চেকিং ... একটি বৈধ উত্তর না পাওয়া পর্যন্ত লুপিং।
Myrddin Emrys

1
(আসল প্রশ্নের শিরোনামটি ছিল "আমি লিনাক্স শেল স্ক্রিপ্টে ইনপুট দেওয়ার জন্য কীভাবে অনুরোধ করব?")
পিস্তস

8
তবে মূল প্রশ্নের বিবরণ অপরিবর্তিত, এবং সর্বদা একটি হ্যাঁ / না / বাতিল প্রম্পটের প্রতিক্রিয়া চেয়েছিল। শিরোনামটি আমার আসলটির চেয়ে পরিষ্কার হওয়ার জন্য আপডেট করা হয়েছে, তবে প্রশ্নের বিবরণ সর্বদা পরিষ্কার ছিল (আমার মতে)।
মায়ার্ডিন এমরিস

165

আপনি বিল্ট ইন রিড কমান্ড ব্যবহার করতে পারেন ; -pব্যবহারকারীকে একটি প্রশ্ন জিজ্ঞাসা করার জন্য বিকল্পটি ব্যবহার করুন ।

BASH4 যেহেতু আপনি এখন -iএকটি উত্তর প্রস্তাব করতে ব্যবহার করতে পারেন :

read -e -p "Enter the path to the file: " -i "/usr/local/etc/" FILEPATH
echo $FILEPATH

(তবে -eতীর কীগুলির সাহায্যে লাইন সম্পাদনা করতে "রিডলাইন" বিকল্পটি ব্যবহার করা মনে রাখবেন )

যদি আপনি "হ্যাঁ / না" যুক্তি চান তবে আপনি এরকম কিছু করতে পারেন:

read -e -p "
List the content of your home dir ? [Y/n] " YN

[[ $YN == "y" || $YN == "Y" || $YN == "" ]] && ls -la ~/

6
এটি লক্ষ করা উচিত যে FILEPATHএটি আপনার পছন্দসই নামটি বেছে নিয়েছে এবং কমান্ড প্রম্পটের উত্তর দিয়ে সেট করা হবে। সুতরাং আপনি যদি চালানো হয় vlc "$FILEPATH", উদাহরণস্বরূপ, vlcফাইলটি খুলতে হবে।
কেন শার্প

-eদ্বিতীয় উদাহরণের সুবিধা কী (সহজ হ্যাঁ / না)?
জেবালিন

-e -pপরিবর্তে ব্যবহার করার কোনও কারণ -ep?
জেবালিন

1
ছাড়া -eপতাকা / বিকল্প, আপনি (বাস্তবায়ন উপর নির্ভর করে) নাও করতে পারে "Y" টাইপ, এবং তারপর আপনার মন পরিবর্তন এবং একটি "এন" (অথবা যে বিষয়টি জন্য অন্য কিছু) সঙ্গে এটি প্রতিস্থাপন পাবে; কমান্ড ডকুমেন্ট করার সময় অপশনগুলি পৃথকভাবে তালিকাভুক্ত করা অন্যান্য কারণগুলির মধ্যে পঠনযোগ্যতা / স্পষ্টতার জন্য ভাল।
yPhil

109

বাশ এই উদ্দেশ্যে নির্বাচন করেছেন ।

select result in Yes No Cancel
do
    echo $result
done

18
+1 সাধারণভাবে সহজ সমাধান simple কেবলমাত্র: এটি প্রম্পট এবং প্রম্পট এবং প্রম্পট হবে ... যতক্ষণ না আপনি কোনও exitঅভ্যন্তর যোগ করবেন :)
কাইজার

5
(কায়সার: এটি থেকে বিরতি পেতে, কেবল EOT প্রবেশ করান: Ctrl-Dতবে অবশ্যই এটি ব্যবহার করে আসল
কোডটির

12
এটি আপনাকে y বা n এ প্রবেশ করতে দেবে না, যদিও আপনি 1 2 বা 3 প্রবেশ করে চয়ন করেন
ডিজেজেক

3
exitসব একসাথে স্ক্রিপ্ট থেকে প্রস্থান করা হবে, breakশুধুমাত্র লুপ যেখানে আপনি থাকেন (যদি আপনি একটি উপর থেকে প্রস্থান করা হবে whileবা caseলুপ)
wranvaud

57
read -p "Are you alright? (y/n) " RESP
if [ "$RESP" = "y" ]; then
  echo "Glad to hear it"
else
  echo "You need more bash programming"
fi

36

এখানে আমি একসাথে কিছু রেখেছি:

#!/bin/sh

promptyn () {
    while true; do
        read -p "$1 " yn
        case $yn in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Please answer yes or no.";;
        esac
    done
}

if promptyn "is the sky blue?"; then
    echo "yes"
else
    echo "no"
fi

আমি একজন শিক্ষানবিস, সুতরাং এটি একটি দান লবণের সাথে নিন তবে এটি কার্যকর বলে মনে হচ্ছে।


9
আপনি পরিবর্তন করেন তাহলে case $yn inথেকে case ${yn:-$2} inতারপর আপনি ডিফল্ট মান হিসাবে দ্বিতীয় যুক্তি ব্যবহার করতে পারেন, ওয়াই বা এন
jchook

1
বা পরিবর্তন case $ynকরতে case "${yn:-Y}"ডিফল্ট হ্যাঁ আছে
rubo77

35
inquire ()  {
  echo  -n "$1 [y/n]? "
  read answer
  finish="-1"
  while [ "$finish" = '-1' ]
  do
    finish="1"
    if [ "$answer" = '' ];
    then
      answer=""
    else
      case $answer in
        y | Y | yes | YES ) answer="y";;
        n | N | no | NO ) answer="n";;
        *) finish="-1";
           echo -n 'Invalid response -- please reenter:';
           read answer;;
       esac
    fi
  done
}

... other stuff

inquire "Install now?"

...

1
কোডের বিন্যাস সংরক্ষণের জন্য প্রতিটি লাইনের শুরুতে চারটি স্পেস রাখুন।
Jouni K. Seppänen

10
যদি কেস সুইচগুলি হার্ডকোড করা থাকে তবে আমরা কেন অনুসন্ধানের জন্য প্যারামিটার হিসাবে 'y' এবং 'n' সরবরাহ করব? এটি কেবল অপব্যবহারের জন্য জিজ্ঞাসা করছে। এগুলি নির্দিষ্ট প্যারামিটারগুলি, পরিবর্তনযোগ্য নয়, সুতরাং 2 লাইনের প্রতিধ্বনিটি পড়তে হবে: প্রতিধ্বনি -n "-1 [Y / N]?" সেগুলি পরিবর্তন করা যায় না, তাই তাদের সরবরাহ করা উচিত নয়।
মায়ার্ডিন এমরিস

1
@ মায়ার্ডিন এমরিস আপনি কি আপনার মন্তব্যটি বিস্তারিতভাবে বর্ণনা করতে পারেন? অথবা কোনও নিবন্ধে বা কয়েকটি কীওয়ার্ডের লিঙ্ক পোস্ট করুন যাতে আমি নিজেরাই গবেষণা করতে পারি।
ম্যাটিউজ পিয়োত্রস্কি

4
@ ম্যাটিউজপিয়োট্রোস্কি আমার মন্তব্য করার পরে উত্তরটি সম্পাদনা ও উন্নত করা হয়েছে। এই উত্তরের অতীত সমস্ত সংস্করণ দেখতে আপনি উপরের '23 ডিসেম্বর সম্পাদিত 'লিঙ্কটিতে ক্লিক করতে পারেন। ২০০৮ সালে কোডটি বেশ আলাদা ছিল।
মায়ার্ডিন এমরিস

27

তুমি চাও:

  • বাশ বিল্টিন কমান্ড (যেমন পোর্টেবল)
  • টিটিওয়াই পরীক্ষা করুন
  • ডিফল্ট উত্তর
  • সময় শেষ
  • রঙিন প্রশ্ন

টুকিটাকি

do_xxxx=y                      # In batch mode => Default is Yes
[[ -t 0 ]] &&                  # If TTY => Prompt the question
read -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx  # Store the answer in $do_xxxx
if [[ $do_xxxx =~ ^(y|Y|)$ ]]  # Do if 'y' or 'Y' or empty
then
    xxxx
fi

ব্যাখ্যা

  • [[ -t 0 ]] && read ... => কমান্ড কল করুন read টিটিওয়াই হলে
  • read -n 1 => একটি চরিত্রের জন্য অপেক্ষা করুন
  • $'\e[1;32m ... \e[0m ' => সবুজ মুদ্রণ
    (সবুজ ভাল কারণ সাদা / কালো উভয় পটভূমিতে পঠনযোগ্য)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => বাশ রেজেক্স

সময়সীমা => ডিফল্ট উত্তর হ'ল না

do_xxxx=y
[[ -t 0 ]] && {                   # Timeout 5 seconds (read -t 5)
read -t 5 -n 1 -p $'\e[1;32m
Do xxxx? (Y/n)\e[0m ' do_xxxx ||  # read 'fails' on timeout
do_xxxx=n ; }                     # Timeout => answer No
if [[ $do_xxxx =~ ^(y|Y|)$ ]]
then
    xxxx
fi

26

নিম্নতম সংখ্যক লাইনের সাথে এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল:

read -p "<Your Friendly Message here> : y/n/cancel" CONDITION;

if [ "$CONDITION" == "y" ]; then
   # do something here!
fi

ifশুধু একটি উদাহরণ: এটি এই পরিবর্তনশীল হ্যান্ডেল করতে কিভাবে আপনি আপ হয়।


20

readকমান্ডটি ব্যবহার করুন :

echo Would you like to install? "(Y or N)"

read x

# now check if $x is "y"
if [ "$x" = "y" ]; then
    # do something here!
fi

এবং তারপরে আপনার প্রয়োজনীয় সমস্ত জিনিস


17

এই সমাধানটি একটি একক অক্ষর পড়ে এবং হ্যাঁ প্রতিক্রিয়াতে একটি ফাংশন কল করে।

read -p "Are you sure? (y/n) " -n 1
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    do_something      
fi

2
@ জাভ আপনার প্রতিবেদনের পরে প্রতিবেদনটি একটি নতুন লাইন প্রিন্ট করে। এটি না করে, মুদ্রণ করার জন্য পরবর্তী জিনিসটি একই লাইনে আপনার প্রতিক্রিয়া হওয়ার সাথে সাথে উপস্থিত হবে। echoনিজের জন্য দেখার অপসারণ চেষ্টা করুন ।
ডেনিস 16

13

একটি সুন্দর ncurses- মত ইনপুটবক্স পেতে কমান্ড ডায়ালগ ব্যবহার করুন :

#!/bin/bash
if (dialog --title "Message" --yesno "Want to do something risky?" 6 25)
# message box will have the size 25x6 characters
then 
    echo "Let's do something risky"
    # do something risky
else 
    echo "Let's stay boring"
fi

কমপক্ষে SUSE লিনাক্সের সাথে ডায়ালগ প্যাকেজটি ডিফল্টরূপে ইনস্টল করা হয়। দেখতে: কার্য "ডায়লগ" কমান্ড


12
read -e -p "Enter your choice: " choice

দ্য -eবিকল্প ইনপুট নির্দেশক তীরচিহ্নগুলি ব্যবহার করে সম্পাদন করা ব্যবহারকারীর দেয়।

আপনি যদি ইনপুট হিসাবে কোনও পরামর্শ ব্যবহার করতে চান:

read -e -i "yes" -p "Enter your choice: " choice

-i বিকল্প একটি পরামর্শমূলক ইনপুট প্রিন্ট করে।


Yap, -e -iSH (বোর্ন শেল) এ কাজ করে না, কিন্তু প্রশ্ন বিশেষভাবে বাঁধা ব্যাশ এসে গেছে ..
জাহিদ

12

আপনি ডিফল্ট ব্যবহার করতে পারেন REPLYএকটি উপর readছোট হাতের অক্ষরে এবং একটি অভিব্যক্তি সঙ্গে ভেরিয়েবল একটি সেট সাথে তুলনা করতে, রূপান্তর করুন।
স্ক্রিপ্ট ja/ si/ সমর্থন করেoui

read -rp "Do you want a demo? [y/n/c] "

[[ ${REPLY,,} =~ ^(c|cancel)$ ]] && { echo "Selected Cancel"; exit 1; }

if [[ ${REPLY,,} =~ ^(y|yes|j|ja|s|si|o|oui)$ ]]; then
   echo "Positive"
fi

12

পসিক্স শেলটিতে লোকাল-সচেতন "হ্যাঁ / কোনও পছন্দ নয়" পরিচালনা করা সম্ভব; LC_MESSAGESস্থানীয় বিভাগের এন্ট্রিগুলি ব্যবহার করে ডাইনি একটি ইনপুট মেলে রেডিমেড রেজিএক্স নিদর্শনগুলি সরবরাহ করে এবং স্থানীয় হ্যাঁ নংয়ের জন্য স্ট্রিং সরবরাহ করে

#!/usr/bin/env sh

# Getting LC_MESSAGES values into variables
# shellcheck disable=SC2046 # Intended IFS splitting
IFS='
' set -- $(locale LC_MESSAGES)

yesexpr="$1"
noexpr="$2"
yesstr="$3"
nostr="$4"
messages_codeset="$5" # unused here, but kept as documentation

# Display Yes / No ? prompt into locale
echo "$yesstr / $nostr ?"

# Read answer
read -r yn

# Test answer
case "$yn" in
# match only work with the character class from the expression
  ${yesexpr##^}) echo "answer $yesstr" ;;
  ${noexpr##^}) echo "answer $nostr" ;;
esac

সম্পাদনা: যেমন @ উরিশিদুর তার মন্তব্যে উল্লেখ করেছেন :

দুর্ভাগ্যক্রমে, পসিক্স কেবল প্রথম দুটি নির্দিষ্ট করে (ইয়েেক্সপ্রপ এবং নেক্সপ্রপ)। উবুন্টু 16 এ, হ্যাঁস্ট্রি এবং নস্টার খালি রয়েছে।

দেখুন: https://www.ee.ryerson.ca/~courses/ele709/susv4/xrat/V4_xbd_chap07.html#tag_21_07_03_06

LC_MESSAGES

yesstrএবং nostrলোকেল কীওয়ার্ড এবং YESSTRএবং NOSTRআইটেম langinfo পূর্বে ব্যবহারকারী ম্যাচ সম্মতিসূচক ও নেতিবাচক প্রতিক্রিয়া ব্যবহার করা হয়েছে। POSIX.1-2008 সালে yesexpr, noexpr, YESEXPR, এবং NOEXPRবর্ধিত রেগুলার এক্সপ্রেশনের তাদের প্রতিস্থাপিত হয়েছে। অ্যাপ্লিকেশনগুলিতে প্রম্পটিং বার্তাগুলি ইস্যু করতে সাধারণ লোকেল-ভিত্তিক বার্তাপ্রেরণ সুবিধাগুলি ব্যবহার করা উচিত যা নমুনা পছন্দসই প্রতিক্রিয়াগুলিকে অন্তর্ভুক্ত করে।

বিকল্পভাবে বাশ পদ্ধতিতে লোকেলগুলি ব্যবহার করে:

#!/usr/bin/env bash

IFS=$'\n' read -r -d '' yesexpr noexpr _ < <(locale LC_MESSAGES)

printf -v yes_or_no_regex "(%s)|(%s)" "$yesexpr" "$noexpr"

printf -v prompt $"Please answer Yes (%s) or No (%s): " "$yesexpr" "$noexpr"

declare -- answer=;

until [[ "$answer" =~ $yes_or_no_regex ]]; do
  read -rp "$prompt" answer
done

if [[ -n "${BASH_REMATCH[1]}" ]]; then
  echo $"You answered: Yes"
else
  echo $"No, was your answer."
fi

উত্তরটি স্থানীয় পরিবেশের সরবরাহিত রেজিজেপস ব্যবহার করে মিলেছে।

অবশিষ্ট বার্তাগুলি অনুবাদ করতে, bash --dump-po-strings scriptnameস্থানীয়করণের জন্য পো স্ট্রিং আউটপুট ব্যবহার করুন :

#: scriptname:8
msgid "Please answer Yes (%s) or No (%s): "
msgstr ""
#: scriptname:17
msgid "You answered: Yes"
msgstr ""
#: scriptname:19
msgid "No, was your answer."
msgstr ""

আমি একটি ভাষা অজ্ঞানীয় বিকল্প যুক্ত করা পছন্দ করি। সাবাশ.
মায়ার্ডিন এমরিস

1
দুর্ভাগ্যক্রমে, পসিক্স কেবল প্রথম দুটি নির্দিষ্ট করে (ইয়েেক্সপ্রপ এবং নেক্সপ্রপ)। উবুন্টু 16 এ, হ্যাঁস্ট্রি এবং নস্টার খালি রয়েছে।
উরিখসিদুর

1
কিন্তু অপেক্ষা করো! আরও খারাপ খবর আছে! বাশ কেস স্টেটমেন্টের এক্সপ্রেশনগুলি নিয়মিত নয়, এগুলি ফাইল নাম প্রকাশ express সুতরাং উবুন্টু 16 এর ইয়েসপ্রস এবং নেক্সপ্রপ ("pr [yY]। *" এবং "^ [এনএন]। *", যথাক্রমে) এম্বেড থাকা সময়ের কারণে পুরোপুরি ব্যর্থ হবে। একটি নিয়মিত অভিব্যক্তিতে, "। *" এর অর্থ "কোনও নতুন-লাইন অক্ষর, শূন্য বা তার বেশি বার"। তবে একটি ক্ষেত্রে বিবৃতিতে, এটি একটি আক্ষরিক "।" অক্ষরের সংখ্যা অনুসরণ করে।
hiরহীসিদুর

1
শেল পরিবেশের সাথে yesexprএবং noexprশেল পরিবেশে সবচেয়ে ভাল যেটি করা যায় , তা বাশের নির্দিষ্ট রেজিএক্স ম্যাচে এটি ব্যবহার করা হয়if [[ "$yn" =~ $yesexpr ]]; then echo $"Answered yes"; else echo $"Answered no"; fi
লায়া গ্রিস

10

একক কিপ্রেস কেবল

এখানে একটি দীর্ঘ, কিন্তু পুনরায় ব্যবহারযোগ্য এবং মডুলার পদ্ধতির:

  • প্রত্যাশা 0= হ্যাঁ এবং 1= না
  • কোনও টিপুন প্রবেশের দরকার নেই - কেবল একটি একক অক্ষর
  • enterডিফল্ট পছন্দটি গ্রহণ করতে টিপতে পারেন
  • নির্বাচনকে বাধ্য করার জন্য ডিফল্ট পছন্দটি অক্ষম করতে পারে
  • উভয় zshএবং জন্য কাজ করে bash

এন্টার টিপে "না" এ ডিফল্ট করা হচ্ছে

নোট করুন যে Nমূলধন হয়। ডিফল্ট গ্রহণ করে এন্টার টিপুন:

$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]?

এছাড়াও নোট করুন, এটি [y/N]?স্বয়ংক্রিয়ভাবে সংযোজন করা হয়েছিল। ডিফল্ট "না" স্বীকৃত, তাই কিছুই প্রতিধ্বনিত হয় না।

বৈধ প্রতিক্রিয়া না দেওয়া পর্যন্ত পুনরায় প্রম্পট করুন:

$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]? X
Show dangerous command [y/N]? y
rm *

এন্টার টিপে "হ্যাঁ" এ ডিফল্ট করা হচ্ছে

নোট করুন যে Yমূলধনযুক্ত:

$ confirm_yes "Show dangerous command" && echo "rm *"
Show dangerous command [Y/n]?
rm *

উপরে, আমি সবেমাত্র এন্টার টিপলাম, সুতরাং কমান্ডটি দৌড়ে গেল।

কোনও ডিফল্ট নেই enter- প্রয়োজন yবাn

$ get_yes_keypress "Here you cannot press enter. Do you like this [y/n]? "
Here you cannot press enter. Do you like this [y/n]? k
Here you cannot press enter. Do you like this [y/n]?
Here you cannot press enter. Do you like this [y/n]? n
$ echo $?
1

এখানে, 1বা মিথ্যা ফিরিয়ে দেওয়া হয়েছিল। নোট করুন যে এই নিম্ন-স্তরের ফাংশনটির সাথে আপনার নিজের [y/n]?প্রম্পট সরবরাহ করতে হবে।

কোড

# Read a single char from /dev/tty, prompting with "$*"
# Note: pressing enter will return a null string. Perhaps a version terminated with X and then remove it in caller?
# See https://unix.stackexchange.com/a/367880/143394 for dealing with multi-byte, etc.
function get_keypress {
  local REPLY IFS=
  >/dev/tty printf '%s' "$*"
  [[ $ZSH_VERSION ]] && read -rk1  # Use -u0 to read from STDIN
  # See https://unix.stackexchange.com/q/383197/143394 regarding '\n' -> ''
  [[ $BASH_VERSION ]] && </dev/tty read -rn1
  printf '%s' "$REPLY"
}

# Get a y/n from the user, return yes=0, no=1 enter=$2
# Prompt using $1.
# If set, return $2 on pressing enter, useful for cancel or defualting
function get_yes_keypress {
  local prompt="${1:-Are you sure [y/n]? }"
  local enter_return=$2
  local REPLY
  # [[ ! $prompt ]] && prompt="[y/n]? "
  while REPLY=$(get_keypress "$prompt"); do
    [[ $REPLY ]] && printf '\n' # $REPLY blank if user presses enter
    case "$REPLY" in
      Y|y)  return 0;;
      N|n)  return 1;;
      '')   [[ $enter_return ]] && return "$enter_return"
    esac
  done
}

# Credit: http://unix.stackexchange.com/a/14444/143394
# Prompt to confirm, defaulting to NO on <enter>
# Usage: confirm "Dangerous. Are you sure?" && rm *
function confirm {
  local prompt="${*:-Are you sure} [y/N]? "
  get_yes_keypress "$prompt" 1
}    

# Prompt to confirm, defaulting to YES on <enter>
function confirm_yes {
  local prompt="${*:-Are you sure} [Y/n]? "
  get_yes_keypress "$prompt" 0
}

আমি যখন এই স্ক্রিপ্টটি পরীক্ষা করেছি, উপরের আউটআউটটির পরিবর্তে আমি পেয়েছি Show dangerous command [y/N]? [y/n]?এবংShow dangerous command [Y/n]? [y/n]?
ইলিয়াস করিম

ধন্যবাদ @ ইলিয়াসকারিম, আমি এখনই এটি স্থির করেছি।
টম হেল

9

এত পুরানো পোস্টে পোস্ট করার জন্য দুঃখিত। কয়েক সপ্তাহ আগে আমিও একই রকম সমস্যার মুখোমুখি হয়েছিলাম, আমার ক্ষেত্রে আমার এমন একটি সমাধানের প্রয়োজন ছিল যা একটি অনলাইন ইনস্টলার-স্ক্রিপ্টের মধ্যেও কাজ করেছিল, যেমন:curl -Ss https://raw.github.com/_____/installer.sh | bash

read yesno < /dev/ttyআমার জন্য ভাল কাজ করে :

echo -n "These files will be uploaded. Is this ok? (y/n) "
read yesno < /dev/tty

if [ "x$yesno" = "xy" ];then

   # Yes
else

   # No
fi

আশা করি এটি কাউকে সাহায্য করবে।


এর একটি গুরুত্বপূর্ণ অংশটি ইনপুট বৈধতা। আমি মনে করি আমার প্রথম উদাহরণটি ttyযেমন আপনি যেমন করতেন তেমনিভাবে ইনপুট গ্রহণ করতে চান, এবং খারাপ ইনপুটটিতে লুপিংও পেতে পারেন (বাফারে কয়েকটি অক্ষরের কথা কল্পনা করুন; আপনার পদ্ধতিটি ব্যবহারকারীকে সর্বদা পছন্দ করতে বাধ্য করবে )।
মায়ার্ডিন এমরিস

7

আমি লক্ষ্য করেছি যে এমন সাধারণ ব্যবহারকারীর ইনপুটটির জন্য কোনও মাল্টি-লাইন ইকো মেনু দেখায় কোনও উত্তর পোস্ট করেনি তাই এখানে আমার এখানে যাওয়া:

#!/bin/bash

function ask_user() {    

echo -e "
#~~~~~~~~~~~~#
| 1.) Yes    |
| 2.) No     |
| 3.) Quit   |
#~~~~~~~~~~~~#\n"

read -e -p "Select 1: " choice

if [ "$choice" == "1" ]; then

    do_something

elif [ "$choice" == "2" ]; then

    do_something_else

elif [ "$choice" == "3" ]; then

    clear && exit 0

else

    echo "Please select 1, 2, or 3." && sleep 3
    clear && ask_user

fi
}

ask_user

এই পদ্ধতিটি পোস্টে পোস্ট করা হয়েছিল এই আশায় যে কেউ এটি কার্যকর এবং সময় সাশ্রয় করতে পারে।


4

একাধিক পছন্দ সংস্করণ:

ask () {                        # $1=question $2=options
    # set REPLY
    # options: x=..|y=..
    while $(true); do
        printf '%s [%s] ' "$1" "$2"
        stty cbreak
        REPLY=$(dd if=/dev/tty bs=1 count=1 2> /dev/null)
        stty -cbreak
        test "$REPLY" != "$(printf '\n')" && printf '\n'
        (
            IFS='|'
            for o in $2; do
                if [ "$REPLY" = "${o%%=*}" ]; then
                    printf '\n'
                    break
                fi
            done
        ) | grep ^ > /dev/null && return
    done
}

উদাহরণ:

$ ask 'continue?' 'y=yes|n=no|m=maybe'
continue? [y=yes|n=no|m=maybe] g
continue? [y=yes|n=no|m=maybe] k
continue? [y=yes|n=no|m=maybe] y
$

এটি সেট REPLYকরা হবে y(স্ক্রিপ্ট ভিতরে)।


4

আমি আপনাকে ডায়লগ ব্যবহার করার পরামর্শ দিচ্ছি ...

লিনাক্স শিক্ষানবিস: ডায়ালগ ব্যবহার করে ব্যাশ শেল স্ক্রিপ্টগুলি উন্নত করুন

ডায়ালগ কমান্ড শেল স্ক্রিপ্টগুলিতে উইন্ডো বাক্সগুলির ব্যবহারকে আরও ইন্টারেক্টিভ করতে সক্ষম করে।

এটি সহজ এবং ব্যবহার করা সহজ, এছাড়াও জিডিয়ালগ নামে একটি জিনোম সংস্করণ রয়েছে যা সঠিক একই পরামিতি গ্রহণ করে তবে এটি X- এ জিইউআই স্টাইল দেখায়


নৈমিত্তিক পাঠকের জন্য, এখানে ডায়ালগ কমান্ডটি ব্যবহার করে একটি স্নিপেটের দিকে তাকান: stackoverflow.com/a/22893526/363573
স্টিফান

4

@ মার্ক এবং @ মের্ডদিনের উত্তরে অনুপ্রাণিত হয়ে আমি সর্বজনীন প্রম্পটের জন্য এই ফাংশনটি তৈরি করেছি

uniprompt(){
    while true; do
        echo -e "$1\c"
        read opt
        array=($2)
        case "${array[@]}" in  *"$opt"*) eval "$3=$opt";return 0;; esac
        echo -e "$opt is not a correct value\n"
    done
}

এটি এর মতো ব্যবহার করুন:

unipromtp "Select an option: (a)-Do one (x)->Do two (f)->Do three : " "a x f" selection
echo "$selection"

4

আরও জেনেরিক হবে:

function menu(){
    title="Question time"
    prompt="Select:"
    options=("Yes" "No" "Maybe")
    echo "$title"
    PS3="$prompt"
    select opt in "${options[@]}" "Quit/Cancel"; do
        case "$REPLY" in
            1 ) echo "You picked $opt which is option $REPLY";;
            2 ) echo "You picked $opt which is option $REPLY";;
            3 ) echo "You picked $opt which is option $REPLY";;
            $(( ${#options[@]}+1 )) ) clear; echo "Goodbye!"; exit;;
            *) echo "Invalid option. Try another one.";continue;;
         esac
     done
     return
}

3

এটি করার একটি সহজ উপায় হ'ল xargs -pgnu বা সাথে parallel --interactive

আমি এর জন্য xargs এর আচরণটি আরও ভালভাবে পছন্দ করি কারণ এটি শেষ পর্যন্ত চালানোর জন্য হ্যাঁগুলি সংগ্রহ না করে অন্যান্য ইন্টারেক্টিভ ইউনিক্স কমান্ডের মতো প্রম্পটের সাথে সাথেই প্রতিটি কমান্ড কার্যকর করে। (আপনি যেগুলি চেয়েছিলেন সেগুলি পাওয়ার পরে আপনি Ctrl-C করতে পারেন))

যেমন,

echo *.xml | xargs -p -n 1 -J {} mv {} backup/

খারাপ না, তবে xargs --interactiveহ্যাঁ বা না-র মধ্যেই সীমাবদ্ধ। যতক্ষণ না আপনার যথেষ্ট পরিমাণে এটি প্রয়োজন তবে আমার মূল প্রশ্নটি তিনটি সম্ভাব্য ফলাফল সহ একটি উদাহরণ দিয়েছে। আমি সত্যিই পছন্দ করি যে এটি প্রবাহিত যদিও; পাইপযুক্ত হওয়ার ক্ষমতা থেকে অনেকগুলি সাধারণ পরিস্থিতি উপকৃত হবে।
মুর্দদিন এমরিস

আমি দেখি. আমার ধারণা ছিল "বাতিল" এর অর্থ হ'ল আরও সমস্ত কার্যকরকরণ বন্ধ করা, যা এটি সিটিআরএল-সি এর মাধ্যমে সমর্থন করে তবে আপনার যদি বাতিলকরণ (বা না) আরও জটিল কিছু করার দরকার হয় তবে এটি যথেষ্ট হবে না।
জোশুয়া গোল্ডবার্গ

3

ওয়ান লাইন কমান্ডের বন্ধু হিসাবে আমি নিম্নলিখিতটি ব্যবহার করেছি:

while [ -z $prompt ]; do read -p "Continue (y/n)?" choice;case "$choice" in y|Y ) prompt=true; break;; n|N ) exit 0;; esac; done; prompt=;

লংফর্ম লিখিত, এটি এর মতো কাজ করে:

while [ -z $prompt ];
  do read -p "Continue (y/n)?" choice;
  case "$choice" in
    y|Y ) prompt=true; break;;
    n|N ) exit 0;;
  esac;
done;
prompt=;

আপনি কি প্রম্পট ভেরিয়েবল ব্যবহার স্পষ্ট করতে পারেন? আমার কাছে দেখে মনে হচ্ছে এটি এক লাইনের পরে মুছে গেছে, তাই আপনি কিছু করার জন্য লাইনটি কীভাবে ব্যবহার করবেন?
মায়ার্ডিন এমরিস

যখন লুপ পরে প্রম্পট মুছে ফেলা হয়। কারণ আমি চাইছি প্রম্পট ভেরিয়েবলটি পরে শুরু করা হোক (যেহেতু আমি বিবৃতিটি প্রায়শই ব্যবহার করি)। শেল-স্ক্রিপ্টে এই লাইনটি কেবল তখনই এগিয়ে যাবে যখন y | ​​Y টাইপ করা হবে এবং এন | এন টাইপ করা থাকলে প্রস্থান করুন বা সমস্ত কিছুর জন্য ইনপুট চেয়ে জিজ্ঞাসা করুন।
সিসিডিক্ট

3

আমি এই জাতীয় caseদৃশ্যে কয়েকবার বিবৃতিটি ব্যবহার করেছি , কেস স্ট্যাটমেন্টটি ব্যবহার করা এটির পক্ষে উত্তম উপায়। একটি whileলুপ, যেটি ব্লককে একপুলেসেট করে case, যে বুলিয়ান শর্তটি ব্যবহার করে প্রোগ্রামটিকে আরও বেশি নিয়ন্ত্রণের জন্য প্রয়োগ করা যেতে পারে এবং আরও অনেক প্রয়োজনীয়তা পূরণ করতে পারে। সমস্ত শর্ত পূরণ করার পরে, একটি breakব্যবহার করা যেতে পারে যা প্রোগ্রামের মূল অংশে নিয়ন্ত্রণ ফিরে পাবে। এছাড়াও, অন্যান্য শর্ত পূরণ করতে অবশ্যই শর্তযুক্ত বিবৃতিগুলি নিয়ন্ত্রণ কাঠামোর সাথে যুক্ত করা যেতে পারে: caseবিবৃতি এবং সম্ভাব্য whileলুপ।

caseআপনার অনুরোধটি পূরণ করতে একটি বিবৃতি ব্যবহারের উদাহরণ

#! /bin/sh 

# For potential users of BSD, or other systems who do not
# have a bash binary located in /bin the script will be directed to
# a bourne-shell, e.g. /bin/sh

# NOTE: It would seem best for handling user entry errors or
# exceptions, to put the decision required by the input 
# of the prompt in a case statement (case control structure), 

echo Would you like us to perform the option: "(Y|N)"

read inPut

case $inPut in
    # echoing a command encapsulated by 
    # backticks (``) executes the command
    "Y") echo `Do something crazy`
    ;;
    # depending on the scenario, execute the other option
    # or leave as default
    "N") echo `execute another option`
    ;;
esac

exit

3

হ্যাঁ / না / বাতিল

ক্রিয়া

#!/usr/bin/env bash
@confirm() {
  local message="$*"
  local result=''

  echo -n "> $message (Yes/No/Cancel) " >&2

  while [ -z "$result" ] ; do
    read -s -n 1 choice
    case "$choice" in
      y|Y ) result='Y' ;;
      n|N ) result='N' ;;
      c|C ) result='C' ;;
    esac
  done

  echo $result
}

ব্যবহার

case $(@confirm 'Confirm?') in
  Y ) echo "Yes" ;;
  N ) echo "No" ;;
  C ) echo "Cancel" ;;
esac

পরিষ্কার ব্যবহারকারী ইনপুট দিয়ে নিশ্চিত করুন

ক্রিয়া

#!/usr/bin/env bash
@confirm() {
  local message="$*"
  local result=3

  echo -n "> $message (y/n) " >&2

  while [[ $result -gt 1 ]] ; do
    read -s -n 1 choice
    case "$choice" in
      y|Y ) result=0 ;;
      n|N ) result=1 ;;
    esac
  done

  return $result
}

ব্যবহার

if @confirm 'Confirm?' ; then
  echo "Yes"
else
  echo "No"
fi

2
yn() {
  if [[ 'y' == `read -s -n 1 -p "[y/n]: " Y; echo $Y` ]];
  then eval $1;
  else eval $2;
  fi }
yn 'echo yes' 'echo no'
yn 'echo absent no function works too!'

এটি জটিল এবং ভঙ্গুর বলে মনে হচ্ছে। ঠিক কীভাবেyn(){ read -s -n 1 -p '[y/n]'; test "$REPLY" = "y" ; } yn && echo success || echo failure
ট্রিপলি

2

অন্যের প্রতিক্রিয়া:

BASH4 এ আপনার কেস নির্দিষ্ট করার দরকার নেই কেবল একটি ছোট ছোট হাতের অক্ষর তৈরি করতে ',' ব্যবহার করুন। এছাড়াও আমি রিড ব্লকের ভিতরে কোড লাগানোর পক্ষে দৃ strongly়রূপে অপছন্দ করি, ফলাফলটি পেয়েছি এবং এটির সাথে রিড ব্লক আইএমওর বাইরে ডিল করি। আইএমও ছাড়ার জন্য একটি 'কিউ' অন্তর্ভুক্ত করুন। শেষ পর্যন্ত কেন 'হ্যাঁ' টাইপ করুন কেবল -n1 ব্যবহার করুন এবং y টিপুন।

উদাহরণ: ব্যবহারকারী y / n টিপতে এবং q টি সবেমাত্র ছাড়তে পারে।

ans=''
while true; do
    read -p "So is MikeQ the greatest or what (y/n/q) ?" -n1 ans
    case ${ans,,} in
        y|n|q) break;;
        *) echo "Answer y for yes / n for no  or q for quit.";;
    esac
done

echo -e "\nAnswer = $ans"

if [[ "${ans,,}" == "q" ]] ; then
        echo "OK Quitting, we will assume that he is"
        exit 0
fi

if [[ "${ans,,}" == "y" ]] ; then
        echo "MikeQ is the greatest!!"
else
        echo "No? MikeQ is not the greatest?"
fi

0

এই জাতীয় পরিস্থিতিতে বেশিরভাগ সময় ব্যবহারকারীকে "হ্যাঁ" প্রবেশ করা অবধি আপনার স্ক্রিপ্ট চালানো চালিয়ে যাওয়া প্রয়োজন এবং যখন ব্যবহারকারী "না" প্রবেশ করে তখনই থামতে হবে। নীচে স্নিপেট আপনাকে এটি অর্জনে সহায়তা করবে!

#!/bin/bash
input="yes"
while [ "$input" == "yes" ]
do
  echo "execute script functionality here..!!"
  echo "Do you want to continue (yes/no)?"
  read input
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.