Comment Demander une confirmation à un utilisateur en script bash? [dupliquer]

cette question a déjà une réponse ici:

  • Comment demander Oui / Non / annuler une entrée dans un script shell Linux? 27 Réponses

je veux mettre un rapide "êtes-vous sûr?"demande de confirmation en haut d'un script de bash potentiellement dangereux, Quelle est la meilleure façon faire cela?

451
demandé sur Tom 2009-12-11 05:52:46

10 réponses

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
    # do dangerous stuff
fi

Modifier :

j'ai incorporé levislevis85 la suggestion (merci!) et a ajouté l'option -n à read pour accepter un caractère sans avoir à appuyer sur Enter . Vous pouvez utiliser l'un ou les deux de ces.

aussi, la forme niée pourrait ressembler à ceci:

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
    [[ ""151910920"" = "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
fi

dans des circonstances telles qu'une erreur de syntaxe causée par le fait que le script soit exécuté dans le mauvais shell, la forme annulée pourrait permettre au script de continuer à la "substance dangereuse". Le mode de défaillance devrait favoriser le résultat le plus sûr de sorte que seulement le premier, non-nié if devrait être utilisé.

737
répondu Dennis Williamson 2018-08-17 23:32:58

utiliser case / esac.

read -p "Continue (y/n)?" choice
case "$choice" in 
  y|Y ) echo "yes";;
  n|N ) echo "no";;
  * ) echo "invalid";;
esac

avantage:

  1. plus propre
  2. peut utiliser" ou "condition easier
  3. peut utiliser une plage de caractères, par exemple [yY][eE][sS] pour accepter le mot" oui", lorsque l'un de ses caractères peut être en minuscules ou en majuscules.
119
répondu ghostdog74 2015-05-13 07:24:58

de cette façon, vous obtenez 'y' oui' ou 'Enter '

 read -r -p "Are you sure? [Y/n]" response
 response=${response,,} # tolower
 if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
    your-action-here
 fi

si vous utilisez zsh essayez ceci:

read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
    your-action-here
fi
27
répondu SergioAraujo 2018-05-26 12:31:09

Essayez le read shell builtin:

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi
24
répondu Adam Hupp 2016-11-09 14:04:40

Voici la fonction que j'utilise:

function ask_yes_or_no() {
    read -p " ([y]es or [N]o): "
    case $(echo $REPLY | tr '[A-Z]' '[a-z]') in
        y|yes) echo "yes" ;;
        *)     echo "no" ;;
    esac
}

et un exemple l'utilisant:

if [[ "no" == $(ask_yes_or_no "Are you sure?") || \
      "no" == $(ask_yes_or_no "Are you *really* sure?") ]]
then
    echo "Skipped."
    exit 0
fi

# Do something really dangerous...
  • La sortie est toujours "oui" ou "non",
  • C'est "non" par défaut
  • Tout sauf "y" ou "oui" retourne "non", il est assez sûr pour un dangereux script bash
  • et c'est insensible à la casse," Y"," oui", ou" oui "fonctionne comme"Oui".

I j'espère que vous aimez,

Acclamations!

17
répondu Sébastien RoccaSerra 2013-07-17 09:03:56

C'est ce que j'ai trouvé ailleurs, y a-t-il une meilleure version possible?

read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
   exit
fi
12
répondu Tom 2009-12-11 02:59:43
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

est un court script à lire dans les résultats de bash et echo back.

4
répondu Philip Schlump 2009-12-11 02:59:06
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1

[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1

utilisé dans une fonction pour rechercher un fichier existant et de demander confirmation avant d'écraser.

4
répondu Bradley 2018-09-05 06:51:13

qnd: utilisation de

read VARNAME
echo $VARNAME

pour une réponse d'une ligne sans support en ligne. Ensuite, testez $ VARNAME comme vous voulez.

2
répondu zen 2009-12-11 02:55:53
echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi
2
répondu kingsindian 2009-12-11 02:57:04