Kaip galiu prašyti „Yes / No / Cancel“ įvesties Linux scenarijuje?

Noriu sustabdyti įvestį scenarijų korpuse ir paraginti vartotoją pasirinkti. Standartinis klausimas yra „Taip, Ne arba Atšaukti“. Kaip tai padaryti tipiškoje bausmės eilutėje?

1179
22 окт. nustatė Myrddin Emrys spalio 22 d 2008-10-22 20:03 '08 at 8:03 pm 2008-10-22 20:03
@ 29 atsakymai

Paprasčiausias ir plačiausiai prieinamas vartotojo įvedimo į komandų eilutę metodas yra read komanda. Geriausias būdas iliustruoti jo naudojimą yra paprastas demonstravimas:

 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 

Kitas būdas, kurį nurodė Stephen Hoovig, yra „Bash select . Štai tas pats pavyzdys naudojant 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 jums nereikės dezinfekuoti įvesties - jame rodomos galimos parinktys ir įvedate numerį, atitinkantį jūsų pasirinkimą. Ji taip pat automatiškai užsklanda, taigi nereikia while true kad bandytumėte dar kartą, jei jie pateikia neteisingą įvestį.

Taip pat perskaitykite puikų atsakymą F. Hauri.

1342
22 окт. atsakymas, kurį pateikė Myrddin Emrys , spalio 22 d 2008-10-22 20:08 '08 8:08 val. 2008-10-22 20:08

Bent penki atsakymai į vieną bendrą klausimą.

Priklausomai nuo

  • : gali dirbti su blogomis sistemomis su
  • specifinis: vadinamųjų bazių naudojimas

ir jei norite

  • paprastas '' eilutėje '' klausimas / atsakymas (bendri sprendimai)
  • sąžiningai suformatuotos sąsajos, pvz., „ arba daugiau grafiškai naudojant libgtk arba libqt ...
  • naudoti galingą skaitymo skaitymo galimybę

1. Bendrieji POSIX sprendimai

Galite naudoti read komandą ir tada, 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 

(Ačiū Adamui Katzui : pirmiau minėtą testą pakeiskite vienu, kuris yra nešiojamas ir išvengia vienos šakės)

„Posix“, bet viena svarbi funkcija

Bet jei nenorite, kad vartotojas spustelėtų „ Grįžti“ , galite rašyti:

( Redaguota: kaip teisingai teigia @JonathanLeffler, taupymo konfigūracija gali būti geresnė, nei tiesiog juos normalizuoti.)

 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 

Pastaba Tai patvirtinta „ , „ , „ , „ ir „ !

Tas pats, bet akivaizdžiai tikisi, kad y arba 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 

Naudojant specialius įrankius

Yra daug įrankių, kurie buvo sukurti naudojant libncurses , libgtk , libqt ar kitas grafines bibliotekas. Pvz., Naudojant whiptail :

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

Priklausomai nuo jūsų sistemos, gali tekti pakeisti whiptail kitą panašų įrankį:

 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 

kur 20 yra dialogo >60 - dialogo >

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

2. Specialūs Bash sprendimai

Pagrindinis metodas

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

Aš norėčiau naudoti case kad galėčiau net patikrinti, ar yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui yes | ja | si | oui jei reikia ...

pagal vieną pagrindinę funkciją

Baziniame skyriuje galime nurodyti numatyto įvesties ilgį read komandai:

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

„Bash“ read komandoje yra laiko išjungimo parametras, kuris gali būti naudingas.

 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 

Kai kurie pasirinktų įrankių gudrybės

Sudėtingesni dialogo >yes - no tikslų:

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

Rodiklis:

 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 ) 

Maža demonstracija:

 #!/bin/sh while true ;do [ -x "$(which ${DIALOG%% *})" ] || DIALOG=dialog DIALOG=$($DIALOG --menu "Which tool for next run?" 20 60 12 2> \ 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> >/dev/tty) AnsPass=$($DIALOG --passwordbox "A secret:" 20 60 "First..." 2> >/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> >/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> >/dev/tty) out="Your answers:\nLike: $AnsYesNo\nInput: $AnsInput\nSecret: $AnsPass" $DIALOG --msgbox "$out\nAttribs: $AnsCkLst\nNote: $AnsRadio" 20 60 done 

Kitas pavyzdys? Žr., Kaip naudoti Whiptail, kad pasirinktumėte USB įrenginį ir USB išimamą saugojimo jungiklį: USBKeyChooser

