আমি শেল স্ক্রিপ্টে ইনপুটটি বিরতি দিতে এবং ব্যবহারকারীকে পছন্দগুলির জন্য অনুরোধ করতে চাই।
মানক Yes
, No
বা Cancel
টাইপ প্রশ্ন।
আমি কীভাবে একটি সাধারণ ব্যাশ প্রম্পটে এটি সম্পাদন করব?
আমি শেল স্ক্রিপ্টে ইনপুটটি বিরতি দিতে এবং ব্যবহারকারীকে পছন্দগুলির জন্য অনুরোধ করতে চাই।
মানক Yes
, No
বা Cancel
টাইপ প্রশ্ন।
আমি কীভাবে একটি সাধারণ ব্যাশ প্রম্পটে এটি সম্পাদন করব?
উত্তর:
শেল প্রম্পটে ব্যবহারকারী ইনপুট পাওয়ার সহজ ও বহুল ব্যবহৃত পদ্ধতি হ'ল 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
স্পষ্টতই অন্যান্য যোগাযোগের স্ট্রিংগুলি এখানে অপরিকল্পিত থেকে যায় (ইনস্টল করুন, উত্তর) যা আরও সম্পূর্ণরূপে সম্পূর্ণ অনুবাদে সম্বোধন করা দরকার, তবে একটি আংশিক অনুবাদও অনেক ক্ষেত্রে সহায়ক হবে।
অবশেষে, দয়া করে এফ হাউরির দুর্দান্ত উত্তরটি দেখুন ।
exit
করতে break
ট্যাব বন্ধ যখন আমি নির্বাচিত 'না' থেকে রাখা।
break
মধ্যে select
যদি কোন লুপ?
উপর নির্ভর করে
এবং যদি আপনি চান
আপনি 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
দ্রষ্টব্য: এটির অধীনে পরীক্ষা করা হয়েছিলSH, সজোরে আঘাত, ksh, হানাহানি এবং , busybox!
একই, তবে এর জন্য 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
সাধারণ 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এবং অন্যদের।
stty
প্রদান করে -g
ব্যবহারের জন্য বিকল্প: old_stty=$(stty -g); stty raw -echo; …; stty "$old_stty"
। এটি সেটিংটি ঠিক যেমন পাওয়া গেছে ঠিক তেমন পুনরুদ্ধার করে যা এর মতো হতে পারে এবং নাও হতে পারে stty -sane
।
case
পসিক্স পাশাপাশি ব্যাশের জন্যও ব্যবহার করতে পারেন (ব্যাশ সাবস্ট্রিংয়ের পরিবর্তে ওয়াইল্ডকার্ড শর্তটি ব্যবহার করুন case $answer in; [Yy]* ) echo Yes ;;
:) তবে আমি পরিবর্তে শর্তসাপেক্ষ বিবৃতি ব্যবহার করতে পছন্দ করি, [ "$answer" != "${answer#[Yy]}" ]
আপনার পক্ষপাতিত্ব করে echo "$answer" | grep -iq ^y
। এটি আরও বহনযোগ্য (কিছু নন-জিএনইউ গ্রেপস -q
সঠিকভাবে প্রয়োগ করে না) এবং এতে সিস্টেম কল নেই। ${answer#[Yy]}
অপসারণের জন্য Y
বা y
শুরু থেকে প্যারামিটার সম্প্রসারণ ব্যবহার করে $answer
, যখন উপস্থিত থাকে তখন একটি বৈষম্য তৈরি করে। এটি কোনও পসিক্স শেল (ড্যাশ, কেএসএস, ব্যাশ, জেডএস, ব্যস্তবক্স, ইত্যাদি) এ কাজ করে।
echo "Please enter some input: "
read input_variable
echo "You entered: $input_variable"
আপনি বিল্ট ইন রিড কমান্ড ব্যবহার করতে পারেন ; -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 ~/
FILEPATH
এটি আপনার পছন্দসই নামটি বেছে নিয়েছে এবং কমান্ড প্রম্পটের উত্তর দিয়ে সেট করা হবে। সুতরাং আপনি যদি চালানো হয় vlc "$FILEPATH"
, উদাহরণস্বরূপ, vlc
ফাইলটি খুলতে হবে।
-e
দ্বিতীয় উদাহরণের সুবিধা কী (সহজ হ্যাঁ / না)?
-e -p
পরিবর্তে ব্যবহার করার কোনও কারণ -ep
?
-e
পতাকা / বিকল্প, আপনি (বাস্তবায়ন উপর নির্ভর করে) নাও করতে পারে "Y" টাইপ, এবং তারপর আপনার মন পরিবর্তন এবং একটি "এন" (অথবা যে বিষয়টি জন্য অন্য কিছু) সঙ্গে এটি প্রতিস্থাপন পাবে; কমান্ড ডকুমেন্ট করার সময় অপশনগুলি পৃথকভাবে তালিকাভুক্ত করা অন্যান্য কারণগুলির মধ্যে পঠনযোগ্যতা / স্পষ্টতার জন্য ভাল।
বাশ এই উদ্দেশ্যে নির্বাচন করেছেন ।
select result in Yes No Cancel
do
echo $result
done
exit
অভ্যন্তর যোগ করবেন :)
Ctrl-D
তবে অবশ্যই এটি ব্যবহার করে আসল
exit
সব একসাথে স্ক্রিপ্ট থেকে প্রস্থান করা হবে, break
শুধুমাত্র লুপ যেখানে আপনি থাকেন (যদি আপনি একটি উপর থেকে প্রস্থান করা হবে while
বা case
লুপ)
এখানে আমি একসাথে কিছু রেখেছি:
#!/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
আমি একজন শিক্ষানবিস, সুতরাং এটি একটি দান লবণের সাথে নিন তবে এটি কার্যকর বলে মনে হচ্ছে।
case $yn in
থেকে case ${yn:-$2} in
তারপর আপনি ডিফল্ট মান হিসাবে দ্বিতীয় যুক্তি ব্যবহার করতে পারেন, ওয়াই বা এন
case $yn
করতে case "${yn:-Y}"
ডিফল্ট হ্যাঁ আছে
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?"
...
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
নিম্নতম সংখ্যক লাইনের সাথে এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল:
read -p "<Your Friendly Message here> : y/n/cancel" CONDITION;
if [ "$CONDITION" == "y" ]; then
# do something here!
fi
if
শুধু একটি উদাহরণ: এটি এই পরিবর্তনশীল হ্যান্ডেল করতে কিভাবে আপনি আপ হয়।
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
এবং তারপরে আপনার প্রয়োজনীয় সমস্ত জিনিস
এই সমাধানটি একটি একক অক্ষর পড়ে এবং হ্যাঁ প্রতিক্রিয়াতে একটি ফাংশন কল করে।
read -p "Are you sure? (y/n) " -n 1
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
do_something
fi
echo
নিজের জন্য দেখার অপসারণ চেষ্টা করুন ।
একটি সুন্দর 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 লিনাক্সের সাথে ডায়ালগ প্যাকেজটি ডিফল্টরূপে ইনস্টল করা হয়। দেখতে:
read -e -p "Enter your choice: " choice
দ্য -e
বিকল্প ইনপুট নির্দেশক তীরচিহ্নগুলি ব্যবহার করে সম্পাদন করা ব্যবহারকারীর দেয়।
আপনি যদি ইনপুট হিসাবে কোনও পরামর্শ ব্যবহার করতে চান:
read -e -i "yes" -p "Enter your choice: " choice
-i
বিকল্প একটি পরামর্শমূলক ইনপুট প্রিন্ট করে।
-e
-i
SH (বোর্ন শেল) এ কাজ করে না, কিন্তু প্রশ্ন বিশেষভাবে বাঁধা ব্যাশ এসে গেছে ..
আপনি ডিফল্ট ব্যবহার করতে পারেন 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
পসিক্স শেলটিতে লোকাল-সচেতন "হ্যাঁ / কোনও পছন্দ নয়" পরিচালনা করা সম্ভব; 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 ""
yesexpr
এবং noexpr
শেল পরিবেশে সবচেয়ে ভাল যেটি করা যায় , তা বাশের নির্দিষ্ট রেজিএক্স ম্যাচে এটি ব্যবহার করা হয়if [[ "$yn" =~ $yesexpr ]]; then echo $"Answered yes"; else echo $"Answered no"; fi
এখানে একটি দীর্ঘ, কিন্তু পুনরায় ব্যবহারযোগ্য এবং মডুলার পদ্ধতির:
0
= হ্যাঁ এবং 1
= না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 *
উপরে, আমি সবেমাত্র এন্টার টিপলাম, সুতরাং কমান্ডটি দৌড়ে গেল।
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]?
এত পুরানো পোস্টে পোস্ট করার জন্য দুঃখিত। কয়েক সপ্তাহ আগে আমিও একই রকম সমস্যার মুখোমুখি হয়েছিলাম, আমার ক্ষেত্রে আমার এমন একটি সমাধানের প্রয়োজন ছিল যা একটি অনলাইন ইনস্টলার-স্ক্রিপ্টের মধ্যেও কাজ করেছিল, যেমন: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
যেমন আপনি যেমন করতেন তেমনিভাবে ইনপুট গ্রহণ করতে চান, এবং খারাপ ইনপুটটিতে লুপিংও পেতে পারেন (বাফারে কয়েকটি অক্ষরের কথা কল্পনা করুন; আপনার পদ্ধতিটি ব্যবহারকারীকে সর্বদা পছন্দ করতে বাধ্য করবে )।
আমি লক্ষ্য করেছি যে এমন সাধারণ ব্যবহারকারীর ইনপুটটির জন্য কোনও মাল্টি-লাইন ইকো মেনু দেখায় কোনও উত্তর পোস্ট করেনি তাই এখানে আমার এখানে যাওয়া:
#!/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
এই পদ্ধতিটি পোস্টে পোস্ট করা হয়েছিল এই আশায় যে কেউ এটি কার্যকর এবং সময় সাশ্রয় করতে পারে।
একাধিক পছন্দ সংস্করণ:
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
(স্ক্রিপ্ট ভিতরে)।
আমি আপনাকে ডায়লগ ব্যবহার করার পরামর্শ দিচ্ছি ...
লিনাক্স শিক্ষানবিস: ডায়ালগ ব্যবহার করে ব্যাশ শেল স্ক্রিপ্টগুলি উন্নত করুন
ডায়ালগ কমান্ড শেল স্ক্রিপ্টগুলিতে উইন্ডো বাক্সগুলির ব্যবহারকে আরও ইন্টারেক্টিভ করতে সক্ষম করে।
এটি সহজ এবং ব্যবহার করা সহজ, এছাড়াও জিডিয়ালগ নামে একটি জিনোম সংস্করণ রয়েছে যা সঠিক একই পরামিতি গ্রহণ করে তবে এটি X- এ জিইউআই স্টাইল দেখায়
@ মার্ক এবং @ মের্ডদিনের উত্তরে অনুপ্রাণিত হয়ে আমি সর্বজনীন প্রম্পটের জন্য এই ফাংশনটি তৈরি করেছি
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"
আরও জেনেরিক হবে:
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
}
এটি করার একটি সহজ উপায় হ'ল xargs -p
gnu বা সাথে parallel --interactive
।
আমি এর জন্য xargs এর আচরণটি আরও ভালভাবে পছন্দ করি কারণ এটি শেষ পর্যন্ত চালানোর জন্য হ্যাঁগুলি সংগ্রহ না করে অন্যান্য ইন্টারেক্টিভ ইউনিক্স কমান্ডের মতো প্রম্পটের সাথে সাথেই প্রতিটি কমান্ড কার্যকর করে। (আপনি যেগুলি চেয়েছিলেন সেগুলি পাওয়ার পরে আপনি Ctrl-C করতে পারেন))
যেমন,
echo *.xml | xargs -p -n 1 -J {} mv {} backup/
xargs --interactive
হ্যাঁ বা না-র মধ্যেই সীমাবদ্ধ। যতক্ষণ না আপনার যথেষ্ট পরিমাণে এটি প্রয়োজন তবে আমার মূল প্রশ্নটি তিনটি সম্ভাব্য ফলাফল সহ একটি উদাহরণ দিয়েছে। আমি সত্যিই পছন্দ করি যে এটি প্রবাহিত যদিও; পাইপযুক্ত হওয়ার ক্ষমতা থেকে অনেকগুলি সাধারণ পরিস্থিতি উপকৃত হবে।
ওয়ান লাইন কমান্ডের বন্ধু হিসাবে আমি নিম্নলিখিতটি ব্যবহার করেছি:
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=;
আমি এই জাতীয় 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
#!/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
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
অন্যের প্রতিক্রিয়া:
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
এই জাতীয় পরিস্থিতিতে বেশিরভাগ সময় ব্যবহারকারীকে "হ্যাঁ" প্রবেশ করা অবধি আপনার স্ক্রিপ্ট চালানো চালিয়ে যাওয়া প্রয়োজন এবং যখন ব্যবহারকারী "না" প্রবেশ করে তখনই থামতে হবে। নীচে স্নিপেট আপনাকে এটি অর্জনে সহায়তা করবে!
#!/bin/bash
input="yes"
while [ "$input" == "yes" ]
do
echo "execute script functionality here..!!"
echo "Do you want to continue (yes/no)?"
read input
done
[yn]
বিকল্প উপস্থাপন করেন তবে মূলধনটি হ'ল ডিফল্ট, অর্থাত্[Yn]
"হ্যাঁ" এর[yN]
ডিফল্ট এবং "না" তে ডিফল্ট। Ux.stackexchange.com/a/40445/43532