Wie kann ich mit bash einen Fortschrittsbalken erstellen?
Das ist mein Drehbuch:
#!/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
Ich möchte durch echo 'loading 50%'
irgendetwas ersetzen , um einen Fortschrittsbalken zu erstellen.
command-line
bash
Schwarzer Falke
quelle
quelle
eta
vielleicht was du willst.Antworten:
whiptail
ist auf Ubuntu und vielen anderen Distributionen vorinstalliert und zeigt Fortschrittselemente im Vollbildmodus (aber immer noch terminalbasiert) an.dialog
ist eine Obermenge vonwhiptail
, daher funktioniert dieses Beispiel mit beiden gleich gut. Es bietet fortgeschrittenere UI-Elemente, so dass es nützlich sein kann, wenn Sie nach Benutzerinteraktionen wie Dateiauswahl und Formularen suchen, aber es hat den Nachteil, dass es auf vielen Systemen nicht vorinstalliert ist.Beachten Sie, dass die Skriptausgabe als Prozentsatz interpretiert wird, sodass Sie möglicherweise Ihre Ausgabe entsprechend anpassen müssen.
Mit Whiptail und Dialog können Sie den Text auch zur Laufzeit über eine eher kryptische Syntax ändern:
pv
Zeigt den Fortschritt einer Datei oder eines Streams an, der durch die Datei geleitet wird. Es kann jedoch nicht (einfach?) Verwendet werden, um den Fortschritt einer benutzerdefinierten Operation wie einer Schleife anzuzeigen. Es wurde speziell für Streams entwickelt.Einige Beispiele aus der
pv
Praxis, die sich als nützlich erweisen:Ich kenne keine Befehle, die einzeilige Fortschrittsbalken im Stil von
pv
oder enthaltenwget
, aber es gibt viele einfache Bash / Perl / sed-Skripte, die diese Funktionalität hinzufügen, wie andere hier geteilt haben.quelle
pv
Ihnen entweder kann es für die Schleife der Ausgabe aussehen lassen oder eine gefälschte Ausgabe erstellen, zB eineecho
in jeder Iteration, eine Pipe anpv
und gibt ihm die Iterationszahlcode mit-s
. Wenn dies nicht erwünscht ist, denken Sie daran, die Standardausgabe der Schleife an umzuleiten/dev/null
. Hier ist ein Beispiel, das diesen Ansatz zeigt .Mit können Sie
zenity
einfache GTK-Dialogfenster erstellen. Eine der verfügbaren Optionen ist ein Fortschrittsbalkendialog.Sie erstellen ein solches Fenster mit
zenity --progress
. Um es nützlich zu machen, sollten Sie weitere Informationen angeben, indem Sie einige der folgenden Optionen hinzufügen (Auszug ausman zenity
):Es gibt zwei Modi:
pulsierend : Der Fortschrittsbalken pulsiert, zeigt nur an, dass etwas läuft, sagt aber nichts über den Fortschritt aus. Dazu setzen Sie die
--pulsating
Option.manuell : Sie müssen den aktuellen Fortschrittsprozentsatz an die
zenity
Standardeingabe des Befehls weiterleiten, um die Fortschrittsanzeige zu aktualisieren.Ein Beispiel dafür könnte wie folgt aussehen. Beachten Sie, dass die vorherigen Befehle in einer Subshell zusammengefasst sind, sodass die gesamte Ausgabe in den
zenity
Dialog und nicht nur in den des letzten Befehls umgeleitet wird :quelle
[ ###########--------------] 52%
Dieser Code wird es tun und erfordert nichts (außer Bash natürlich). Es werden
#
Zeichen gedruckt , wie Sie in Ihrem Kommentar gefragt haben:Wenn Sie jedoch viel zu überprüfen haben, wird dies nur Ihren Bildschirm mit
#
Zeichen füllen . Versuchen Sie diesen Code, um dieses Problem zu beheben:Ändern Sie die 5 in der ersten Zeile (
lenProgressBar=5
) auf die Länge, die Ihre Fortschrittsanzeige haben soll. Es dauert länger, ein#
Schild mit kürzeren Fortschrittsbalken als mit längeren zu drucken. Achten Sie jedoch darauf, dass die Länge des Fortschrittsbalkens die Bildschirmgröße nicht überschreitet. es wird nicht gut funktionieren, wenn du es tust. (Sie können keinen Fortschrittsbalken verwenden, der höher als die Anzahl der überprüften Elemente oder niedriger als 1 ist.)quelle
tput cols
können die Breite des Terminalfensters ermitteln und die Fortschrittsanzeige entsprechend skalieren.Hier ist ein anderer Ansatz, der ansi-Escape-Codes verwendet:
quelle