Isso é bastante simples de se fazer em Bash simples:
#!/bin/bash
# progress bar function
prog() {
local w=80 p=$1; shift
# create a string of spaces, then change them to dots
printf -v dots "%*s" "$(( $p*$w/100 ))" ""; dots=${dots// /.};
# print those dots on a fixed-width space plus the percentage etc.
printf "\r\e[K|%-*s| %3d %% %s" "$w" "$dots" "$p" "$*";
}
# test loop
for x in {1..100} ; do
prog "$x" still working...
sleep .1 # do some work here
done ; echo
O primeiro argumento para prog
é a porcentagem, quaisquer outros são impressos após a barra de progresso. A variável w
na função controla a largura da barra. Imprima uma nova linha depois de terminar, a função não imprime uma.
Outra possibilidade seria usar a ferramenta pv
. Ele serve para medir o throughput de um pipeline, mas podemos criar um para ele:
for x in {1..100} ; do
sleep .1 # do some work here
printf .
done | pv -pt -i0.2 -s100 -w 80 > /dev/null
Aqui, -pt
ativa a barra de progresso e o temporizador, -s 100
define o tamanho total da saída e o que imprimirmos dentro da função conta com esse tamanho.