Dos selecciones de menú en script Bash

Dos selecciones de menú en script Bash

Estoy aprendiendo Bash y estoy intentando resolver un ejercicio.

El ejercicio consiste en seleccionar el nombre y apellido, de una lista de menú. Sin embargo, si el nombre no está en la lista, configure la entrada manual.

Pero estoy un poco confundido porque cuando una opción es seleccionar cómo ir al segundo menú, sin seleccionar la opción Salir (intento agregar Interrupción en cualquier opción pero no funciona).

Para la entrada manual, ¿intento leer la entrada del usuario pero no veo que funcione ninguna sugerencia?

¿Cómo puedo finalizar el bucle cuando obtengo el nombre y apellido? Porque cuando obtengo ambos, llego al mismo bucle.

echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

echo "Hello $opt Next Step is Select your Lastname "
done

PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
    case $opt2 in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

clear
echo "Welcome $opt $opt2"
done

Respuesta1

El selectbucle se establecería opten la opción que el usuario eligió y se establecería $REPLYen lo que el usuario escribió. Entonces, si el usuario escribió 1como respuesta a su primera pregunta, $REPLYsería 1y $optsería Elvis. En ningún momento lo $optsería Option 1. Hace que sea más fácil escribir casedeclaraciones para pruebas $REPLYen lugar de $opt.

Además, es demasiado pronto para saludar a la persona por su nombre.adentroel selectbucle, ya que es posible que todavía no estemos seguros de tener un nombre real para ellos. El código entre el final de la casedeclaración y el donefinal del selectbucle se ejecuta cuando el usuario elige uninválidoopción del menú (también puede hacer esto con una *)etiqueta de caja).

Sería mejor usar nombres de variables más descriptivos, como namey family, y no necesitamos dos matrices separadas para almacenar las opciones (de hecho, es cuestionable si necesita matrices en este caso, ya que podríamos enumerar las cadenas directamente) .

En el código siguiente, también hice que el código termine con exitsi el usuario elige Quit( breaksale del selectbucle y lo usamos cuando el usuario ha elegido un nombre con éxito). Todo el diálogo interactivo ocurre en el flujo de error estándar, como es común.

#!/bin/bash

PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your name is not in the list' >&2
            read -e -r -p "What's your name: " name
            break
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
   esac

   echo 'Try again!' >&2

done
printf 'Hello %s, now select your family name\n' "$name" >&2

PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your family is not in the list' >&2
            read -e -r -p "What's your family: " family
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
    esac

    echo 'Try again!' >&2

done

printf 'Welcome, %s %s!\n' "$name" "$family"

Otras pequeñas cosas arregladas: use -rwith readpara poder leer las barras invertidas correctamente y usó PS4en lugar de PS3para configurar el mensaje de selección en el segundo bucle.

información relacionada