Quiero poner un rápido "¿estás seguro?" para la confirmación en la parte superior de un script bash potencialmente peligroso, ¿cuál es la manera más fácil / mejor para hacer esto?
read -p "¿Está seguro? " -n 1 -r
echo # (opcional) pasar a una nueva línea
if [[ $REPLY =~ ^[Yy]$ ]]
entonces
# hacer cosas peligrosas
fi
He incorporado la sugerencia de levislevis85's (¡gracias!) y he añadido la opción -n
a read
para aceptar un carácter sin necesidad de pulsar Enter. Puedes usar uno o ambos.
Además, la forma negada puede tener este aspecto:
read -p "¿Está seguro? " -n 1 -r
echo # (opcional) pasar a una nueva línea
¡if [[ ! $REPLY =~ ^[Yy]$ ]]
entonces
[[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # maneja las salidas del shell o de la función pero no sale del shell interactivo
fi
Sin embargo, como señaló Erich, en algunas circunstancias, como un error de sintaxis causado por el script que se ejecuta en el shell equivocado, la forma negada podría permitir que el script continúe con las "cosas peligrosas". El modo de fallo debería favorecer el resultado más seguro, por lo que sólo debería utilizarse el primer if
no negado.
Explicación:
El comando read
da salida al prompt (-p "prompt"
) y luego acepta un carácter (-n 1
) y acepta barras invertidas literalmente (-r
) (de lo contrario read
vería la barra invertida como un escape y esperaría un segundo carácter). La variable por defecto para que read
almacene el resultado es $REPLY
si no se proporciona un nombre como este: read -p "mi prompt" -n 1 -r mi_var
La sentencia if
utiliza una expresión regular para comprobar si el carácter de $REPLY
coincide (=~
) con una mayúscula o minúscula "Y". La expresión regular utilizada aquí dice "una cadena que comienza (^
) y que consiste únicamente en uno de los caracteres de una lista de expresión de corchetes ([Yy]
) y que termina ($
)". Las anclas (^
y $
) impiden la comparación de cadenas más largas. En este caso, ayudan a reforzar el límite de un carácter establecido en el comando read
.
La forma negada utiliza el operador lógico "no" (!
) para coincidir (=~
) con cualquier carácter que no sea "Y" o "y". Una forma alternativa de expresar esto es menos legible y no expresa tan claramente la intención en mi opinión en este caso. Sin embargo, esto es lo que parecería: if [[ $REPLY =~ ^[^Yy]$ ]]