Question Comment puis-je demander une entrée Oui / Non / Annuler dans un script shell Linux?


Je souhaite suspendre l'entrée dans un script shell et inviter l'utilisateur à faire des choix. La question de type "Oui, Non, ou Annuler". Comment puis-je accomplir cela dans une invite bash typique?


1100
2017-10-22 17:03


origine


Réponses:


La méthode la plus simple et la plus largement disponible pour obtenir l'entrée de l'utilisateur à l'invite du shell est la suivante: read commander. La meilleure façon d'illustrer son utilisation est une démonstration simple:

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

Une autre méthode, soulignée par Steven Huwig, est Bash select commander. Voici le même exemple en utilisant 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

Avec select vous n'avez pas besoin de désinfecter l'entrée - elle affiche les choix disponibles et vous tapez un nombre correspondant à votre choix. Il boucle également automatiquement, donc il n'y a pas besoin d'un while true boucle pour réessayer si elles donnent une entrée non valide.

En outre, s'il vous plaît vérifier la excellente réponse par F. Hauri.


1269
2017-10-22 17:08



Au moins cinq réponses pour une question générique.

Cela dépend de

  •  conforme: pourrait fonctionner sur des systèmes pauvres avec générique  environnements
  •  spécifique: en utilisant ce qu'on appelle les bashismes

et si tu veux

  • simple question / réponse «en ligne» (solutions génériques)
  • jolies interfaces formatées, comme  ou plus graphique en utilisant libgtk ou libqt ...
  • utiliser une puissante capacité d'historique de readline

1. Solutions génériques POSIX

Vous pouvez utiliser le read commande, suivie par if ... then ... else:

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

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


374
2018-01-10 10:53



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

333
2017-10-22 17:08



Vous pouvez utiliser le built-in lis commande Utilisez le -p option pour inviter l'utilisateur avec une question.

Depuis BASH4, vous pouvez maintenant utiliser -i pour suggérer une réponse, l'utilisateur n'a qu'à appuyer sur return pour l'entrer:

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

(Mais n'oubliez pas d'utiliser l'option "readline" -e pour permettre l'édition de ligne avec les touches fléchées)

Si vous voulez une logique "oui / non", vous pouvez faire quelque chose comme ceci:

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

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

117
2018-05-13 04:44



Bash a sélectionner dans ce but.

select result in Yes No Cancel
do
    echo $result
done

95
2017-10-22 18: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

51
2018-02-03 13:23



Voici quelque chose que je mets ensemble:

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

Je suis un débutant, alors prends ça avec un grain de sel, mais ça a l'air de marcher.


27
2017-08-30 17:59



Tu veux:

  • Commandes intégrées Bash (c'est-à-dire portables)
  • Vérifier l'ATS
  • Réponse par défaut
  • Temps libre
  • Question colorée

Fragment

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

Explications

  • [[ -t 0 ]] && read ... => Commande d'appel read si ATS
  • read -n 1 => Attendre un caractère
  • $'\e[1;32m ... \e[0m ' => Imprimer en vert
    (vert est bien parce que lisible sur les deux milieux blanc / noir)
  • [[ $do_xxxx =~ ^(y|Y|)$ ]] => bash regex

Timeout => La réponse par défaut est No

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

22
2017-12-18 11:36



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?"

...

21
2017-10-22 17:08



La manière la plus simple d'obtenir ceci avec le moins de lignes est la suivante:

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

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

le if est juste un exemple: c'est à vous de gérer cette variable.


19
2018-03-03 21:22



Cette solution lit un seul caractère et appelle une fonction sur une réponse oui.

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

15
2017-11-15 07:04