¿Cómo puedo crear una barra de progreso con bash?
Este es mi guión:
#!/bin/bash
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
for i in $pass ; do
if [ "$i" == "$chk" ]; then
echo ' Found ^_^'
else
echo 'loading 50%'
fi
done
Quiero reemplazar echo 'loading 50%'
con cualquier cosa para crear una barra de progreso.
command-line
bash
Black Hawk
fuente
fuente
eta
podría hacer lo que quieras.Respuestas:
whiptail
viene preinstalado en Ubuntu y muchas otras distribuciones, y mostrará elementos de progreso en pantalla completa (pero aún basados en terminales).dialog
es un superconjunto dewhiptail
, por lo que este ejemplo funcionará igualmente bien con ambos. Proporciona elementos de interfaz de usuario más avanzados, por lo que puede ser útil si está buscando interacción del usuario, como selectores de archivos y formularios, pero tiene la desventaja de no venir preinstalado en muchos sistemas.Tenga en cuenta que la salida del script se interpreta como un porcentaje, por lo que puede que tenga que ajustar su salida en consecuencia.
Whiptail y Dialog también le permiten modificar el texto en tiempo de ejecución a través de una sintaxis bastante críptica:
pv
muestra el progreso de un archivo o secuencia que se canaliza a través de él. Sin embargo, no puede usarse (¿fácilmente?) Para mostrar el progreso de una operación personalizada, como un bucle. Está diseñado específicamente para transmisiones.Algunos ejemplos del mundo real son
pv
útiles:No conozco ningún comando que proporcione barras de progreso de una línea en el estilo de
pv
owget
, pero hay muchos scripts simples de Bash / Perl / sed que agregarán esa funcionalidad, como otros han compartido aquí.fuente
pv
usted, puede hacer que busque la salida del bucle o crear alguna salida falsa, por ejemplo, unecho
en cada iteración, canalizarlopv
y darle el recuento de iteración-s
. Si no se desea, recuerde redirigir el stdout del bucle a/dev/null
. Aquí hay un ejemplo que muestra este enfoque .Puede usar
zenity
para crear ventanas de diálogo GTK simples. Una de las opciones disponibles es un diálogo de barra de progreso.Usted crea dicha ventana usando
zenity --progress
. Para que sea útil, debe especificar más información agregando algunas de las opciones a continuación (extracto deman zenity
):Hay dos modos:
pulsante : la barra de progreso está pulsando, solo indica que algo se está ejecutando, pero no dice nada sobre el progreso. Para ello, configura la
--pulsating
opción.manual : debe canalizar el porcentaje de progreso actual a la
zenity
entrada estándar del comando para actualizar la barra de progreso.Un ejemplo de esto podría verse así a continuación. Tenga en cuenta que los comandos anteriores se agrupan en una subshell para que toda la salida se redirija al
zenity
cuadro de diálogo y no solo la del último comando:fuente
[ ###########--------------] 52%
Este código lo hará, y no requiere nada (aparte de bash, por supuesto). Imprime
#
letreros, como usted preguntó en su comentario:Sin embargo, si tiene mucho que verificar, esto solo llenará su pantalla con
#
signos. Para solucionar ese problema, intente este código:Cambie el 5 en la primera línea (
lenProgressBar=5
) a la longitud que desea que tenga su barra de progreso. Tardará más en imprimir un#
letrero con barras de progreso de menor longitud que con barras de mayor longitud, pero no permita que la longitud de la barra de progreso exceda el tamaño de su pantalla; no funcionará bien si lo haces. (No le permitirá usar una barra de progreso superior a la cantidad de elementos que está revisando o inferior a 1)fuente
tput cols
para detectar el ancho de la ventana de terminal y escalar la barra de progreso en consecuencia.Aquí hay otro enfoque que usa códigos de escape ansi:
fuente