Soy un novato bash, pero me gustaría crear un script en el que me gustaría permitir que el usuario seleccione múltiples opciones de una lista de opciones.
Esencialmente, lo que me gustaría es algo similar al siguiente ejemplo:
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
(Fuente de http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
Sin embargo, mi script tendría más opciones, y me gustaría permitir que se seleccionen múltiples. Entonces algo como esto:
1) Opción 1
2) Opción 2
3) Opción 3
4) Opción 4
5) Listo
Tener comentarios sobre los que han seleccionado también sería genial, por ejemplo, signos más junto a los que ya han seleccionado. Por ejemplo, si selecciona "1", me gustaría paginar para borrar y volver a imprimir:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Entonces, si selecciona "3":
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Además, si nuevamente seleccionaron (1) me gustaría que "deseleccione" la opción:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Y finalmente, cuando se presiona Listo, me gustaría tener una lista de las que se seleccionaron para que se muestren antes de que el programa salga, por ejemplo, si el estado actual es:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Presionando 5 debería imprimir:
Option 2, Option 3, Option 4
... y el script termina.
Entonces mi pregunta: ¿es esto posible en bash, y si es así, alguien puede proporcionar una muestra de código?
Cualquier consejo sería muy apreciado.
Si crees que
whiptail
es complejo, aquí va un código solo de bash que hace exactamente lo que quieres. Es corto (~ 20 líneas), pero un poco críptico para un principiante. Además de mostrar "+" para las opciones marcadas, también proporciona comentarios para cada acción del usuario ("opción no válida", "la opción X fue marcada" / sin marcar, etc.).Dicho eso, ahí tienes!
Espero que lo disfruten ... fue un desafío bastante divertido hacerlo :)
fuente
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
en Windows!Aquí hay una manera de hacer exactamente lo que quiere usando solo las funciones de Bash sin dependencias externas. Marca las selecciones actuales y le permite alternarlas.
Para ksh, cambie las dos primeras líneas de la función:
y el shebang a
#!/bin/ksh
.fuente
options=(*)
(u otros patrones globales) obtendrá una lista de archivos en la matriz. El desafío sería obtener las marcas de selección array (${opts[@]}
) comprimidas junto con él. Se puede hacer con unfor
bucle, pero tendría que ejecutarse para cada pasada a través delwhile
bucle externo . Es posible que desee considerar usardialog
owhiptail
como mencioné en mi otra respuesta, aunque estas son dependencias externas.${opts[@]}
y guardar la cadena, pasada como un argumento adicional a la función, en lugar de+
).Escribí una biblioteca llamada cuestionario , que es un mini-DSL para crear cuestionarios de línea de comandos. Le pide al usuario que responda una serie de preguntas e imprime las respuestas en stdout.
Hace tu tarea realmente fácil. Instálelo
pip install questionnaire
y cree un script, por ejemploquestions.py
, así:Entonces corre
python questions.py
. Cuando haya terminado de responder las preguntas, se imprimirán en stdout. Funciona con Python 2 y 3, uno de los cuales seguramente está instalado en su sistema.También puede manejar cuestionarios mucho más complicados, en caso de que alguien quiera hacer esto. Aquí hay algunas características:
fuente
Usé el ejemplo de MestreLion y redacté el código a continuación. Todo lo que necesita hacer es actualizar las opciones y acciones en las dos primeras secciones.
fuente
n1 SELECTION
está la parte crucial para aumentar el número de dígitos?-n2 SELECTION
aceptará dos dígitos (por ejemplo, 15),-n3
acepta tres (por ejemplo 153), etc.Aquí hay una función bash que permite al usuario seleccionar múltiples opciones con las teclas de flecha y el Espacio, y confirmar con Enter. Tiene una agradable sensación de menú. Lo escribí con la ayuda de https://unix.stackexchange.com/a/415155 . Se puede llamar así:
El resultado se almacena como una matriz en una variable con el nombre proporcionado como primer argumento. El último argumento es opcional y se usa para seleccionar algunas opciones por defecto. Se parece a esto.
fuente
Como no encontré ninguna alternativa BASH adecuada para prompt-toolkit (python), dialoguer (rust) o inquirer (node), lo probé por mi cuenta:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
fuente
fuente
easybashgui
.