5. Skaitymo istorijos naudojimas

Pavyzdys:

 #!/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 

Tai sukurs .myscript.history failą jūsų $HOME kataloge, nei galite naudoti skaitymo istorijos komandas, pvz., „ Up“ , „ Down“ , „ Ctrl + r“ ir kt.

404
10 янв. Atsakymą pateikė F. Hauri sausio 10 d 2015-01-10 13:53 '15, 13:53, 2015-01-10 13:53
 echo "Please enter some input: " read input_variable echo "You entered: $input_variable" 
338
22 окт. Atsakymas duotas Pistos spalio 22 d 2008-10-22 20:08 '08 8:08 val. 2008-10-22 20:08

Galite naudoti - skaityti ; Naudokite -p parinktį, jei norite padaryti vartotojo -p klausimą.

Pradedant nuo BASH4, dabar galite naudoti -i kad pasiūlytumėte atsakymą, todėl vartotojas turi tik paspausti return kad jį įvestų:

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

(Nepamirškite naudoti „readline“ parinkties -e leisti redaguoti eilutes su rodyklėmis)

Jei norite gauti „taip“ / „ne“ logiką, galite tai padaryti:

 read -e -p " List the content of your home dir ? [Y/n] " YN [[ $YN == "y" || $YN == "Y" || $YN == "" ]]  ls -la ~/ 
139
13 мая '11 в 7:44 2011-05-13 07:44 atsakymas pateikiamas yphil 13 d., 11 val

Šiam tikslui pasirinkite „ Bash“.

 select result in Yes No Cancel do echo $result done 
98
22 окт. Steven Huwig atsakymas, pateiktas spalio 22 d 2008-10-22 21:14 '08 9:14 val. 2008-10-22 21:14
 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 
53
03 февр. atsakymas pateikiamas serg 03 vasaris . 2011-02-03 16:23 '11 at 16:23 2011-02-03 16:23

Štai ką surinkiau:

 #!/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 

Aš esu naujokas, todėl paimk su druska, bet atrodo, kad jis veikia.

31
30 авг. atsakymas pateikiamas 30 d. 2012-08-30 20:59 '12, 08:59 pm 2012-08-30 20:59
 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?" ... 
27
22 окт. atsakymą pateikė SumoRunner 22 spalis 2008-10-22 20:08 '08 8:08 val. 2008-10-22 20:08

Norite:

  • Built-in bash komandos (pvz., Nešiojamosios)
  • TTY patikrinimas
  • Numatytasis atsakymas
  • Laikas
  • Spalvų klausimas

ištrauka

 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 

Paaiškinimai

  • [[ -t 0 ]] read... => Skambinti read komandą, jei TTY
  • read -n 1 => Palaukite vieną simbolį
  • $'\e[1;32m... \e[0m ' => Spausdinimas žalia
    (žalia yra gera, nes skaito tiek baltą, tiek juodą)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => bash regex

Timeout => Numatytasis atsakymas - Ne

 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 
24
18 дек. Atsakymas pateikiamas 18 dec. 2015-12-18 14:36 '15, 14:36 pm 2015-12-18 14:36

Lengviausias būdas tai pasiekti mažiausiai linijų:

 read -p "<Your Friendly Message here> : y/n/cancel" CONDITION; if [ "$CONDITION" == "y" ]; then # do something here! fi 

if yra tik pavyzdys: nusprendžiate, kaip elgtis su šiuo kintamuoju.

21
04 марта '16 в 0:22 2016-03-04 00:22 atsakymą pateikė „ Apurv Nerlekar “ kovo 4 d. 16 d. 0:22 2016-03-04 00:22

Naudokite read komandą:

09 мая '12 в 3:00 2012-05-09 03:00 atsakymas pateikiamas ThatLinuxGuy gegužės 09 d., 12 val. 3:00 2012-05-09 03:00

Šis sprendimas skaito vieną simbolį ir vadina atsakymo funkciją „taip“.

 read -p "Are you sure? (y/n) " -n 1 echo if [[ $REPLY =~ ^[Yy]$ ]]; then do_something fi 
16
15 нояб. Atsakymas pateikiamas Dennis 15 lapkričio. 2013-11-15 10:04 '13, 10:04 2013-11-15 10:04
 read -e -p "Enter your choice: " choice 

-e parinktis leidžia vartotojui redaguoti įrašą rodyklių klavišais.

Jei norite naudoti sakinį kaip įvestį:

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

