Question Comment inviter un utilisateur à confirmer dans bash script? [dupliquer]


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

Je veux mettre un rapide "êtes-vous sûr?" invite à confirmer en haut d'un script bash potentiellement dangereux, quelle est la meilleure façon de le faire?


425
2017-12-11 02:52


origine


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é levislevis85la suggestion de (merci!) et a ajouté le -n option à read accepter un personnage sans avoir à appuyer sur Entrer. Vous pouvez utiliser l'un ou les deux.

En outre, la forme négative peut ressembler à ceci:

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

Cependant, comme Erich l'a fait remarquer, dans certaines circonstances, comme une erreur de syntaxe causée par l'exécution du script dans le mauvais shell, la forme annulée pourrait permettre au script de continuer vers les "choses dangereuses". Le mode de défaillance devrait favoriser le résultat le plus sûr, de sorte que seul le premier, non annulé if Devrait être utilisé.


692
2017-12-11 02:56



cas d'utilisation / 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 plus facile
  3. peut utiliser une plage de caractères, par exemple [yY] [eE] [sS] pour accepter le mot "yes", où l'un de ses caractères peut être en minuscule ou en majuscule.

115
2017-12-11 03:48



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

24
2018-05-12 14:53



Essaie le read shell intégré:

read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
  echo "yaaa";
else
  echo "booo";
fi

23
2017-12-11 02:58



Voici la fonction que j'utilise:

function ask_yes_or_no() {
    read -p "$1 ([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" renvoie "non", donc c'est assez sûr pour un script bash dangereux
  • Et il est insensible à la casse, "Y", "Oui" ou "OUI" fonctionnent comme "oui".

J'espère que tu aimes,
À votre santé!


17
2017-07-17 09:03



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

11
2017-12-11 02:59



[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1

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

utilisé dans une fonction pour rechercher un fichier existant et une invite avant de remplacer.


4
2018-02-06 04:21



#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
 # do something
fi

Je suis un script court à lire dans bash et à renvoyer les résultats.


3
2017-12-11 02:59



qnd: utiliser

read VARNAME
echo $VARNAME

pour une réponse à une ligne sans prise en charge de readline. Ensuite, testez $ VARNAME comme vous le souhaitez.


2
2017-12-11 02:55



echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi

2
2017-12-11 02:57