Estoy creando un script bash simple y quiero crear un menú de selección en él, como este:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
Y según la elección del usuario, quiero que se ejecuten diferentes acciones. Soy un novato de scripting de bash shell, busqué en la web algunas respuestas, pero no obtuve nada realmente concreto.
bash
command-line
scripts
Daniel Rodrigues
fuente
fuente
seq 10 | fzf
. El inconveniente es que fzf no está instalado por defecto. Puede encontrar fzf aquí: github.com/junegunn/fzfRespuestas:
Agregue
break
declaraciones donde necesiteselect
que salga el bucle. Sibreak
no se realiza a, laselect
instrucción se repite y el menú se vuelve a mostrar.En la tercera opción, incluí variables establecidas por la
select
declaración para demostrar que tiene acceso a esos valores. Si lo elige, generará:Puede ver que
$REPLY
contiene la cadena que ingresó en la solicitud. Se utiliza como índice en la matriz${options[@]}
como si la matriz estuviera basada en 1. La variable$opt
contiene la cadena de ese índice en la matriz.Tenga en cuenta que las opciones podrían ser una lista simple directamente en la
select
declaración como esta:pero no puede poner dicha lista en una variable escalar debido a los espacios en una de las opciones.
También puede usar el bloqueo de archivos si elige entre archivos:
fuente
break
que sale delselect
bucle. Puede agregarlobreak
donde lo necesite. El manual de Bash dice "Los comandos se ejecutan después de cada selección hasta que se ejecuta un comando de interrupción, momento en el que se completa el comando de selección"../test.sh: line 9: syntax error near unexpected token
"Opción 1" './test.sh: línea 9: `" Opción 1 ")' 'PS3
es la solicitud delselect
comando. Se usa automáticamente y no necesita ser referenciado explícitamente.PS3
yselect
documentación.$options
en lacase
declaración en lugar de los valores). Creo que usar los valores documenta mejor la funcionalidad de las secciones de lacase
declaración.No es una respuesta nueva per se , pero como todavía no hay una respuesta aceptada, aquí hay algunos consejos y trucos de codificación, tanto para seleccionar como para zenity:
Vale la pena mencionar:
Ambos se repetirán hasta que el usuario elija explícitamente Salir (o Cancelar por zenity). Este es un buen enfoque para los menús de guiones interactivos: después de seleccionar una opción y realizar una acción, el menú se presenta nuevamente para otra opción. Si la elección está destinada a ser de una sola vez, solo use
break
despuésesac
(el enfoque zenity también podría reducirse aún más)Ambos
case
están basados en índices, más que en valores. Creo que esto es más fácil de codificar y mantenerLa matriz también se usa para el
zenity
enfoque.La opción "Salir" no se encuentra entre las opciones iniciales originales. Se "agrega" cuando es necesario, para que su matriz se mantenga limpia. Después de todo, "Salir" no es necesario para zenity de todos modos, el usuario puede simplemente hacer clic en "Cancelar" (o cerrar la ventana) para salir. Observe cómo ambos usan la misma matriz de opciones intacta.
PS3
yREPLY
vars no pueden ser renombrados.select
está codificado para usar esos. Todas las demás variables en el script (opt, options, prompt, title) pueden tener los nombres que desee, siempre que realice los ajustesfuente
case
estructura para laselect
versión que está utilizando para lazenity
versión:case "$opt" in . . . "${options[0]}" ) . . .
(en lugar de$REPLY
y los índices1
,2
y3
).$REPLY
, índices y valores.Usando
dialog
, el comando se vería así:Poniéndolo en un script:
fuente
TERMINAL=$(tty)
en la parte superior de mi guión y luego en laCHOICE
definición de la variable cambié2>&1 >/dev/tty
a2>&1 >$TERMINAL
evitar problemas de redirección si el script se ejecuta en un contexto terminal diferente.--backtitle
parámetro?Puede usar este script simple para crear opciones
fuente
Tengo una opción más que es una mezcla de estas respuestas, pero lo que lo hace agradable es que solo necesita presionar una tecla y luego el script continúa gracias a la
-n
opción de lectura. En este ejemplo, le pedimos que apague, reinicie o simplemente salga del script usandoANS
nuestra variable y el usuario solo tiene que presionar E, R o S. También configuro el valor predeterminado para salir, de modo que si se presiona Enter, el script saldráfuente
Dado que esto está dirigido a Ubuntu, debe usar cualquier debconf backend configurado para usar. Puede encontrar el backend de debconf con:
Si dice "diálogo", entonces probablemente use
whiptail
odialog
. En Lucid eswhiptail
.Si eso falla, use bash "select" como lo explicó Dennis Williamson.
fuente
fuente
$
falta la$opt
variable en lawhile
declaración. Laif
declaración es redundante. Sangría inconsistente. El usomenu
en algunos lugares donde debería ser 'show_menu.
show_menu` podría colocarse en la parte superior del bucle en lugar de repetirse en cada unocase
. Sangría inconsistente. Uso combinado de corchetes simples y dobles. Usar secuencias ANSI codificadas en lugar detput
. No se recomienda el uso de nombres var en mayúsculas.FGRED
debería llamarsebgred
. Uso de backticks en lugar de$()
. La definición de la función debe ser coherente y no usar ...\n
nunca se ejecutará. Quizás más.He usado Zenity, que siempre parece estar en Ubuntu, funciona muy bien y tiene muchas capacidades. Este es un boceto de un posible menú:
fuente
Menú sofisticado de Bash
Pruébelo primero, luego visite mi página para obtener una descripción detallada ... No necesita bibliotecas o programas externos como diálogo o zenity ...
fuente
Ya hay la misma pregunta en serverfault respondida. La solución allí usa whiptail .
fuente
Suponiendo que desea utilizar un menú de script de shell simple (sin interfaz de usuario sofisticada), consulte el ejemplo de menú en http://www.tldp.org/LDP/abs/html/testbranch.html .
fuente