Saltar al contenido

¿Cómo agregar una barra de progreso a un script de shell?

Solución:

Puede implementar esto sobrescribiendo una línea. Usar r volver al principio de la línea sin escribir n a la terminal.

Escribir n cuando haya terminado para avanzar en la línea.

Usar echo -ne para:

  1. no imprimir n y
  2. para reconocer secuencias de escape como r.

Aquí hay una demostración:

echo -ne '#####                     (33%)r'
sleep 1
echo -ne '#############             (66%)r'
sleep 1
echo -ne '#######################   (100%)r'
echo -ne 'n'

En un comentario a continuación, puk menciona que esto “falla” si comienza con una línea larga y luego desea escribir una línea corta: en este caso, deberá sobrescribir la longitud de la línea larga (por ejemplo, con espacios).

También te puede interesar cómo hacer una ruleta:

¿Puedo hacer una ruleta en Bash?

¡Seguro!

i=1
sp="/-|"
echo -n ' '
while true
do
    printf "b${sp:i++%${#sp}:1}"
done

Cada vez que el bucle se repite, muestra el siguiente carácter en la cadena sp, envolviendo a medida que llega al final. (i es la posición del carácter actual que se mostrará y $ {# sp} es la longitud de la cadena sp).

La cadena b se reemplaza por un carácter de ‘retroceso’. Alternativamente, puede jugar con r para volver al principio de la línea.

Si desea que se ralentice, coloque un comando de suspensión dentro del bucle (después de printf).

Un equivalente POSIX sería:

sp='/-|'
printf ' '
while true; do
    printf 'b%.1s' "$sp"
    sp=${sp#?}${sp%???}
done

Si ya tiene un bucle que hace mucho trabajo, puede llamar a la siguiente función al comienzo de cada iteración para actualizar la ruleta:

sp="/-|"
sc=0
spin() {
   printf "b${sp:sc++:1}"
   ((sc==${#sp})) && sc=0
}
endspin() {
   printf "r%sn" "[email protected]"
}

until work_done; do
   spin
   some_work ...
done
endspin

Tengo una función de barra de progreso fácil que escribí el otro día:

#!/bin/bash
# 1. Create ProgressBar function
# 1.1 Input is currentState($1) and totalState($2)
function ProgressBar {
# Process data
    let _progress=(${1}*100/${2}*100)/100
    let _done=(${_progress}*4)/10
    let _left=40-$_done
# Build progressbar string lengths
    _fill=$(printf "%${_done}s")
    _empty=$(printf "%${_left}s")

# 1.2 Build progressbar strings and print the ProgressBar line
# 1.2.1 Output example:                           
# 1.2.1.1 Progress : [########################################] 100%
printf "rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%%"

}

# Variables
_start=1

# This accounts as the "totalState" variable for the ProgressBar function
_end=100

# Proof of concept
for number in $(seq ${_start} ${_end})
do
    sleep 0.1
    ProgressBar ${number} ${_end}
done
printf 'nFinished!n'

O arrancarlo de
https://github.com/fearside/ProgressBar/

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *