Linux + hur man skapar enkel förloppsindikator i bash [duplikat]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" roll = "status">

Denna fråga har redan svar här :

Kommentarer

Svar

Detta är ganska enkelt att göra i helt enkelt 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 

Det första argumentet till prog är procenten, alla andra skrivs ut efter förloppsindikatorn. Variabeln w i funktionen styr fältets bredd. Skriv ut en ny rad när du är klar, funktionen skriver inte ut en.


En annan möjlighet skulle vara att använda verktyget pv. Den är avsedd för mätning av en pipelines genomströmning, men vi kan skapa en för den:

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

Här, -pt aktiverar förloppsindikatorn och timern, -s 100 ställer in den totala utmatningsstorleken, och vad vi än skriver ut i funktionen räknas den storleken. h2> Svar

Generellt kan du implementera detta genom att skriva över en rad. Använd \r för att gå tillbaka till början av raden utan att skriva \n till terminalen.

Skriv \n när du är klar för att gå vidare till raden.

Använd echo -ne till:

  • skriv inte ut \n och
  • för att känna igen escape-sekvenser som \r.

Här ”är en demo:

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

EDIT: Nu kommer cURL med ett framstegsfält: --progress-bar, är det inte vad du vill?

hämtat från svar t o https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script

Hittade att med Google, första svaret, med följande sökord: ”bash progress bar”

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *