Estoy tratando de implementar un menú simple usando el select
comando. El script (para fines de prueba) es el siguiente:
#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
case $opt in
"apache")
date
;;
"named")
echo "test"
;;
"sendmail")
echo "test 2"
;;
*) echo "invalid option";;
esac
done
echo "*********************"
El script no reconoce ninguna entrada válida que doy y siempre imprime el mensaje de "opción no válida". ¿Qué estoy haciendo mal en este script?
bash
shell-script
select
Sumod
fuente
fuente
Respuestas:
Su menú que se muestra en select se verá así:
En este momento, ingresa "1" o "2" o "3": no escribe la palabra.
Además, se
select
repetirá hasta que vea unbreak
comando, por lo que desea esto:Si desea permitir que el usuario ingrese el número o la palabra, puede escribir esto:
La coma no tiene significado sintáctico, solo está ahí para poder coincidir con el patrón en la variable $ REPLY (que es lo que el usuario realmente escribió) o la variable $ opt
fuente
select
comando necesita unbreak
, nocase
.break
allí en cada sección. Sin embargo, nunca se necesitará unabreak
en un caso ... esac bloque en un script de shell . Puede suceder tan fácilmente confundirlos. :-)break
paracase
. Sin embargo, necesita unbreak
para escapar delselect
bucle.Su
$opt
variable se establecerá en la palabra de opción correspondiente al número que ingrese el usuario. Si desea ver lo que el usuario realmente escribió, mire$REPLY
.fuente
case
compara$opt
con "apache", "named" y "sendmail", es correcto y no hay que cambiar nada.1
/2
/3
, y $ opt retieneapache
/named
/sendmail
$REPLY
es lo que escribió el usuario, y si era un número válido,$opt
será la palabra correspondiente a ese número.