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
breakdeclaraciones donde necesiteselectque salga el bucle. Sibreakno se realiza a, laselectinstrucción se repite y el menú se vuelve a mostrar.En la tercera opción, incluí variables establecidas por la
selectdeclaración para demostrar que tiene acceso a esos valores. Si lo elige, generará:Puede ver que
$REPLYcontiene 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$optcontiene la cadena de ese índice en la matriz.Tenga en cuenta que las opciones podrían ser una lista simple directamente en la
selectdeclaració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
breakque sale delselectbucle. Puede agregarlobreakdonde 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 ")' 'PS3es la solicitud delselectcomando. Se usa automáticamente y no necesita ser referenciado explícitamente.PS3yselectdocumentación.$optionsen lacasedeclaración en lugar de los valores). Creo que usar los valores documenta mejor la funcionalidad de las secciones de lacasedeclaració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
breakdespuésesac(el enfoque zenity también podría reducirse aún más)Ambos
caseestá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
zenityenfoque.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.
PS3yREPLYvars no pueden ser renombrados.selectestá 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
caseestructura para laselectversión que está utilizando para lazenityversión:case "$opt" in . . . "${options[0]}" ) . . .(en lugar de$REPLYy los índices1,2y3).$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 laCHOICEdefinición de la variable cambié2>&1 >/dev/ttya2>&1 >$TERMINALevitar problemas de redirección si el script se ejecuta en un contexto terminal diferente.--backtitlepará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
-nopción de lectura. En este ejemplo, le pedimos que apague, reinicie o simplemente salga del script usandoANSnuestra 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
whiptailodialog. En Lucid eswhiptail.Si eso falla, use bash "select" como lo explicó Dennis Williamson.
fuente
#! / bin / sh Muestrame el menu(){ normal = `echo" \ 033 [m "` menu = `echo" \ 033 [36m "` #Azul número = `echo" \ 033 [33m "` #amarillo bgred = `echo" \ 033 [41m "` fgred = `echo" \ 033 [31m "` printf "\ n $ {menu} ****************************************** *** $ {normal} \ n " printf "$ {menu} ** $ {number} 1) $ {menu} Montar dropbox $ {normal} \ n" printf "$ {menu} ** $ {number} 2) $ {menu} Montar USB 500 Gig Drive $ {normal} \ n" printf "$ {menu} ** $ {number} 3) $ {menu} Reiniciar Apache $ {normal} \ n" printf "$ {menu} ** $ {number} 4) $ {menu} ssh Servidor Frost TomCat $ {normal} \ n" printf "$ {menu} ** $ {number} 5) $ {menu} Algunos otros comandos $ {normal} \ n" printf "$ {menu} ******************************************** * $ {normal} \ n " printf "Ingrese una opción de menú e ingrese o $ {fgred} x para salir. $ {normal}" leer opt } option_picked () { msgcolor = `echo" \ 033 [01; 31m "` # negrita rojo normal = `echo" \ 033 [00; 00m "` # blanco normal mensaje = $ {@: - "$ {normal} Error: no se pasó ningún mensaje"} printf "$ {msgcolor} $ {message} $ {normal} \ n" } claro Muestrame el menu mientras que [$ opt! = ''] hacer si [$ opt = '']; entonces salida; más caso $ opt in 1) claro; option_picked "Opción 1 elegida"; printf "sudo mount / dev / sdh1 / mnt / DropBox /; #The 3 terabyte"; Muestrame el menu; ;; 2) claro; option_picked "Opción 2 elegida"; printf "sudo mount / dev / sdi1 / mnt / usbDrive; #The 500 gig drive"; Muestrame el menu; ;; 3) claro; option_picked "Opción 3 elegida"; printf "sudo service apache2 restart"; Muestrame el menu; ;; 4) claro; option_picked "Opción 4 elegida"; printf "ssh lmesser @ -p 2010"; Muestrame el menu; ;; x) salir; ;; \ n) salir; ;; *)claro; option_picked "Elige una opción del menú"; Muestrame el menu; ;; esac fi hechofuente
$falta la$optvariable en lawhiledeclaración. Laifdeclaración es redundante. Sangría inconsistente. El usomenuen 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.FGREDdebería llamarsebgred. Uso de backticks en lugar de$(). La definición de la función debe ser coherente y no usar ...\nnunca 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