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”