Blinkscript

  • Hi Leute ;)


    Hab ne frage und zwar bin ich ein totaler Neuling ins Sachen Shell und ich will einen Script schreiben, mit dem ich ein LED zum blinken . Nur ich bekomm das nicht hin. :(
    Also ich hab das so gemacht :


    echo "Bitte eingeben"
    read status


    while [ £status = "Stop" ]
    do
    gpio write 0 1
    break 0.5
    gpio write 0 0
    done


    wenn ich das jetzt starte, kommt so : 8:not found oder so also das kommt mit anderen zahlen auch noch. Und am Schluss steht dann exept do oder so...
    Bitte helft mir und das £-Zeichen sollte Dollar sein ;) sry bin mit dem Handy on...

  • Die genaue Fehlermeldung waere hilfeich. Oder Du machst einfach folgendes:

    Code
    script
    myScript
    exit


    myScript ist Dein Scriptaufruf. Dann kannst Du die Datei transcript hier im Forum in code Tags posten.

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Wo sollte ich das eingeben? Sry kenn mich nicht gut aus...


    Wie führe ich das Script dann eig. aus? Also ich wechsle in das Verzeichnis wo es liegt und dann mach ich "sh Dateiname. sh"

  • Das ist der Code vom script


    Und das ist die Fehlermeldung dazu


    Code
    sh blinken.sh
    : not found 2: blinken.sh:
    Bitte eingeben
    Stop
    : bad variable name: status
    : not found 5: blinken.sh:
    blinken.sh: 12: blinken.sh: Syntax error: end of file unexpected (expecting "do" )
  • Hallo MrDaande,


    da ich ehrlichgesagt das Script für ungeeignet halte - es wird nur einmal der String eingegeben und die Endlosschleife lässt sich nicht mehr über das Skript beenden - habe ich ein Beispiel erstellt welches dir weiterhelfen sollte.


    Bash
    #!/bin/sh
    
    
    while [ "${status}" != "Stop" ]
    do
      echo "Bitte eingeben"
      read status
    done


    Wenn in der Variable $status das Abbruchkriterium stehen soll (so wie es bei dir der Fall ist), dann sieht die Bedingung wie folgt aus.


    Code
    while [ "${status}" = "Stop" ]


    Gruß Georg

  • Es geht nicht...


    Code vom Script so wie du mir es gesagt hast:


    Bash
    #!/bin/sh
    
    
    while [ "${status}" = "Stop" ]
    do
      echo "Bitte eingeben"
      read status
    done


    Und dann kommt das:


    Code
    sh blinken.sh
    : not found 2: blinken.sh:
    blinken.sh: 7: blinken.sh: Syntax error: "done" unexpected (expecting "do")



    Aber danke schonmal für den Versuch ;)

  • Hallo MrDaande,


    Quote

    Code vom Script so wie du mir es gesagt hast:


    Hast du nur ein einziges Mal das Script so ausgeführt wie ich es oben gepostet habe?


    Warum dein Skript mit einem Syntaxfehler beendet wird kann ich nicht ganz nachvollziehen. Aber dein Skript wird auch nicht viel machen. Es wird überprüft ob die Variable $status den String "Stop" enthält. Da die Variable noch gar nicht existiert und schon gar nicht "Stop" enthält schlägt die Prüfung fehl und das Skript wird ohne irgendwas zu machen beendet.


    Hast du das Skript abgetippt oder per Copy&Paste auf den Raspberry Pi übertragen?


    Gruß Georg

  • Ich hab den Code per Copy&Paste eingefügt.


    Also soll ich am Anfang


    Code
    status = "Stop"


    schreiben ?

  • Hallo MrDaande,


    und was wird das Skript machen wenn du das an den Anfang schreibst?


    An deiner Stelle würde ich das bereits als funktionierend getestete Skript 1:1 auf den Raspberry Pi ausprobieren. Wenn das auch bei dir funktioniert können wir Änderungen vornehmen. Da bei dir aber für mich nicht nachvollziehbare Syntaxfehler kommen, will ich gar keine Zeit reinstecken wenn es bereits an einem anderen Punkt scheitert.


    Gruß Georg

  • Ich habe diesen Code :

    Bash
    #!/bin/sh
    
    
    while [ "${status}" = "Stop" ]
    do
      echo "Bitte eingeben"
      read status
    done


    1:1 kopiert und als .sh gespeichert. Danach bin ich auf meinem Pi in das Verzeichnis gegangen und hab eingegeben sh blinken.sh


    Danach kam diese Fehlermeldung :


    Code
    sh blinken.sh
    : not found 2: blinken.sh:
    blinken.sh: 7: blinken.sh: Syntax error: "done" unexpected (expecting "do")


    Ich weiß auch nicht was da nicht stimmt.

    Edited once, last by MrDaande ().

  • So wie ich das sehe liegen hier mehrere Probleme vor:


    1) Du hast wohl irgendeine andere Shell als die bash bei Dir. Bei mir lief es auf meiner Raspberry mit dem Raspian. Warum benutzt Du die sh und nicht die bash? Zeige mal die Ausgabe von

    Code
    echo $SHELL


    Ändere einfach überall sh in bash bei Dir (Im Script wie beim Aufruf)


    2) Die Semantik des kleinen Script soll wohl sein, dass - solange kein Stop eingegeben wird immer am gpio etwas ein- und ausgeschaltet werden soll. Jedenfalls errate ich das aus dem Namen des Scripts. Deshalb gibt es mehrere Dinge die im Code nicht richtig sind:
    a) Das read muss innerhalb der Schleife vorgenommen werden, denn nur so kann geprüft werden beim blinken ob abgebrochen werden soll
    b) Das break muss durch ein sleep ersetzt werden mit Anzahl Sekunden zu schlafen als Parm. Break würde die loop beenden - Du willst aber einfach 0.5 Sekunden schlafen
    c) Da das read leider auf einen Input wartet geht das mit sleep nicht. Es gibt aber einen Timeout Parameter in der bash für read - mit dem man das erschlagen kann


    Ich habe die Semantik mal in Code gegossen und hoffe dass ist was Du suchst (Da ich gpio nicht haben habe ich an dessen Stelle ein echo eingebaut):

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

    Edited once, last by framp ().

  • mach doch mal ein 'chmod 755 blinken.sh' und starte das dann mit './blinken.sh'


    /bin/sh ist nur ein Link auf /bin/dash, der Debian Almquist shell die sich bei Scripts anders benimmt als die bash.
    wenn Du das Script mit 'sh ./script' ausführst wird es explizit in dieser Shell ausgeführt. Beim Start mit './script' bleib die Bash beim Shebang #!/bin/sh in der Bash und das Script verhält sich anders. Eklig sowas.
    Wenn Du für Deine Scripts '#!/usr/bin/env bash' als Shebang benutzt sollte das überall gleich funktionieren.


    € zu langsam ...

    Edited once, last by orb ().

  • Hallo MrDaande,


    ein letzter Versuch. Du erstellst jetzt auf deinem Raspberry Pi mit dem folgenden Befehl eine neue Datei.


    Code
    nano testscript.sh


    In diese Datei fügst du per Copy&Paste den folgenden Code ein. Du wirst daran keine Änderungen vornehmen.


    Bash
    #!/bin/sh
    
    
    while [ "${status}" != "Stop" ]
    do
      echo "Bitte eingeben"
      read status
    done


    Anschließend rufst du den folgenden Befehl auf.


    Code
    /bin/sh testscript.sh


    Und jetzt ist die Frage ob du da auch einen Syntaxfehler bekommst oder nicht. Ich habe das Skript bei mir mit dem Raspbian Image vom 09.02.2013 getestet und da funktioniert es ohne Probleme. Auch dein Skript funktioniert bei mir ohne Fehlermeldung - es passiert logischerweise nichts.


    Welches Image verwendest du für deine Tests? Ich vermute dein Problem liegt nicht am Skript sondern an etwas anderem.


    Gruß Georg

  • Was hast Du geändert?

    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Hast Du die Woche schon Deine Raspberry gesichert =O Bei mir tut das raspiBackup automatisch ;)

  • Ich hab das so gemacht wie du das gesagt hast also mit nano usw.
    [hr]
    sry...hab dich verwechseld. Also ich habs so wie Boandskramer gesagt hat und so hats dann funktioniert

    Edited once, last by MrDaande ().