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 select
bucle se establecería opt
en la opción que el usuario eligió y se establecería $REPLY
en lo que el usuario escribió. Entonces, si el usuario escribió 1
como respuesta a su primera pregunta, $REPLY
sería 1
y $opt
sería Elvis
. En ningún momento lo $opt
sería Option 1
. Hace que sea más fácil escribir case
declaraciones para pruebas $REPLY
en lugar de $opt
.
Además, es demasiado pronto para saludar a la persona por su nombre.adentroel select
bucle, 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 case
declaración y el done
final del select
bucle 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 name
y 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 exit
si el usuario elige Quit
( break
sale del select
bucle 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 -r
with read
para poder leer las barras invertidas correctamente y usó PS4
en lugar de PS3
para configurar el mensaje de selección en el segundo bucle.