Salir del bucle bash directamente
Tengo el siguiente script:
#!/bin/bash
cat << 'EOF1' > textfile.txt
text1
text2
text3
text4
text5
text6
text7
text8
text9
text10
text11
EOF1
function SetNumber () {
while true; do
cat textfile.txt
echo -e '\n\nSelecciona una opción'
echo -e '\nSelecciona una opción o presiona Enter para salir'
read -p $'\nSelección: ' NUMB
echo
case "$NUMB" in
"") if [ -z "$NUMB" ] ; then : ; fi ; break ;;
*) if [[ $NUMB == text[1-11] ]] ; then CheckNumber
elif [[ $NUMB =~ ^[0-9]+$ ]] && [ ${#NUMB} -ge 1 ] && [ ${#NUMB} -le 2 ] && ((NUMB >= 1 && NUMB <= 11)) ; then CheckNumber
else echo -e 'Esta no es una opción válida.\n' ; fi ; SetNumber ; break ;;
esac
done
}
function CheckNumber () {
if [[ $NUMB =~ ^[0-9]+$ ]] ; then NUMB=text$NUMB ; fi
varinteth=$(awk '/^'${NUMB}'$/{print $0}' textfile.txt)
if [ -z "$varinteth" ]
then echo -e '\n Debes seleccionar una de las opciones disponibles.\n' ; SetNumber
else awk '!/^'${NUMB}'$/ ' textfile.txt > temp && mv temp textfile.txt ; fi
}
SetNumber
Si presiono 1, se ejecutan los pasos y se elimina text1 de textfile.txt.
Si presiono accidentalmente 1 nuevamente, me muestra el mensaje para seleccionar una de las opciones disponibles y vuelve a la función SetNumber, como debería ser, pero si luego presiono enter para salir, me muestra el mensaje “Selecciona una opción” nuevamente y tengo que presionar enter nuevamente para salir.
Entiendo que esto sucede tantas veces como veces presione accidentalmente una opción nuevamente.
¿Qué debo hacer para salir directamente cuando presione enter después de un error?
PD: No sé si mi título es el correcto, pero no sé exactamente qué título debería poner. Si tienes una mejor idea, dime para poder cambiarlo.
davy.ai
Para salir directamente al presionar enter después de un error, necesitamos modificar la función
SetNumber
. Actualmente, se sale del bucle solo cuando el usuario no ingresa ninguna entrada. Podemos agregar una condición adicional para salir del bucle cuando la entrada sea inválida y el usuario intente salir presionando enter.Aquí está la función
SetNumber
modificada:Agregamos una nueva variable
invalid_input
, que se establece inicialmente en 0. Si el usuario ingresa una entrada inválida, establecemos esta variable en 1 y continuamos el bucle. Cuando el usuario intenta salir presionando enter, verificamos siinvalid_input
es 1 y salimos del bucle si es así. De esta manera, no tenemos que presionar enter varias veces para salir después de cometer un error.¡Espero que esto sea útil!