Jak mogę utworzyć pasek postępu za pomocą bash?
To jest mój skrypt:
#!/bin/bash
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
for i in $pass ; do
if [ "$i" == "$chk" ]; then
echo ' Found ^_^'
else
echo 'loading 50%'
fi
done
Chcę zastąpić echo 'loading 50%'
czymkolwiek, aby utworzyć pasek postępu.
command-line
bash
Czarny Jastrząb
źródło
źródło
eta
Może robić, co chcesz.Odpowiedzi:
whiptail
jest fabrycznie zainstalowany na Ubuntu i wielu innych dystrybucjach i wyświetla elementy postępu na pełnym ekranie (ale nadal oparte na terminalu).dialog
jest nadzbioremwhiptail
, więc ten przykład będzie działał równie dobrze z oboma. Zapewnia bardziej zaawansowane elementy interfejsu użytkownika, więc może się przydać, jeśli szukasz interakcji użytkownika, takiej jak selektory plików i formularze, ale ma tę wadę, że nie jest instalowany fabrycznie w wielu systemach.Zauważ, że wynik skryptu jest interpretowany jako procent, więc może być konieczne odpowiednie dostosowanie wyniku.
Whiptail i Dialog pozwalają również modyfikować tekst w czasie wykonywania za pomocą raczej tajemniczej składni:
pv
pokazuje postęp pliku lub strumienia przesyłanego przez niego. Nie można go jednak (łatwo?) Wykorzystać do pokazania postępu niestandardowej operacji, takiej jak pętla. Jest zaprojektowany specjalnie dla strumieni.pv
Przydaje się kilka przykładów ze świata rzeczywistego :Nie znam żadnych poleceń, które dają paski postępu w jednym wierszu w stylu
pv
lubwget
, ale istnieje wiele prostych skryptów Bash / Perl / sed, które dodadzą tę funkcjonalność, tak jak inni tutaj udostępnili.źródło
pv
, możesz sprawić, że będzie szukać wyjścia pętli lub stworzyć fałszywe wyjście, np.echo
W każdej iteracji, potokuj do niegopv
i podaj mu liczbę iteracji-s
. Jeśli nie jest to pożądane, pamiętaj o przekierowaniu stdout pętli na/dev/null
. Oto przykład pokazujący to podejście .Możesz użyć
zenity
do stworzenia prostych okien dialogowych GTK. Jedną z dostępnych opcji jest okno dialogowe paska postępu.Takie okno tworzysz za pomocą
zenity --progress
. Aby było to przydatne, należy podać więcej informacji, dodając niektóre z poniższych opcji (fragment zman zenity
):Istnieją dwa tryby:
pulsuje : pasek postępu pulsuje, po prostu wskazuje, że coś działa, ale nie mówi nic o postępie. Robisz to, ustawiając
--pulsating
opcję.manual : Musisz przesłać bieżący procent postępu do
zenity
standardowego wejścia polecenia, aby zaktualizować pasek postępu.Przykład tego może wyglądać tak poniżej. Zauważ, że poprzednie polecenia są pogrupowane w podpowłokę, dzięki czemu wszystkie dane wyjściowe są przekierowywane do
zenity
okna dialogowego, a nie tylko ostatniego polecenia:źródło
[ ###########--------------] 52%
Ten kod to zrobi i nie wymaga niczego (oczywiście oprócz bash). Drukuje
#
znaki, tak jak prosiłeś w swoim komentarzu:Jeśli jednak masz dużo do sprawdzenia, spowoduje to wypełnienie ekranu
#
znakami. Aby rozwiązać ten problem, wypróbuj ten kod:Zmień 5 w pierwszym wierszu (
lenProgressBar=5
) na długość, która ma być na pasku postępu. Wydrukowanie#
znaku z paskami postępu o mniejszej długości potrwa dłużej niż z pasami o większej długości, ale nie pozwól, aby długość paska postępu przekroczyła rozmiar ekranu; to nie zadziała dobrze, jeśli to zrobisz. (Nie pozwoli ci to użyć paska postępu wyższego niż liczba sprawdzanych elementów lub niższego niż 1)źródło
tput cols
do wykrycia szerokości okna terminala i odpowiedniego skalowania paska postępu.Oto inne podejście przy użyciu kodów specjalnych Ansi:
źródło