Ich brauchte eine Fortschrittsanzeige, die in einer Popup-Benachrichtigungsnachricht (notify-send
) passt, um den TV-Lautstärkepegel darzustellen. Vor kurzem habe ich einen Musikplayer in Python geschrieben und das TV-Bild ist die meiste Zeit ausgeschaltet.
Beispielausgabe aus dem Terminal
![test_progress_bar3.gif]()
Bash-Skript
#!/bin/bash
# Zeigt eine Fortschrittsanzeige bei Schrittnummer $1 (von 0 bis 100)
function is_int() { test "$@" -eq "$@" 2> /dev/null; }
# Parameter 1 muss eine ganze Zahl sein
if ! is_int "$1" ; then
echo "Keine ganze Zahl: ${1}"
exit 1
fi
# Parameter 1 muss >= 0 und <= 100 sein
if [ "$1" -ge 0 ] && [ "$1" -le 100 ] 2>/dev/null
then
:
else
echo Ungültige Lautstärke: ${1}
exit 1
fi
# Hauptfunktion, die für schnelles Kopieren in ein anderes Programm entwickelt wurde
Main () {
Bar="" # Fortschrittsanzeige / Lautstärkepegel
Len=25 # Länge der Fortschrittsanzeige / Lautstärkepegel
Div=4 # Teiler in die Lautstärke für # der Blöcke
Fill="" # Auffüllen bis $Len
Arr=( "" "" "" "" ) # UTF-8 linken Blöcke: 7/8, 1/4, 1/2, 3/4
FullBlock=$((${1} / Div)) # Anzahl voller Blöcke
PartBlock=$((${1} % Div)) # Größe des teilweisen Blocks (Arrayindex)
while [[ $FullBlock -gt 0 ]]; do
Bar="$Bar${Arr[0]}" # Fügt eine vollständige Block in die Fortschrittsanzeige ein
(( FullBlock-- )) # Zähler für volle Blöcke verringern
done
# Wenn Rest null ist, kein teilweiser Block, sonst Zeichen aus Array anhängen
if [[ $PartBlock -gt 0 ]]; then
Bar="$Bar${Arr[$PartBlock]}"
fi
while [[ "${#Bar}" -lt "$Len" ]]; do
Bar="$Bar$Fill" # Fortschrittsanzeige mit Füllzeichen auffüllen
done
echo Lautstärke: "$1 $Bar"
exit 0 # Diese Zeile entfernen, wenn sie in ein Programm kopiert wird
} # Main
Main "$@"
Test Bash-Skript
Verwenden Sie dieses Skript, um die Fortschrittsanzeige im Terminal zu testen.
#!/bin/bash
# test_progress_bar3
Main () {
tput civis # Cursor ausschalten
for ((i=0; i<=100; i++)); do
CurrLevel=$(./progress_bar3 "$i") # Fortschrittsanzeige von 0 bis 100 generieren
echo -ne "$CurrLevel"\\r # Über dem gleichen Zeile erneut drucken
sleep .04
done
echo -e \\n # Zeile weitermachen, um den letzten Fortschritt beizubehalten
echo "$0 Fertig"
tput cnorm # Cursor wieder einschalten
} # Main
Main "$@"
Zusammenfassung
in diesem Abschnitt wird erläutert, wie notify-send
verwendet wird, um schnell Popup-Benachrichtigungsnachrichten auf den Desktop zu senden. Dies ist erforderlich, da sich der Lautstärkepegel viele Male pro Sekunde ändern kann und das Standardverhalten der Bubble-Nachrichten ist, dass eine Nachricht viele Sekunden auf dem Desktop bleibt.
Beispiel Popup-Benachrichtigungsnachricht
![tvpowered.gif]()
Bash-Code für Popup-Benachrichtigungsnachricht
Aus dem obigen Skript wurde die main
-Funktion in eine neue Funktion namens VolumeBar
in einem vorhandenen Bash-Skript namens tvpowered
kopiert. Der Befehl exit 0
in der kopierten main
-Funktion wurde entfernt.
So wird es aufgerufen und der notify-send
-Befehl von Ubuntu darüber informiert, dass wir Popup-Benachrichtungsnachrichten senden werden:
VolumeBar $CurrVolume
# Ask Ubuntu: https://askubuntu.com/a/871207/307523
notify-send --urgency=critical "tvpowered" \
-h string:x-canonical-private-synchronous:volume \
--icon=/usr/share/icons/gnome/48x48/devices/audio-speakers.png \
"Lautstärke: $CurrVolume $Bar"
Dies ist die neue Zeile, die notify-send
angibt, die letzte Popup-Benachrichtigungsnachricht sofort zu ersetzen:
-h string:x-canonical-private-synchronous:volume \
volume
gruppiert die Popup-Benachrichtigungsnachrichten zusammen und neue Nachrichten in dieser Gruppe ersetzen sofort die vorherigen. Anstelle von volume
können Sie auch anything
verwenden.
0 Stimmen
Siehe auch stackoverflow.com/questions/12498304/… für Beispiele der Kontrolllogik (Hintergrund einer Aufgabe und etwas tun, bis sie beendet ist).
4 Stimmen
Es gibt eine Reihe von Anforderungen, die wir beim Skripten häufig nützlich finden. Protokollierung, Anzeige des Fortschritts, Farben, schicke Ausgaben usw... Ich habe immer das Gefühl gehabt, dass es irgendeine Art von einfachem Skript-Framework geben sollte. Schließlich habe ich beschlossen, eines zu implementieren, da ich keines finden konnte. Möglicherweise finden Sie dies hilfreich. Es ist rein Bash, ich meine nur Bash. github.com/SumuduLansakara/JustBash
0 Stimmen
Sollte dies nicht verschoben werden nach unix.stackexchange.com?
0 Stimmen
Ich benutze gerne
pv
für alles, was gepiped werden kann. Beispiel:ssh remote "cd /home/user/ && tar czf - accounts" | pv -s 23091k | tar xz