Eingänge abfragen

  • Hallo,
    ich möchte ein Script erstellen, dass mehrere Eingänge abfragt, und entsprechende Befehle dann abarbeitet.

    Mein Problem ist, das in der Schleife immer nur der oberste Wert (if [ $pin3 = "0" ] Taster1) überprüft wird. Wie muss das Script aussehen damit auch die "elif" Anweisungen überprüft werden?
    Danke!

    Einmal editiert, zuletzt von stefan-dd (19. November 2015 um 12:25)

  • Hallo,
    wenn du alle Eingänge abfragen willst ist "elif" der falsche Weg. Wie "elif" schon sagt wird der erste Eingang deiner If Anweisung überprüft und falls dieser eine 0 hat wird diese If Anweisung verlassen und er überprüft die anderen nicht mehr. Nur falls der erste Eingang keine 0 hat würde der zweite überprüft werden usw.
    elif sagt nur falls die Bedingung in der Klammer der letzten If Abfrage nicht zutrifft versuche den nächsten.
    Du müsstest für jeden Eingang eine seperate If- Anweisung schreiben und diesen überprüfen.

    Grüsse

    Einmal editiert, zuletzt von Dibbelschisser (19. November 2015 um 12:36)

  • Du hast mehrere "previous" Variablen. Jede nachfolgende überschreibt die vorherige.

    "if" überprüft eine Bedingung. Ein nachfolgendes "elif" wird dann, und nur dann, ausgeführt wenn die vorherige Bedingung nicht Zutraf.
    Zum Beispiel:

    Code
    a=1
    
    
    if [ $a = 1 ]; then
        echo a ist 1
    elif [ $a = 2 ]; then
        echo a ist 2
    else
        echo nein
    fi

    In diesem Fall würde immer nur "a ist 1" ausgegeben werden da die erste Bedingung zutrifft.
    Ändert man das jetzt aber ab:

    Code
    a=2
    
    
    if [ $a = 1 ]; then
        echo a ist 1
    elif [ $a = 2 ]; then
        echo a ist 2
    else
        echo nein
    fi

    Würde immer "a ist 2" ausgegeben werden, also die erste Bedingung trifft nicht zu aber die zweite (elif) schon.
    Würde man jetzt den Wert der Variable "a" auf 3 ändern würde keiner der Bedingungen zutreffen und er würde "nein" ausgeben.

    Verstanden :huh:

    Davon abgesehen solltest du in deinem Script auch noch einbauen ob ein GPIO überhaupt gesetzt wurde. Sonst bekommst du Fehlermeldungen wenn das nicht der Fall ist, denn dann gibt es keine Dateien ala /sys/class/gpio/gpio13/value

    Ich versteh aber auch noch nicht so richtig was du allgemein bezwecken willst :s


    PS: Korrekte Einrückungen sind Gold wert und erleichtern das lesen sowie verstehen des Codes enorm. Ist für bash zwar nicht notwendig aber solltest du dir unbedingt von Anfang an angewöhnen :fies:

  • Das kommt darauf an was du erreichen willst :D

    Also dein Code als Vorlage, mit dem Ziel für jeden GPIO eine Ausgabe zu erhalten, könnte wie folgt aussehen:

    Das ist aber relativ unübersichtlich und ließe sich auch als Einzeiler pro GPIO lösen. Dazu muss man dann nur wissen das man "if" und "then" sowie "fi" auch weglassen kann. Falls die Bedingung zutrifft nutzt man statt des "then" dann "&&" und falls die Bedingung nicht zutrifft nutzt man "||".
    "&&" steht für "und".
    "||" steht für "oder".

    Desweiteren ist hilfreich das man mehrere Befehle durch " ; " aneinander reichen kann ohne auf den Erfolg des vorherigen achten zu müssen. Möchte man stattdessen aber erreichen das der nachfolgende Befehl nur ausgeführt wird wenn der vorherige erfolgreich war, nutzt man ebenfalls " && ".

    Also, kürzere Alternative:

    Und noch eine Möglichkeit wäre auch:

    Code
    # Endlose Schleife
    while true; do
        [ $(cat /sys/class/gpio/gpio4/value) = "0" ] && echo "Taster3 ist 0" || echo "Taster3 ist 1"
        [ $(cat /sys/class/gpio/gpio3/value) = "0" ] && echo "Taster2 ist 0" || echo "Taster2 ist 1"
        [ $(cat /sys/class/gpio/gpio2/value) = "0" ] && echo "Taster1 ist 0" || echo "Taster1 ist 1"
        sleep 0.5
    done


    Wenn du aber den aktuellen Zustand später noch mal verwenden willst, wäre es besser den Wert ein mal auszulesen und in eine Variable zu schreiben - also so wie du es bereits gemacht hast.


    //EDIT: Bitte nicht Beiträge vollständig Quoten, vor allem wenn diese genau da drüber stehen. Bitte bearbeite deinen Beitrag#4 und lösch den vollständigen Quote. Als ich diesen Beitrag schrieb existierte der Quote zudem noch nicht..
    Aber nein, Deine Variante sieht nicht nur anders aus sondern bewirkt auch etwas anderes. Es gibt kleine aber wichtige Unterschiede.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!