es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    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 [[ $invalid_input -eq 1 ]]; then break; fi ;;
                *) 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'; invalid_input=1; continue ;;
                esac
    
                invalid_input=0
            done
        }
    

    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 si invalid_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!

Comments are closed.