-i spausdina įtaigusį įvestį.

12
19 апр. Atsakymas pateikiamas Jahid 19 d 2015-04-19 03:37 '15, 3:37, 2015-04-19 03:37

Apgailestaujame, kad parašėte šį senąjį įrašą. Prieš kelias savaites turėjau panašią problemą, mano atveju reikalingas sprendimas, kuris taip pat veikė internetiniame diegimo programoje, pavyzdžiui: curl -Ss https://raw.github.com/_____/installer.sh | bash curl -Ss https://raw.github.com/_____/installer.sh | bash

Naudojant read yesno < /dev/tty , man labai patinka:

 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 

Tikiuosi, kad tai padės kam nors.

9
21 мая '14 в 14:22 2014-05-21 14:22 atsakymas pateikiamas xyz gegužės 21 d., 14 val. 14:22 2014-05-21 14:22

Jei norite gauti gražų įvesties >dialogo komandą taip:

 #!/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 do something risky" # do something risky else echo "Let stay boring" fi 

Dialogo paketas yra įdiegtas pagal nutylėjimą, bent jau su „SUSE Linux“.

7
06 апр. Thorsten Staerk atsakymas 2014-04-06 14:40 '14, 14:40 2014-04-06 14:40

Tik vienas klavišas

Čia yra ilgesnis, tačiau daugkartinis ir modulinis metodas:

  • Grąžina 0 = taip ir 1 = ne
  • Jums nereikia įvesti reikiamo slaptažodžio - tik vieno simbolio
  • Jei norite priimti numatytąjį pasirinkimą, galite paspausti Enter .
  • Galima išjungti numatytąjį priverstinio pasirinkimo pasirinkimą.
  • Veikia tiek zsh tiek bash .

Numatytasis yra ne, kai paspausite enter

Atkreipkite dėmesį, kad N yra kapitalas. Čia įvedama numatytoji vertė:

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

Pagal nutylėjimą, paspauskite, kai paspausite enter

Atkreipkite dėmesį, kad Y kapitalizuotas:

 $ 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 

Čia 1 buvo grąžintas arba klaidingas. Atkreipkite dėmesį, kad su šia žemesnio lygio funkcija turite pateikti savo [y/n]? nedelsiant

Kodas

5
28 июня '18 в 11:39 2018-06-28 11:39 Atsakymą pateikė Tom Hale birželio 28 d., 18 val. 11:39

Įkvėptas „@ Mark“ ir „@Myrddin“ atsakymų, sukūriau šią funkciją visuotiniam raginimui.

 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 } 

naudoti jį taip:

 unipromtp "Select an option: (a)-Do one (x)->Do two (f)->Do three : " "axf" selection echo "$selection" 
4
08 янв. atsakymas duotas poxtron 08 sausis 2015-01-08 03:40 '15 at 3:40 2015-01-08 03:40

Galimybė su keliomis parinktimis:

 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 } 

Pavyzdys:

 $ 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 $ 

Jis nustatys REPLY į y (scenarijaus viduje).

4
28 дек. Atsakymą pateikė Ernest A, gruodžio 28 d. 2013-12-28 20:50 '13, 8:50 pm 2013-12-28 20:50

Siūlau naudoti dialogą ...

„Linux Apprentice“: „Bash Shell“ scenarijų tobulinimas naudojant „Dialog“

Dialogo komanda leidžia naudoti >

tai paprasta ir paprasta naudoti, taip pat yra „gnome“ versija, vadinama gdialog, kuri paima tuos pačius parametrus, tačiau rodo savo GUI stilių „X“.

3
22 окт. Osamos Al-Maadeed atsakymas, pateiktas spalio 22 d 2008-10-22 20:14 '08 at 8:14 pm 2008-10-22 20:14

Pastebėjau, kad niekas nesiuntė atsakymo, rodančio daugiapakopį aido meniu tokiam paprastam naudotojo įvedimui, todėl čia yra mano:

 #!/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 

Šis metodas buvo išsiųstas tikintis, kad kažkas jį suras ir sutaupys laiko.

3
08 дек. atsakymas duotas Yokai 08 Dec. 2016-12-08 10:42 '16 at 10:42 am 2016-12-08 10:42

bendresnis būtų:

 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
29 июля '15 в 14:39 2015-07-29 14:39 Atsakymą davė Aleksandras Löfqvist , liepos 29 d. 15, 14:39 2015-07-29 14:39

