Linux skriptində Yes / No / Cancel girişini necə tələb edə bilərəm?

Komanda kabuğundakı girdiyi dayandırmaq və istifadəçiyə seçim üçün müraciət etmək istəyirəm. Standart sual "Bəli, yox, ya da İptal et". Bunu tipik bir bash istəməsində necə etmək olar?

1179
22 окт. 22 oktyabrda Myrddin Emrys tərəfindən təyin olundu 2008-10-22 20:03 '08 saat 20:03 'da 2008-10-22 20:03
@ 29 cavab

Komanda xəttində istifadəçi girişinin alınması üçün ən sadə və ən geniş üsulu read əmridir. İstifadəsini göstərmək üçün ən yaxşı üsul sadə nümayişdir:

 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 

Stephen Hooviq tərəfindən göstərilən digər üsul Bash select . select istifadə edərək, eyni nümunə:

 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 

Seçdiyinizdə, girişin təmizlənməsinə ehtiyac yoxdur - mövcud variantları göstərir və seçdiyiniz nömrəni daxil edirsiniz. Avtomatik olaraq da loops, belə ki, bir while true yalnış giriş verdikdə yenidən while true ehtiyac yoxdur.

Həmçinin, əla cavab F. Hauri oxuyun.

1342
22 окт. 22 oktyabrda Myrddin Emrys tərəfindən verilmiş cavab 2008-10-22 20:08 '08 at 8:08 pm 2008-10-22 20:08

Ümumi suallara ən azı beş cavab.

Asılı olaraq

  • : paylaşılan ilə pis sistemlərdə işləyə bilər
  • specific: sözdə əsasları istifadə

və istəsəniz

  • sadə '' line '' sual / cavab (ümumi həllər)
  • belə və ya daha libgtk və ya libqt istifadə qrafik kimi daha ədalətli biçimlendirilmiş interfeys ...
  • güclü oxu oxu qabiliyyətini istifadə edin

1. Ümumi POSIX Solutions

read əmrini istifadə edə bilərsiniz 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 

( Adam Katz sayəsində: Yuxarıdakı testi daha portativ və bir çəngəldən uzaqlaşdırın.

Posix lakin bir əsas xüsusiyyət

Istədiyiniz istifadəçi qayıtmaq istəmirsinizsə, yaza bilərsiniz:

( Edilən: @JonathanLeffler doğru olaraq təklif edir ki, stty konfiqurasiyasını qənaət etmək yalnız onları normal etməkdən daha yaxşı ola bilər.)

 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 

Qeyd Bu, , , , !

Eyni, lakin y və ya n üçün gözlədiyiniz açıq-aydı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 

Xüsusi vasitələrdən istifadə

libncurses , libgtk , libqt və ya digər qrafik kitabxanalardan istifadə edərək yaradılmış bir çox vasitə var. Misal üçün, whiptail istifadə etmək:

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

Sisteminizdən asılı olaraq, whiptail başqa bir vasitə whiptail əvəz etmək lazımdır:

border=0
 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 

burada 20 , xətlərin sayında informasiya qutusunun hündürlüyü və 60 informasiya qutusunun eni. Bütün bu alətlər eyni sözdizimə malikdir.

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

2. Xüsusi Bash Solutions

Əsas metod

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

Mən də yes | ja | si | oui üçün yoxlaya biləcəyim case istifadə etməyi üstün edirəm 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 zəruri hallarda yes | ja | si | oui ...

bir əsas funksiyaya görə

Baş hissəsində, read əmri üçün nəzərdə tutulan giriş uzunluğunu müəyyən edə bilərik:

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

Başda, read əmri faydalı ola biləcək bir zaman aşımı parametresini alır.

 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 

Seçilmiş alətlər üçün bəzi tövsiyələr

Daha mürəkkəb informasiya qutuları, sadə yes - no yanaşı yes - no məqsəd:

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

Göstərici:

 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 ) 

Kiçik demo:

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

Digər bir nümunə? USB cihazıUSB çıxarıla bilən saxlama anbarını seçmək üçün whiptail istifadə etmək üçün baxın : USBKeyChooser

5. Oxu tarixindən istifadə

Məsələn:

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

