Anfänger findet Fehler in Miniskript nicht :P

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    ich bin blutiger RPi-Anfänger und weis einfach nicht wo mein Fehler liegt... das Programm soll nur eine LED blinken bzw. 5s leuchten lassen...

    Ich bekomme nach der Benutzereingabe immer die Rückmeldung "syntax error: redirection unexpected (expecting "do")

    Einmal editiert, zuletzt von Aspire (16. November 2014 um 14:56)

  • habs jetzt nicht getestet, aber du hast beim for das do / done vergessen, und es müsste while statt for sein.

    ob i=i+1 funktioniert, bezweifle ich auch :p (aber da findest du über google eine lösung ;))

  • Hallo Aspire,

    magst Du Dich ein wenigmit der Syntax der Sprache auseinandersetzn, in der Du zu programmieren versuchst?

    Bash
    #!/bin/bash
    for i in {1..5}
    do
       echo "Welcome $i times"
    done

    und

    Bash
    #!/bin/bash
                if [ "foo" = "foo" ]; then
                   echo expression evaluated as true
                fi

    waren schon mal zwei Dinge, die mir aufgefallen sind.

    Bei if fehlt das Semikolon - bei for fehlt do/done, wie von der Fehlermeldung angegseben. Und achte ein wenig auf die Einrückung - der Code wird dann sehr schnell viel besser lesbar.

    Gutes Gelingen

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (16. November 2014 um 15:13)

  • Danke, wieder was gelernt, ich bleib dran! ...mit ein bisschen mehr Übung und Zeit bekomme ich das sicher hin, nur finde ich bis jetzt nur wenig verständliche Hilfe im Internet... aber langsam komm ich voran ;)


  • Bei if fehlt das Semikolon

    Ich mag diese Schreibweise zwar nicht, aber wenn man das "then" in die nächste Zeile setzt brauch man kein Semikolon.. Siehe auch http://wiki.ubuntuusers.de/Shell/Bash-Skr…-Else-Anweisung
    Hinter dem "then" darf dann aber auch nichts mehr stehen, oder man setzt dahinter ein Semikolon wie zB "then; gpio -g write 17 1"...

    Was bei seinem Code aber auch nicht passt ist am Ende das "else then" und die von dir erwähnten "for" Fehler

  • Hallo Meigrafd,

    vielen Dank für die Info. Aber mit BASH habe ich es auch nicht so - mir ist da nur einiges sehr komisch vorgekommen, dass ich mal selber in Tutorials hineingeschaut habe - und ein paar ganz offensichtliche Fehler entdeckt habe.

    Aber die Syntax ist schon sonderbar...

    Bei fast allen Sprachen wird mit einem Semikolon ein Befehl abgeschlossen und ggf. ein weiterer in der Zeile eingeleitet.

    Dass manche Schlüsselworte mit einem Semikolon beendet werden und danach noch was kommt, was zu einem Ausdruck gehört, ist schon verwirrend. Insbesondere dann, wenn das Schlüsselwort allein in der Zeile steht. Das macht es einem Anfänger / Einsteiger mit anderen Programmmiersprachenkenntnissen nicht gerade einfach.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Hinter dem "then" darf dann aber auch nichts mehr stehen, oder man setzt dahinter ein Semikolon wie zB "then; gpio -g write 17 1"...

    Das stimmt nicht - vor dem "then" muss ein ';' stehen, nach dem "then" darf keiner stehen!

    Gruß, mmi


  • Das stimmt nicht - vor dem "then" muss ein ';' stehen

    Nein das hast du falsch verstanden mmi.

    Code
    [...]
    elif ["$blinken" == nein]
        then gpio -g write 17 1
        sleep 5
        gpio -g write 17 0
    else  then  echo "undefinierte Eingabe"
    fi

    vor dem "then" muss in Diesem Fall kein ; stehen. Das kannst auch dem von mir angegeben Link entnehmen, dort wird das auch nicht so gemacht da nicht notwendig.


    Ob dir das gefällt oder nicht spielt ja keine Rolle - das sagte ich auch schon btw. Die Schreibweise mit dem "then" in der nächsten Zeile sieht nicht nur blöd aus, es liest sich auch blöd..


  • Hinter dem "then" darf dann aber auch nichts mehr stehen, oder man setzt dahinter ein Semikolon wie zB "then; gpio -g write 17 1"...

    Das funktioniert in Bash NICHT. ;)

    geht:
    if true; then echo "true"; fi;

    geht nicht:
    if true; then; echo "true"; fi;

  • Zitat


    elif ["$blinken" == nein]

    Das nein muß in ""

    Code
    elif ["$blinken" == "nein"]

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

    Einmal editiert, zuletzt von Der_Imperator (17. November 2014 um 13:35)

  • Code
    elif ["$blinken" == "nein"]

    Fast richtig, da fehlen dann aber noch Leerzeichen nach [ und vor ] :D

    Code
    elif [ "$blinken" == "nein" ]

    Auch ist mir entgangen das er i=i+1 nutzt was so, soweit ich weiß, auch nicht gehen wird..


    Nehmen wir jetzt alle Tips zusammen müsste der Code also wie folgt funktionsfähig sein:

    ..wobei er nirgends $i verwendet also könnte man das auch weg lassen.. es geht hier anscheint nur um die Wiederholungen, also 10x blinken..

    Worauf du auch achten solltest wäre anstatt /bin/sh lieber /bin/bash zu verwenden. bash ist neuer und kann mehr als sh.

    Als weiterführender Tip würde ich anstatt der if...else Geschichte lieber ein case verwenden. Und man könnte die Abläufe auch noch in eigene Funktionen/Anweisungen packen, das sind dann quasi eigene Befehle innerhalb des Scripts. Dadurch könnte man bei "undefinierte Eingabe" wieder die Frage anzeigen und das Script quasi von vorne durchlaufen lassen jedoch ohne den Code wiederholen zu müssen.

  • Das funktioniert in Bash NICHT. ;)

    geht:
    if true; then echo "true"; fi;

    geht nicht:
    if true; then; echo "true"; fi;

    Richtig, so hab' ich es oben auch angesprochen, aber egal ... ;)

    meigrafd: Du wärst auch kein schlechter Politiker!

Jetzt mitmachen!

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