Vienas paprastas būdas tai padaryti yra xargs -p arba gnu parallel --interactive .

Man patinka xargs elgesys šiek tiek geriau, nes jis atlieka kiekvieną komandą iš karto po kvietimo, kaip ir kitos interaktyvios „unix“ komandos, o ne rinkti yesses paleisti pabaigoje. (Jūs galite Ctrl-C po to, kai einate per tuos, kurių jums reikia.)

Pavyzdžiui

 echo *.xml | xargs -p -n 1 -J {} mv {} backup/ 
3
08 апр. Joshua Goldberg atsakymas, pateiktas balandžio 8 d 2015-04-08 22:30 '15, 10:30 val. 2015-04-08 22:30

Šį scenarijų keletą kartų panaudojau case , o atvejo argumentas yra geras būdas tai padaryti. Tuo while , įgyvendinantis case bloką, kuris naudoja loginę sąlygą, gali būti įgyvendintas tolesniam programos valdymui ir daugeliui kitų reikalavimų. Kai bus įvykdytos visos sąlygos, galite naudoti break , kuri perduos valdymą atgal į pagrindinę programos dalį. Be to, norint patenkinti kitas sąlygas, žinoma, galima pridėti sąlygines ataskaitas kartu su kontrolės struktūromis: case ir galimas while .

case pavyzdžio naudojimo pavyzdys, kad įvykdytumėte užklausą.

 #! /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, eg /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 
2
08 нояб. Atsakymas pateikiamas oOpSgEo 08 Nov. 2016-11-08 12:38 '16 at 12:38 2016-11-08 12:38
 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!' 
2
23 сент. Atsakymas duodamas jlettvin 23 sep . 2013-09-23 23:59 '13, 23:59 pm 2013-09-23 23:59

Kaip vienos eilutės draugas naudoju:

 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=; 

Rašytinis ilgas paveikslas veikia taip:

 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=; 
2
04 июня '15 в 22:03 2015-06-04 22:03 atsakymas pateikiamas ccDict birželio 4 d., 15 val. 10:03 val. 2015-06-04 22:03

REPLY galite naudoti kaip numatytąjį read , konvertuoti į mažąsias ir palyginti su kintamųjų rinkiniu su išraiška.
Scenarijus taip pat palaiko ja / si / qui

 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 
0
12 дек. Atsakymą pateikė Walter A gruodžio 12 d. 2018-12-12 18:50 '18 18:50 2018-12-12 18:50

Atsakydami į kitus:

BASH4 atveju nereikia nurodyti atvejo, tiesiog naudokite „,“, kad padarytumėte mažomis raidėmis. Aš taip pat labai nenoriu įdėti kodą į skaitymo bloką, gauti rezultatą ir apdoroti jį už IMO skaitymo bloko. Taip pat įveskite „q“, kad išeitumėte iš TJO. Ir galiausiai, kodėl „taip“ tiesiog naudokite -n1 ir paspauskite y.

Pavyzdys: vartotojas gali paspausti y / n ir q taip pat tiesiog išeiti.

 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
20 мая '18 в 6:09 2018-05-20 06:09 Atsakymą pateikė Mike Q gegužės 20 d., 18 val. 6:09 ; 2018-05-20 06:09

Taip / Ne / Atšaukti

funkcija

 #!/usr/bin/env bash @confirm() { local message="$*" local result='' echo -n "> $message (Yes/No/Cancel) " > 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 } 

naudoti

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

Patikrinkite naudodami švarų vartotojo įvestį

funkcija

 #!/usr/bin/env bash @confirm() { local message="$*" local result=3 echo -n "> $message (y/n) " > 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 } 

naudoti

 if @confirm 'Confirm?' ; then echo "Yes" else echo "No" fi 
0
14 июля '17 в 23:13 2017-07-14 23:13 Atsakymą pateikė Eduardo Cuomo liepos 17 d. 17:13 23:13 23:13

Su php , tai yra galinga „shell“ scenarijai:

 #!/usr/bin/php <?php $yo = readline("Do you wish to install this program? [Y/y] or [ctrl+c to quit]"); if ($yo == "Y" || $yo == "y") { echo "Installing.."; system("sudo apt install ..."); } 

Tam reikia php-cli paketo.

-6
09 авг. Atsakymą pateikė Cryptopat 09 rugpjūtis. 2017-08-09 00:36 '17 ne 0:36 2017-08-09 00:36

Kiti klausimai apie „ žymes arba Ask a Question