LINUXFILES.de

Terminplaner mit Bash und Zenity

| 12 Kommentare

In diesem Artikel möchte ich meinen einfachen Terminplaner vorstellen. Er speichert Termine über eine Combobox in einer CSV Datei. Die Daten können nach Datum Suchbegriff oder komplett aufgelistet und auch wieder gelöscht werden. Das editieren der Daten ist über einen Editor oder Open Office möglich.

Das Script arbeitet mit Zenity Version 3.4.0 (im Ubuntu 12.04 Repository enthalten).

 

Terminplaner einrichten:

Im Ordner HOME einen Ordner mit dem Namen „terminator“ anlegen, das Script darin unter „terminator.sh“ speichern und ausführbar machen. Im Scriptordner einen Unterordner mit dem Namen „TERMINE“ anlegen.

Mit einem Editor eine neue Datei mit dem Namen „count“ im Ordner „TERMINE“ erstellen. In die Datei einfach den Wert 0 eintragen. Terminator nutzt diese Datei zum erstellen von IDs für die einzelnen Einträge. Anhand der IDs wird später die Suche ausgewertet.

 

Jetzt sollte das Programm mit Doppelklick und „Ausführen“ gestartet werden können. Natürlich kann der Terminplaner auch in einen anderen Ordner verlegt werden, dafür müssen dann die Pfade im ersten Teil des Scripts geändert werden.

 

#Programm:     Terminplaner
#Beschreibung: Ein einfacher Bash Terminplaner mit Zenity Dialogen
#Autor:        Karsten Weidenfeld
#Webseite:     www.Linuxfiles.de
 
sfolder=$HOME/terminator/TERMINE
tdata=$HOME/terminator/TERMINE/termine.csv
count=$HOME/terminator/TERMINE/count 
 
