Jest to dość proste w zwykłym Bash:
#!/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
Pierwszy argument do prog
to wartość procentowa, pozostałe są drukowane za paskiem postępu. Zmienna w
w funkcji kontroluje szerokość paska. Wydrukuj znak nowej linii po „zakończeniu”, funkcja go nie drukuje.
Inną możliwością byłoby użycie narzędzia pv
. Służy do pomiaru przepustowości potoku, ale możemy go dla niego utworzyć:
for x in {1..100} ; do sleep .1 # do some work here printf . done | pv -pt -i0.2 -s100 -w 80 > /dev/null
Tutaj -pt
włącza pasek postępu i licznik czasu, -s 100
ustawia całkowity rozmiar wyjścia, a cokolwiek wydrukujemy wewnątrz funkcji, liczy się do tego rozmiaru.
Ogólnie rzecz biorąc, możesz to zaimplementować nadpisując wiersz. Użyj \r
, aby wrócić na początek linia bez wpisywania \n
do terminala.
Napisz \n
, kiedy skończysz, aby przesunąć linię.
Użyj echo -ne
, aby:
- nie drukować
\n
i
- rozpoznawać sekwencje specjalne, takie jak
\r.
Oto „demo:
echo -ne "... (33%)\r" sleep 1 echo -ne "...... (66%)\r" sleep 1 echo -ne ".......... (100%)\r" echo -ne "\n"
EDYTUJ: Teraz cURL zawiera pasek postępu: --progress-bar
, czy nie tego chcesz?
wzięte z odpowiedzi t o https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script
Znalazłem to w Google, pierwsza odpowiedź, z następującymi wyszukiwanymi hasłami: „pasek postępu basha”