Linux + hoe je een eenvoudige voortgangsbalk maakt in bash [duplicate]

Deze vraag heeft hier al antwoorden :

Opmerkingen

Antwoord

Dit is vrij eenvoudig om te doen in gewoon 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 

Het eerste argument voor prog is het percentage, alle andere worden afgedrukt na de voortgangsbalk. De variabele w in de functie bepaalt de breedte van de balk. Druk een nieuwe regel af nadat u “klaar bent, de functie drukt er geen af.


Een andere mogelijkheid zou zijn om de pv tool te gebruiken. Het is bedoeld om de doorvoer van een pijplijn te meten, maar we kunnen er een voor maken:

for x in {1..100} ; do sleep .1 # do some work here printf . done | pv -pt -i0.2 -s100 -w 80 > /dev/null 

Hier -pt schakelt de voortgangsbalk en de timer in, -s 100 stelt de totale uitvoergrootte in, en alles wat we binnen de functie afdrukken telt mee voor die grootte.

Answer

In het algemeen kunt u dit implementeren door een regel te overschrijven. Gebruik \r om terug te gaan naar het begin van de regel zonder \n naar de terminal te schrijven.

Schrijf \n als u klaar bent om de regel vooruit te laten lopen.

Gebruik echo -ne om:

  • \n en
  • om escape-reeksen te herkennen, zoals \r.

Hier “een demo:

echo -ne "... (33%)\r" sleep 1 echo -ne "...... (66%)\r" sleep 1 echo -ne ".......... (100%)\r" echo -ne "\n" 

EDIT: cURL wordt nu geleverd met een voortgangsbalk: --progress-bar, is dat niet wat je wilt?

overgenomen uit antwoord t o https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script

Vond dat met Google, eerste antwoord, met de volgende zoektermen: “bash voortgangsbalk”

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *