[fli4l] Hilfe für Skript-Logik

Thomas Grunenberg tho_gru at gmx.de
Mi Feb 22 20:01:12 CET 2017


Am 22.02.2017 um 16:58 schrieb K. Dreier:
> Hallo,
>
>> So viel Code mit IF die Hintereinander aufgerufen werden. Wie willst
>> Du
>> das in ein paar Wochen verstehen
>
> Habe es ja kommentiert. ;-)
>
>> oder gar warten? Das sieht sehr
>> kompliziert aus, so kompliziert, dass ich gar nicht verstehen kann,
>> ob
>> es richtig ist.
>
> Das finde ich nun wirklich nicht sehr kompliziert, aber ich verstehe
> natürlich auch, was ich will. Heisst nicht, daß ich es richtig gemacht
> habe. :-)
>
>> Nehmen wir einmal an, es gibt einen Signal (in Deinem Fall das
>> Device,
>> welches On- oder Offline ist) das zwei Zustände hat: 0 oder 1.
>
> Richtig.
>
>> Das
>> "Problem" bei diesem Signal ist, das es jede 30 Sekunden für eine
>> halbe
>> Sekunde invertiert wird. Was nutzt es Dir, in so einer Situation
>> alle 15
>> Sekunden zu schauen welchen Wert Du bekommst? Du weißt ja nie, ob
>> Du
>> genau in einer von den vielen halben Sekunden "misst", in der das
>> Signal
>> invertiert ist.
>
> Da hast du natürlich recht. Und ich meine sogar, bereits 2x in den
> Output file rein geschaut zu haben und er war leer! Das wäre dann genau
> so eine Situation. Denn ca. 3 Sekunden später (raus und wieder rein),
> war ein Inhalt vorhanden.
>
>> Deswegen solltest Du bei so einem Signal Deine Messung
>> sinnvoll ausweiten, z.B.: In einem Messzeitraum von 5 Sekunden haben
>> ich
>> 10 Messungen durchgeführt, bei denen 9 eine 1 ergeben und eine
>> Messung
>> eine 0 ergeben haben. Deswegen sage ich: "Meine Messung hat 1
>> ergeben"
>
> Gut, leuchtet mir absolut ein.
>
> Also deswegen nun mein Versuch zu verstehen, was du geschrieben hattest.
> Gerne bitte korrigieren. :-)
>
> #!/bin/sh
> file_to_check=/tmp/x1
>
>  check_existance() { # definiere ein leeres Array, welche in Folge
> "gefüllt" wird
>
Hier wird die FUNKTION check_existance definiert (bis zum }-Zeichen)
>  local i # erstelle Variable "i"
>
>  local check # erstelle Variable "check"
>
>  local checks # erstelle Variable "checks"
local <variablen name> definiert eine Variable lokal innerhalb einer 
Funktion. D.h. falls Du außerhalb der Funkion (in diesem Fall 
check_existance) die Variablen i, check oder checks verwendest, ändern 
sich die Werte der Variablen außerhalb nicht durch den Funktionsaufruf
>
>  i=3 # setze Variable i auf Wert "3"
i ist der Schleifenzähler und mit dem Wert 3 wird die Schleife 3 mal 
durchlaufen
>
>  checks=0 # setze Variabe checks auf Wert "0"
checks enthält am Ende der Funktion die Summe alle Pürfungen
>
>  while test "${i}" -gt 0; do # wenn und solange Variable i größer als
> 0 ist, mache das danach folgende; wir starten also eine Schleife
Richtig. Das hier ist der Anfang der Schleife
>
>  check=$(grep -c -i "100% packet loss" "${file_to_check}") # wir
> definieren den Wert der Variable "check", hier gegen den Inhalt meines
> files, welcher je nach ping-Ergebnis befüllt ist
Hier wird die eigentliche Pürfung durchgeführt und das Ergebnis in der 
Variablen check gespeichert
>
>  checks=$(expr ${checks} + ${check}) # wir definieren den (neuen) Wert
> der Variable "checks"; hier den Wert von "check" (0 oder 1) plus den
> Wert von "checks"; bis da hin war "checks" = 0, d.h. das Ergebnis wäre
> in der ersten Runde 1, davon ausgehend, daß das Ergebnis der Variable
> "check" 1 ergab - korrekt?
Hier wird die Summe aus den Werten von checks und check errechnet und 
der Variablen checks zugewiesen.
>
>  i=$(expr ${i} - 1) # wir definieren den (neuen) Wert der Variabe "i";
> hier subtrahieren wir den Wert 1 vom bisherigen Wert der Variable "i";
> bis dahin war das der Wert 3 im ersten Durchlauf. Im Ergebnis also nun 2
> als neuer Wert für Variable "i" nach dem ersten Durchlauf.
Hier wird der Schleifenzähler (Variable i) um eins reduziert
>  sleep 1
Eine Sekunde warten
>  done # Ende der Schlaufe
>  echo ${checks}
Das Ergebnis (die Summe aller Prüfungen) auf stdout ausgeben
>  } # das Array wurde definiert mit einem neuen Wert für "i" und
> "checks"; es wurde also 3x mein file abgefragt (= "check"); als Ergebnis
> also haben wir Werte von 0 bis max 3 für den Wert des Arrays, korrekt?
Hier ist das Funktionsende
>
>  exists=$(check_existance) # exists (= meine Variable anhand derer ich
> in meinem Skript anschliessend Zustand definiere/prüfe) wird auf den
> Wert des Arrays "check_existance" gesetzt, nachdem die Schlaufe zu einem
> Ende kam. Also 0-3, siehe zuvor.
Aufruf der Funktion check_existance und Zuweisung der Ausgabe (von 
stdout) an die Variable exists
>
> Habe ich das richtig verstanden?
Ein bisschen ;-) Siehe meine Kommentare oben
>
> Gruß
> Klaus
>
Gruß
Thomas



Mehr Informationen über die Mailingliste Fli4L