863 votes

Comment puis-je inviter un utilisateur à des fins de confirmation dans le script bash?

Je veux mettre un rapide "êtes-vous sûr?" demande de confirmation au sommet d'une potentiellement dangereux script bash, ce qui est la méthode la plus simple/la meilleure façon de le faire?

1429voto

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

Edit:

J'ai incorporé levislevis85la suggestion (merci!) et a ajouté que l' -n option d' read d'accepter un caractère sans avoir besoin d'appuyer sur Entrer. Vous pouvez utiliser l'un ou les deux de ces.

Aussi, la annulés forme pourrait ressembler à ceci:

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

Cependant, comme souligné par Erich, dans certaines circonstances, comme une erreur de syntaxe causés par le script en cours d'exécution dans le mauvais shell, la annulés forme pourrait permettre la poursuite du script pour les "trucs dangereux". Le mode de défaillance doit favoriser le plus sûr des résultats ainsi seul le premier, non annulés if doit être utilisé.

254voto

ghostdog74 Points 86060

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) neater,
2) can use "OR" condition easier
3) can use character range, eg [yY][Es][Ss]

73voto

Adam Hupp Points 789

Essayez l' read shell builtin:

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

61voto

user2571881 Points 1787

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| ) ]]
    your-action-here
 fi

36voto

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 de son utilisation:

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 il est insensible à la casse, "Y", "Oui" ou "OUI" travailler en tant que "oui".

J'espère que vous l'aimez,
Cheers!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X