Aufrufzähler für Bash Skript gesucht

Hinweis: In dem Thema Aufrufzähler für Bash Skript gesucht gibt es 3 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Hallo,


    ich habe mir ein Backup Skript gebastelt mit dem ich nun regelmässig mein home Verzeichnis und einige weitere Verzeichnisse auf eine im Rechner eingebaute zweite Festplatte sichere. Nun möchte ich eine Erweiterung einbauen damit bei jedem n-ten Aufruf des Skripts noch ein paar weitere Aktionen durchgeführt werden, z.B. bei jedem vierten Aufruf zusätzlich Kopie der Sicherung auf eine externe Festplatte.
    Als Neuling habe ich jetzt aber keine Vorstellung wie ich das in dem Bash Skript realisieren kann dass es erkennt zum wievielten Male es läuft. Für Tipps bin ich dankbar.


    Gruß, Erich

    Für den Inhalt des Beitrages 89380 haftet ausdrücklich der jeweilige Autor: erich_s

  • Du könntest ein log-File schreiben, und dort den Zähler hinterlegen. Das Auslesen, Inkrementieren und Sichern des Zähler könnte etwa so aussehen:

    be tolerant - not ignorant
    Alle Hunde sind schwarz.
    Es gibt einen Hund der nicht weiß ist.

    Für den Inhalt des Beitrages 89415 haftet ausdrücklich der jeweilige Autor: Boreas

  • Die Idee ist richtig. Die Ausführung will verbessert sein.
    Mit IFS=. setzt man den IneternalFieldSeparator auf einen wörtlichen Punkt.
    Das ist ein wenig ungeschickt, wenn man mit Pfaden und Datumstrings arbeitet.
    Dort kommen öfter Punkte vor.


    Das date -R liefert einen ähnlichen String, wie: Wed, 23 Dec 2015 16:21:34 +0100
    Bei vielen anderen Ausgaben wäre man damit auf genau dieses Format festgelegt, (und wird nicht darauf hingewiesen).
    In diesem Falle:

    IFS=. read l i <"$LOG"


    klappt das nur deshalb, weil der Punkt nach Aufruf-Nr. als Trenner verwendet wird.


    Wenn man das gleiche nun mit dem deutschen Datum macht, wird es gefährlich falsch:
    (ich gebe das hier explizit an, meist wird einfach die LOCALE oder LANG schon dafür sorgen)

    Code
    echo "Aufruf am $(date +"%d. %m. %Y %H:%M"), Aufruf-Nr.$i" > $LOG
    IFS=. read l i <"$LOG"
    echo $l $i   # sieht fast korrekt aus, ist es aber nicht
    
    
    echo i ist jetzt : $i
    echo l ist jetzt : $l  # öha!!


    Der read [--options] var1 var2 liest seine Eingabe in die beiden Variablen var1 und var2 ein. In var1 landet der String bis zum ersten IFS - Zeichen, und in var2 steht dann der GANZE Rest der Zeile.


    Es ist viel sicherer schlicht den Zähler am Anfang der Zeile zu stellen, und dann den Aufrufzeitpunkt hinzumalen.

    Code
    echo $i Aufruf am $(date +"wurscht welches Format %s") > $LOG

    Damit braucht man auch IFS nicht ändern, was man immer tun sollte, wenn es gar nicht anders geht. Meist ist das ein Zeichen, dass man seinen Code überdenken sollte, bis man eine gute Lösung gefunden hat.


    Wenn man auf diese Art Werte liest, sollte man immer sicherheitshalber Dummies verwenden:
    read var1 var2 dummy Damit landet ein evtl. den beiden zu lesenden Werten folgender Rest in der Variable dummy, die man dann untersuchen oder vergessen kann.


    Außerdem sollte man diese Datei nicht unbedingt ein Log nennen.
    Es gehört eher in eine Konfig- Datei. Der Wert steuert ja die Ausführung.
    Der obige Code wird in dieser Datei immer nur diese eine Zeile stehen haben, da die Datei bei jedem Aufruf überschrieben wird. (Die Umlenkung > überschreibt; >> fügt an )


    Will man das in einer Conf- Datei haben, wo sich ja letztlich mehr Einträge finden werden, geht es darum nur diese Zeile zu lesen und zu schreiben. Dafür eignet sich sed

    Für den Inhalt des Beitrages 89419 haftet ausdrücklich der jeweilige Autor: LinuPia

  • erich_s
    ... und noch ein wirklich guter Rat: Komm am Dienstag einfach mal hier vorbei. Das ist wirklich eine prima Sache.

    be tolerant - not ignorant
    Alle Hunde sind schwarz.
    Es gibt einen Hund der nicht weiß ist.

    Für den Inhalt des Beitrages 89420 haftet ausdrücklich der jeweilige Autor: Boreas