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?
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é.
utiliser case / esac.
read -p "Continue (y/n)?" choice
case "$choice" in
y|Y ) echo "yes";;
n|N ) echo "no";;
* ) echo "invalid";;
esac
avantage:
- plus propre
- peut utiliser" ou "condition easier
- 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.
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
Essayez le read
shell builtin:
read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
echo "yaaa";
else
echo "booo";
fi
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!
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
#!/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.
[[ -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.
qnd: utilisation de
read VARNAME
echo $VARNAME
pour une réponse d'une ligne sans support en ligne. Ensuite, testez $ VARNAME comme vous voulez.
echo are you sure?
read x
if [ "$x" = "yes" ]
then
# do the dangerous stuff
fi