tutorial - ¿Cómo le pido a un usuario que confirme en el script bash?
bash scripting tutorial español (10)
Aquí está la función que utilizo:
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
}
Y un ejemplo usándolo:
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 salida es siempre "sí" o "no"
- Es "no" por defecto
- Todo excepto "y" o "yes" devuelve "no", por lo que es bastante seguro para un script de bash peligroso
- Y es insensible a mayúsculas, "Y", "Sí" o "SÍ" funcionan como "sí".
Espero que te guste,
¡Aclamaciones!
Esta pregunta ya tiene una respuesta aquí:
Quiero poner un rápido "¿estás seguro?" solicitar confirmación en la parte superior de un script de bash potencialmente peligroso, ¿cuál es la forma más fácil / mejor de hacer esto?
De esta manera obtienes ''y'' ''sí'' o ''Entrar''
read -r -p "Are you sure? [Y/n]" response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
Si está utilizando zsh intente esto:
read "response?Are you sure ? [Y/n] "
response=${response:l} #tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
Esto lo encontré en otra parte, ¿hay una mejor versión posible?
read -p "Are you sure you wish to continue?"
if [ "$REPLY" != "yes" ]; then
exit
fi
Prueba el shell incorporado de read
:
read -p "Continue (y/n)?" CONT
if [ "$CONT" = "y" ]; then
echo "yaaa";
else
echo "booo";
fi
caso de uso / esac.
read -p "Continue (y/n)?" choice
case "$choice" in
y|Y ) echo "yes";;
n|N ) echo "no";;
* ) echo "invalid";;
esac
ventaja:
- más limpio
- puede usar la condición "O" más fácil
- puede usar el rango de caracteres, por ejemplo, [yY] [eE] [sS] para aceptar la palabra "sí", donde cualquiera de sus caracteres puede estar en minúsculas o en mayúsculas.
qnd: usar
read VARNAME
echo $VARNAME
para una respuesta de una línea sin soporte de readline. Entonces prueba $ VARNAME como quieras.
#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"
if [ "x$NAME" = "xyes" ] ; then
# do something
fi
Soy un script corto para leer en bash y devolver los resultados.
[[ -f ./${sname} ]] && read -p "File exists. Are you sure? " -n 1
[[ ! $REPLY =~ ^[Yy]$ ]] && exit 1
usé esto en una función para buscar un archivo existente y un aviso antes de sobrescribir.
echo are you sure?
read x
if [ "$x" = "yes" ]
then
# do the dangerous stuff
fi
read -p "Are you sure? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
# do dangerous stuff
fi
Editar :
Incorporé la sugerencia de levislevis85 (¡gracias!) Y agregué la opción -n
para read
y aceptar un carácter sin la necesidad de presionar Intro . Puedes usar uno o ambos.
Además, la forma negada podría verse así:
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
Sin embargo, como lo señaló Erich, en algunas circunstancias, como un error de sintaxis causado por la ejecución del script en el shell incorrecto, la forma negada podría permitir que el script continúe con las "cosas peligrosas". El modo de falla debe favorecer el resultado más seguro, de modo que solo se debe usar el primero, no negado, if
se usa.