menue() {
auswahl=$(zenity --list --radiolist --width=500 --height=280 --hide-column="2" --text "Hauptmenü" --cancel-label="Terminator beenden" --title "Terminator (writen by K.Weidenfeld) Linuxfiles.de" --column="" --column Punkt --column "Bitte treffen Sie eine Auswahl" \
\"\" "showterm"			"Übersicht alle Termine" \
\"\" "showdate"			"Termine nach Datum filtern" \
\"\" "shows"			"Termine nach Suchbegriff filtern" \
\"\" "newterm"			"Einen neuen Termin eintragen" \
)
if [ $? = "1" ] ; then exit 1 ; fi
if [ -z "$auswahl" ]; then
  zenity --error --text="Sie müssen eine Auswahl treffen!" >&2
  menue ; else
$auswahl
fi
}
 
newterm() {
export id=$(cut -d ";" -f "1" $count)
idup=$(echo "$id+1" | bc -l)
echo "$idup" > $count
termin=$(zenity --forms --title="Terminator" --text="Einen neuen Termin anlegen" --separator=";" --add-entry="Termin" --add-calendar="Datum" --add-entry="Uhrzeit" --add-entry="Dauer")
echo "id0'$idup'term;$termin" >> "$sfolder/termine.csv"
menue
}
 
showterm() {
term=$(awk -F ";" '{print $1"\n"$2,"\n"$3,"\n"$4,"\n"$5}' $tdata | zenity --list --hide-column=1 --column "ID" --column "Termin" --column "Datum" --column "Uhrzeit" --column "Dauer" --title="Terminator (powered by www.Linuxfiles.de)" --ok-label="Termin löschen" --cancel-label="Hauptmenü" --text="Termine Übersicht" --separator=";" --print-column="1" --width=600 --height=300)
if [ $? = "1" ] ; then menue ; fi
if [ -z "$term" ]; then
  zenity --error --text="Sie müssen eine Auswahl treffen!" >&2
  showterm ; else
delterm
fi
}
 
delterm() {
zenity --question --width=800 --title="Terminator (powered by www.Linuxfiles.de)" --text="Sind Sie sicher?
Der Termineintrag wird unwiederuflich gelöscht!"
if [ $? = "1" ] ; then showterm ; fi
grep -v  "$term" "$tdata" > "tempdatei"
mv "tempdatei" "$tdata"
showterm
}
 
showdate() {
terms=$(zenity --calendar)
if [ $? = "1" ] ; then menue ; else
grep -F "$terms" "$tdata" | cut -d ";" -f "1-5" > $sfolder/stemp.csv
termtmp=$(awk -F ";" '{print $1"\n"$2,"\n"$3,"\n"$4,"\n"$5}' $sfolder/stemp.csv | zenity --list --hide-column=1 --column "ID" --column "Termin" --column "Datum" --column "Uhrzeit" --column "Dauer" --title="Terminator (powered by www.Linuxfiles.de)" --ok-label="Datum neu wählen" --cancel-label="Hauptmenü" --text="Termine Übersicht" --separator=";" --print-column="1" --width=600 --height=300) ; fi
if [ $? = "1" ] ; then rm $sfolder/stemp.csv ; menue ; else showdate ; fi
}
 
shows() {
terms=$(zenity --entry --text="Bitte geben Sie ein Suchwort ein:")
if [ $? = "1" ] ; then menue ; fi
if [ -z "$terms" ]; then
  zenity --error --text="Sie müssen eine Auswahl treffen!" >&2
  shows ; else
grep -Fi "$terms" "$tdata" | cut -d ";" -f "1-5" > $sfolder/stemp.csv
idtemp=$(grep -Fi "$terms" "$tdata" | cut -d ";" -f "1")
termtmp=$(awk -F ";" '{print $1"\n"$2,"\n"$3,"\n"$4,"\n"$5}' $sfolder/stemp.csv | zenity --list --hide-column=1 --column "ID" --column "Termin" --column "Datum" --column "Uhrzeit" --column "Dauer" --title="Terminator (powered by www.Linuxfiles.de)" --ok-label="Neue Suche" --cancel-label="Hauptmenü" --text="Termine Übersicht" --separator=";" --print-column="1" --width=600 --height=300) ; fi
if [ $? = "1" ] ; then rm $sfolder/stemp.csv ; menue ; else shows ; fi
}
 
menue

 

Autor: Karsten Weidenfeld

Hallo, ich bin Karsten - Auf Linuxfiles.de schreibe ich speziell zum Thema Linux. Einer meiner Lieblingsbeschäftigungen ist das experimentieren und schreiben von Shellscripten. Neben Tips, Tricks und Tutorials habe ich bereits zahlreiche Shellscripte im Blog veröffentlicht.

12 Kommentare

  1. Hi, schaut nach einem schönen kleinen Script für kleinere Planungen aus ;).

    Aber ist dir bekannt das „Terminator“ ein recht bekannter Terminal-Emulator unter Linux ist?
    http://software.jessies.org/terminator/
    Könnte ein paar Probleme bei der Suche nach deinem Projekt geben.

  2. Es gibt bereits eine Shell die Terminator heißt, deswegen ist der Name etwas unglücklich gewählt

  3. Der Name ist vielleicht ungünstig… Es gibt schon 2 Terminal Emulatoren die so heissen.

    http://software.jessies.org/terminator/ – Java
    http://www.tenshu.net/p/terminator.html – Python (auch GNOME Terminator)

  4. Der Name viel mir spontan beim schreiben des Scriptes ein, ist aber kein Problem dann bekommt das Kind einen anderen Namen. Wichtig ist das es funktioniert und der ein oder andere vielleicht Verwendung dafür hat.

  5. Ja da könntest Du recht haben bei der Suche kann es tatsächlich Schwierigkeiten geben, daran habe ich nicht gedacht.

  6. Vielleicht überlegst du dir noch einen neuen Namen: http://wiki.ubuntuusers.de/Terminator
    Und was vielleicht auch interessant ist: Taskwarrior (http://taskwarrior.org/projects/show/taskwarrior), da gabs auch in den letzten freien Magazinen eine Reihe dazu. Da könnte man z.B. einfach ein paar Zenity-Dialoge drum rum bauen und müsste sich nicht um die „Logik“ kümmern.
    All das soll keine Kritik sein, sondern nur Anregungen liefern. :) Interessantes Projekt!

  7. Du könntest noch ein bisschen am »Wording« arbeiten. Ein paar Vorschläge:

    Übersicht alle Termine → Übersicht aller Termine (Genitiv)
    Sie müssen eine Auswahl treffen → Bitte wählen Sie erst etwas aus / Bitte zuerst etwas auswählen (freundlicher, weniger bürokratisch)
    unwiederuflich → unwiderruflich

    Wie wäre es mit einer Terminbenachrichtigung à la
    echo „notify-send –icon=’/usr/share/icons/Humanity/actions/64/help-about.svg‘ -t 0 Terminator-Erinnerung Ihr\ Termin\ BLABLABLA\ beginnt. | at „$date“ „$zeit“

  8. hi,

    – „terminator beenden“ funktioniert nicht
    – vllt wäre es nicht schlecht mit $0 den momentanen ordner zu bestimmen wo das skript abgespeichert ist, damit man auch die .csv findet.

    ansonsten nettes skript. werde ich weiter verfolgen. :-)

  9. Bei mir kann ich das Programm ganz normal über „Terminator beenden“ schließen. Vielleicht mal die Zenity Version prüfen in der Konsole mit zenity –version das Script benötigt mindestens Zenity 3.4.0

    Über $0 werde ich mal nachdenken, vielleicht wäre eine Auswahlmöglichkeit die CSV mit OpenOffice öffnen zu lassen oder im Ordner anzeigen sinnvoll.

    Danke für Dein Feedback.

  10. Ja der Name ist unglücklich gewählt, da werde ich nochmal drüber nachdenken. Danke für Deinen Tipp, werde ich mir mal anschauen.

  11. Wie peinlich Rechtschreibfehler *schäm* werden natürlich behoben. Die Terminbenachrichtigung werde ich mal auf meine To do Liste setzen, interessanter Vorschlag.

  12. dadu@wks:~> zenity –version
    3.4.0

    selbst das x oben rechts des fenster funktioniert nicht.
    opensuse 12.2

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.

* Copy This Password *

* Type Or Paste Password Here *