Strona Główna Unixy.pl
Internetowe forum na temat systemów GNU/Linux Unix

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy  StatystykiStatystyki
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload
 Ogłoszenie 
Strona korzysta z plików cookies w celu realizacji usług (logowanie do konta itp.). Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.

Poprzedni temat «» Następny temat
[BASH] Progress bar/pasek postępu
Autor Wiadomość
Maciek_Rutecki 
Administrator

JID: bc547@jabber.gda.pl
Pomógł: 39 razy
Dołączył: 07 Cze 2005
Posty: 2959
Wysłany: 2011-06-06, 19:54   [BASH] Progress bar/pasek postępu

Z potrzeb własnych zrobilem funkcję do skryptów basha, tworzącą pasek postępu (ASCII), postęp w procentach oraz ETA.

eng (jakby ktoś przypadkiem trafił przez google): This script allows you to create your own progress bar as an additional function in your bash script file. Feel free to distribute. It print: progress bar (in ASCII), progress in percent and ETA.
Kod:

#!/bin/bash
# bash function that create progressBar
# (C) Maciej Rutecki (maciekATunixy.pl)
# License: GPLv3

# read time since unix epoch
START=$(date +%s)

# print: progress bar, % and ETA
# run with arguments: <iteration> <total number of steps>
# e.g. progressBar 10 100
progressBar()
{
    # save arguments
    PROGRESS=$1
    TOTAL=$2

    # size of progress bar (without brackets etc.)
    # real size is "[" + BAR_SIZE+ ">" + "]"
    # so real size = BAR_SIZE + 3
    BAR_SIZE=40
    EQUAL="="
    SPACE="_"
    L_BRACKET="["
    R_BRACKET="]"
    GREATER=">"
    ZERO="0"

    # don't print ETA when starts (avoid divide by zero)
    if [ $PROGRESS == 0 ]; then
        ETA="ETA: __:__"
    else
        # read current seconds
        NOW=$(date +%s)
        # how many second elapsed
        let ELAPSED_TIME=$NOW-$START
        # calculate seconds to end process
        let TEMP=$TOTAL-$PROGRESS
        let REMAIN_TIME=$TEMP*$ELAPSED_TIME/$PROGRESS
        # calculate minutes
        let REMAIN_MIN=$REMAIN_TIME/60
        # add zero when is only one digit
        if [ $REMAIN_MIN -lt 10 ]; then
            REMAIN_MIN=$ZERO$REMAIN_MIN
        fi
        # calculate seconds
        let REMAIN_SEC=$REMAIN_TIME%60
        # add zero when is only one digit
        if [ $REMAIN_SEC -lt 10 ]; then
            REMAIN_SEC=$ZERO$REMAIN_SEC
        fi
        # create ETA string
        ETA="ETA: "$REMAIN_MIN":"$REMAIN_SEC
    fi

    # calculate percentage
    let PERCENTAGE=100*$PROGRESS/$TOTAL

    # how log is progress bar (for elapsed process)
    let WIDTH=$BAR_SIZE*$PROGRESS/$TOTAL

    # add lefr bracket
    OUTPUT_STRING=$L_BRACKET

   
    # when finishing create static progress bar
    if [ $PROGRESS -eq $((TOTAL-1)) ]; then
        for (( j=0; j<=$BAR_SIZE; j++ ))
        do
            OUTPUT_STRING=$OUTPUT_STRING$EQUAL
        done
        OUTPUT_STRING=$OUTPUT_STRING$R_BRACKET
        echo $OUTPUT_STRING" 100% ETA: 00:00"
    # when progress <100%
    else
        # create progress bar ("=") for elapsed process
        for (( j=0; j<$WIDTH; j++ ))
        do
            OUTPUT_STRING=$OUTPUT_STRING$EQUAL
        done
        # add ">"
        OUTPUT_STRING=$OUTPUT_STRING$GREATER
        # create progress bar ("_") for remaining process
        let EMPTY=$BAR_SIZE-$WIDTH
        for (( j=0; j<$EMPTY; j++ ))
        do
            OUTPUT_STRING=$OUTPUT_STRING$SPACE
        done
        # close bracket
        OUTPUT_STRING=$OUTPUT_STRING$R_BRACKET
        # main:
        # print progress bar, % and ETA on the screen
        echo -e  $OUTPUT_STRING" "$PERCENTAGE"% "$ETA"\r\c"
    fi
}

echo "In progress..."

# number of iteration, used by program (not progress bar)
NUMBER_OF_ITERATION=20

STEP=0

for (( i=0; i<$NUMBER_OF_ITERATION; i++ ))
do

    # do anything (example)
    if [ $((i%4)) -eq 2 ]; then
        sleep 2
    else
        if [ $((i%2)) -eq 1 ]; then
            sleep 3
        else
            sleep 1
        fi
    fi       
    STEP=$i
    # call function that creates progress bar
     progressBar $STEP $NUMBER_OF_ITERATION
done

echo "Done."
_________________
Maciek
http://www.maciek.unixy.pl
Ostatnio zmieniony przez Maciek_Rutecki 2011-06-07, 06:11, w całości zmieniany 1 raz  
 
     
scool 

JID: scool@jabberpl.org
Pomógł: 1 raz
Dołączył: 15 Lis 2005
Posty: 409
Wysłany: 2011-06-06, 21:05   

Widzę, że nawet pracując przy tajnych rządowych projektach ;) znajdujesz czas na różne gadżety :mrgreen: Dzięki, może za niedługo mi się przyda coś takiego...
_________________
Każdy Polak oczywista, dba by w domu była Vista... Windows Seven always even :P

Co to jest KDE?? kde to po czesku "gdzie".

"...Z ręki obcej; źródła jego dawne serwery,
A numer jego będzie... 404."
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group