Bu, yuxarı , aşağı , Ctrl + r və başqaları kimi oxuduğu tarixi əmrlərindən istifadə edə bildiyiniz üçün $HOME qovluğunuzdakı bir .myscript.history faylını yaradır.

404
10 янв. Cavab F. Hauri Jan 10 tərəfindən verilir 2015-01-10 13:53 '15 at 13:53 2015-01-10 13:53
 echo "Please enter some input: " read input_variable echo "You entered: $input_variable" 
338
22 окт. Cavab 22 oktyabr Pistos verilir . 2008-10-22 20:08 '08 at 8:08 pm 2008-10-22 20:08

Siz oxuya bilərsiniz ; Istifadəçi sualını etmək üçün -p seçimini istifadə edin.

BASH4-dən başlayaraq, indi cavab təklif etmək üçün -i istifadə edə bilərsiniz, belə ki, istifadəçi yalnız onu yazmaq üçün mətbuatın return tələb edir:

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

(Lakin "okunur" seçeneğini istifadə etməyi unutmayın - oxlarla redaktə xətlərinə icazə verin)

Bəli / heç bir mantığa ehtiyacınız olmasa, belə bir şey edə bilərsiniz:

 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 cavab 13 may 2011-ci il tarixində saat 11: 00-da verilmişdir. 2011-05-13 07:44

Bash bu məqsəd üçün seçin .

 select result in Yes No Cancel do echo $result done 
98
22 окт. Steven Huwig tərəfindən 22 oktyabrda verilən cavab 2008-10-22 21:14 '08 at 9:14 pm 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 февр. cavab 03 mart fergidir . 2011-02-03 16:23 '11 'da 16:23' da 2011-02-03 16:23

Mən yığdım:

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

Mən bir yeniyəm, buna görə duz ilə götür, amma işə yaramır.

31
30 авг. cavab mpen 30 aug verilir . 2012-08-30 20:59 '12 at 8: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 окт. SumoRunner tərəfindən 22 oktyabr cevap verildi 2008-10-22 20:08 '08 at 8:08 pm 2008-10-22 20:08

İstəsəniz:

  • Daxili bash əmrləri (məsələn, portativ)
  • TTY yoxlayın
  • Default cavab
  • Vaxt keçdi
  • Rəng sual

çıxarış

 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 

Şərhlər

  • [[ -t 0 ]] read... => TTY əgər read komutunu axtarın
  • read -n 1 => bir simvol gözləyin
  • $'\e[1;32m... \e[0m ' => Yaşılda Yazdırma
    (yaşıl yaxşıdır, çünki ağda və qara üzərində oxuyur)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => bash regex

Timeout => Default cavab - Xeyr

 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 дек. Cavab 18 martda verilir . 2015-12-18 14:36 '15 də 2:36 pm 2015-12-18 14:36

Bunu ən azı xətlərlə əldə etmək üçün ən asan yol:

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

yalnız bir nümunə varsa: bu dəyişənlə necə idarə olunacağınıza qərar verin.

21
04 марта '16 в 0:22 2016-03-04 00:22 Cavab Apurv Nerlekar tərəfindən 04 Mart '06 'da 0:22 2016-03-04 00:22' də verilir

read əmrini istifadə edin:

09 мая '12 в 3:00 2012-05-09 03:00 cavab TheLinuxGuy May 09 '12 saat 3:00 'də verilir 2012-05-09 03:00

Bu həll bir xarakter oxuyur və cavab funksiyasını yes deyir.

 read -p "Are you sure? (y/n) " -n 1 echo if [[ $REPLY =~ ^[Yy]$ ]]; then do_something fi 
16
15 нояб. Cavab Dennis 15 noyabr tarixində verilir. 2013-11-15 10:04 '13 at 10:04 2013-11-15 10:04
 read -e -p "Enter your choice: " choice 

-e seçimi istifadəçiyə girişləri ok tuşları ilə düzəltməyə imkan verir.

Cümləni giriş kimi istifadə etmək istəyirsinizsə:

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

-i təfərrüatlı girişləri yazır.

12
19 апр. Cavab 19 aprel Jahid verilir 2015-04-19 03:37 '15 'də 3:37' de 2015-04-19 03:37

Bu köhnə yazıya göndərdiyiniz üçün üzr istəyirik. Bir neçə həftə əvvəl oxşar bir problemim var idi, mənim vəziyyətimdə də bir onlayn yükləyicidə işləyən bir həll lazım idi, məsələn: curl -Ss https://raw.github.com/_____/installer.sh | bash curl -Ss https://raw.github.com/_____/installer.sh | bash

read yesno < /dev/tty istifadə mənim üçün böyükdür:

 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 

Bu birinə kömək edir.

9
21 мая '14 в 14:22 2014-05-21 14:22 cavab xyz 21 may, 14 saat 14:22 2014-05-21 14:22 verilir

Ncurses ilə gözəl bir giriş pəncərəsi almaq üçün, informasiya komutunu aşağıdakı kimi istifadə edin:

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

Dialoq paketi SUSE Linux ilə ən azı default olaraq quraşdırılıb.

7
06 апр. Thorsten Staerk tərəfindən verilmiş cavab 06 Apr. 2014-04-06 14:40 '14 'da 14:40 2014-04-06 14:40

Yalnız bir tuş vuruşu

Burada uzun, lakin təkrar və modul yanaşma var:

  • 0 = yes və 1 = no qaytarır
  • Lazımi parol daxil etməyinizə ehtiyac yoxdur - yalnız bir xarakter
  • Standart seçimi qəbul etmək üçün enter düyməsini basa bilərsiniz.
  • Məcburi seçilmək üçün u mənim seçimi aradan buraxa bilər.
  • Hər iki zshbash .

Girişə basdığınız zaman heç bir default yoxdur

N paytaxtı olduğuna diqqət edin. Bu, u mənim dəyərin girildiyi yerdir:

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

Mənim cari olaraq, bəli, basdığınız zaman girin

Yin kapitallaşdırıldığını unutmayı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 

Burada 1 qaytarıldı və ya yalan. Xahiş edirik, bu aşağı səviyyəli funksiyanı özünüz [y/n]? ilə təmin [y/n]? dərhal

Kod

5
28 июня '18 в 11:39 2018-06-28 11:39 Cavab Tom Hale tərəfindən 28 İyun tarixində saat 11:39 'də 2018-06-28 11:39' də verilir

@Mark və @Myrddin cavablarından ilhamlanaraq, bu funksiyanı universal çağırış üçün yaratdım.

 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 } 

istifadə edin:

 unipromtp "Select an option: (a)-Do one (x)->Do two (f)->Do three : " "axf" selection echo "$selection" 
4
08 янв. Cavab verilən poxtron Jan 08 2015-01-08 03:40 '15 'də 3:40' de 2015-01-08 03:40

Bir neçə variant ilə Seçim:

 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 } 

Məsələn:

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

Bu, y REPLY verəcəkdir (script daxilində).

4
28 дек. Cavab Ernest A tərəfindən verilir 28 dekabr. 2013-12-28 20:50 '13 saat 20:50 'da 2013-12-28 20:50

Mən dialoqdan istifadə etməyi təklif edirəm ...

Linux Çırak: Dialog istifadə edərək Bash Shell skriptlərini təkmilləşdirmək

Dialoq komandası istifadə etmək üçün daha çox interaktiv istifadə etmək üçün kabuk skriptlərindən istifadə etməyə imkan verir.

sadə və istifadə üçün asandır, gdome adlı bir versiyası da var, gdialog, eyni parametrləri alır, lakin GUI stilini X-də göstərir.

3
22 окт. Osama Əl-Maadeed tərəfindən 22 oktyabrda cavab verildi 2008-10-22 20:14 '08 saat 20:14 'da 2008-10-22 20:14

Mən belə bir sadə istifadəçi giriş üçün bir çox satırlı eko menyusunu göstərən bir cavab göndərdiyini fərq etdim.

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

Bu üsul birinin faydalı olduğunu və vaxtdan qənaət edəcəyi ümidində göndərildi.

3
08 дек. cavab verildi Yokai 08 dekabr. 2016-12-08 10:42 '16 saat 10:42 'da 2016-12-08 10:42

daha ümumi olardı:

 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 Cavab İyulun 29-da İskəndər Löfqvist tərəfindən verilib 14:39, 2015-07-29 14:39

Bunun bir asan yolu - xargs -p və ya gnu parallel --interactive .

Bunun xargs davranışını bir az daha yaxşı sevirəm. Çünki hər bir əmri, digər interaktiv unix əmrləri kimi, dəvətdən dərhal sonra yerinə yetirmək üçün yığırıq. (Sizə lazım olanları keçdikdən sonra Ctrl-C düyməsinə bilərsən.)

məsələn

 echo *.xml | xargs -p -n 1 -J {} mv {} backup/ 
3
08 апр. Apr 08-də Joshua Goldberg tərəfindən verilmiş cavab 2015-04-08 22:30 '15, saat 10:30 'da, 2015-04-08 22:30

Bu ssenaridə case neçə dəfə istifadə edildiyini, iddianın argümanını istifadə etmək bunun yaxşı bir yoludur. Mantıksal vəziyyətdən istifadə edən bir case blokunu həyata keçirən bir while proqramı daha da nəzarət etmək və bir çox başqa tələbləri yerinə yetirmək üçün tətbiq oluna bilər. Bütün şərtlər yerinə yetirildikdən sonra, proqramın əsas hissəsinə geri qaytarılacaq olan break istifadə edə bilərsiniz. Əlavə olaraq, digər şərtləri yerinə yetirmək üçün əlbəttə ki, nəzarət strukturları müşayiət etmək üçün şərti bəyanatlar əlavə edilə bilər: case və mümkün bir while .

Sorğunuzu yerinə yetirmək üçün bir case nümunəsi

 #! /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 нояб. Cavab oOpSgEo 08 noyabrda verilir. 2016-11-08 12:38 '16 'da saat 12:38' də 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 сент. Cavab verilir jlettvin 23 sep . 2013-09-23 23:59 '13 at 11:59 pm 2013-09-23 23:59

Bir xəttin bir dostu olaraq mən aşağıdakıları istifadə etdim:

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

Yazılan uzun rəqəm belədir:

 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 ccDict cavab 04 iyun '15, saat 10:03 'da verilir. 2015-06-04 22:03

REPLY read , kiçik işə çevirmək və ifadə ilə bir sıra dəyişənlərlə müqayisə etmək üçün REPLY istifadə edə bilərsiniz.
Script həmçinin ja / si / qui ni dəstəkləyir

 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 дек. Cavab 12 dekabrda Walter A tərəfindən verilir. 2018-12-12 18:50 '18 də 18:50 2018-12-12 18:50

Başqalarına cavab olaraq:

BASH4-də bir vəziyyət göstərməyinizə ehtiyac yoxdur, yalnız "," istifadə etmək üçün "aşağı" vəziyyətdədir. Mən də oxumaq blokunun içərisində kodun qoyulması, nəticəni əldə etməsi və IMO oxu blokunun kənarında işləməməsindən şiddətlənmirəm. Ayrıca IMO'dan çıxmaq üçün "q" daxil edin. Və nəhayət, "bəli" niyə yalnız n1-ni istifadə edin və y basın.

Məsələn: bir istifadəçi y / n düyməsini basaraq q qətiyyən çıxa bilər.

 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 Cavab Mike Q tərəfindən 20 may 1818 tarixində 6:09 2018-05-20 06:09

Bəli / Xeyr / Ləğv et

funksiyası

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

istifadə

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

Təmiz istifadəçi girişlə təsdiqləyin

funksiyası

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

istifadə

 if @confirm 'Confirm?' ; then echo "Yes" else echo "No" fi 
0
14 июля '17 в 23:13 2017-07-14 23:13 Cavab Eduardo Cuomo tərəfindən 14 İyul '17 'də 23:13 2017-07-14 23:13' də verildi

Php ilə , bu shell scripts üçün güclü:

 #!/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 ..."); } 

Bu, php-cli paketini tələb edir.

-6
09 авг. Cavab Cryptopat 09 Aug tərəfindən verilir . 2017-08-09 00:36 '17 'də 0:36' da 2017-08-09 00:36

tags haqqında suallar və ya bir sual