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:
- no imprimir
n
y - 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/