Shell Programmierung Hilfe bei while Schleife

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Hinweis: In dem Thema Shell Programmierung Hilfe bei while Schleife gibt es 4 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Shell Programmierung Hilfe bei while Schleife

    Hallo,

    ich bin absoluter Anfänger in Sachen Bash - Programmierung. Ich kann zwar C aber mit den Schleifen der Bash Programmierung habe ich große Probleme.

    Hier mal der bisherige Code:

    Quellcode

    1. # Serielle Schnittstelle mit stty konfigurieren
    2. # Schnittstelle mit parametrieren ( Baud: 9600, 8 Datenbits, 1 Stopbit, Parity keine ( 8N1 ))
    3. stty -F /dev/ttyUSB0 9600 cs8 -cstopb
    4. stty -F /dev/ttyUSB0 9600 raw
    5. while [ "$myarray" != "Bereit" ]; do
    6. # Daten senden
    7. echo -n :88# >> /dev/ttyUSB0 # : Startbyte, 88 Berüßung, # Stopbyte
    8. # Empfangene Daten lesen ( Wenn der µC 88 erhält, sendet er Bereit
    9. while read myarray; do
    10. echo $myarray
    11. if [ "$myarray" == "Bereit" ]
    12. then
    13. echo "Hallo, Araduino."
    14. else
    15. echo "Warte auf Arduino..."
    16. fi
    17. done < <(cat /dev/ttyUSB0)
    18. done
    19. echo "while Schleife beendet" # Erschient nicht!!
    20. #Logdatei Durchsuchen
    21. tail -f /home/chris/mnt/Motion.log | grep -E "motion_detected:" | while read line
    22. do
    23. echo -n :89# >> /dev/ttyUSB0 # : Startbyte, 89 Befehl zum Einschalten einer Lampe, # Stopbyte
    24. done
    Alles anzeigen

    Das Programm bleibt bei dem cat Befehl stehen.

    Hier noch die Ausgabe:

    Quellcode

    1. linux-u98m:/home/chris/Schreibtisch # ./Usart.sh
    2. Bereit
    3. Hallo, Araduino.

    Kann jemand helfen?
    Kaum macht man´s richtig, schon geht´s.

    Für den Inhalt des Beitrages 108114 haftet ausdrücklich der jeweilige Autor: griwl

  • Wenn man in einer Schleife liest,
    dann liest man halt in einer Schleife.

    Und hat man keine Abbruchbedingung,
    dann liest das Ding halt ewig,
    oder wartet bis etwas gelesen werden kann.

    Das solltest du aber längst wissen.
    Das ist in C nicht anders.

    Es wäre wohl besser für die Kommunikation mit dem Teil eigene FDs zu verwenden.
    Also sowas wie exec 3>/dev/ttyUSB0 ; exec 4</dev/ttyUSB0
    Sokrates sagte, dass er nichts wisse.
    Ich bin viel, viel klüger als Sokrates.
    Ich weiß ganz genau, dass ich gar nichts weiß.

    Für den Inhalt des Beitrages 108117 haftet ausdrücklich der jeweilige Autor: Berichtigung

  • Vielen Dank für deine Bemühungen.

    Also vielleicht habe ich mich nicht richtig ausgedrückt.
    Ich bin totaler Anfänger in Bash Programmierung und habe da schon anfängliche Probleme mit der
    Schreibweise der Schleifen. Dass eine while Schleife eine Abbruchbedingung hat, weiß ich schon.

    Bei der ersten while Schleife kann ich die Abbruchbedingung erkennen.

    Quellcode

    1. "$myarray" != "Bereit"

    Führe die Schleife aus, solange myarray nicht den Wert Bereit hat.

    bei der nächsten while Schleife sehe ich die Abbruchbedingung leider nicht. Sorry - mein Fehler....

    Das Ding hier soll nur solange ausgeführt werden, solange myarray nicht den Wert Bereit hat.

    Quellcode

    1. while read myarray; do
    2. echo $myarray
    3. if [ "$myarray" == "Bereit" ]
    4. then
    5. echo "Hallo, Araduino."
    6. else
    7. echo "Warte auf Arduino..."
    8. fi
    9. done < <(cat /dev/ttyUSB0)
    Kann mir jemand eine Buchempfehlung für Bash Programmierung geben?
    Vielen Dank für Eure hlfe.
    Kaum macht man´s richtig, schon geht´s.

    Für den Inhalt des Beitrages 108136 haftet ausdrücklich der jeweilige Autor: griwl

  • Nu ja.

    Er bleibt halt bis der Strom ausgeht in der zweiten Schleife, WEIL dort nichts abgebrochen wird.
    Du könntest in der inneren while Schleife im Then Zweig ein break verweden, um aus dieser Ewigkeit wieder auszubrechen.

    Hilfe zu internen Bash Kommandos erhältst du mit

    Quellcode

    1. help while
    2. help break
    3. # mit korrektem Quoting auch zu Sachen, wie
    4. help "["
    5. help "[["
    6. help "{"
    7. # ein Sonderfall, der Fakten verschleiert
    8. help "("
    9. # das ist die Hilfe zum arithmetischen Kontext.
    10. # Die Bash Integer Rechenmaschine
    Alles anzeigen


    Manche Befehle gibt es extern und shellintern. Auf manchen Maschinen sind test und [ eigenständige Kommandos, auf manchen dasgleiche Binärprogramm, lediglich miteinander verlinkt. UND die Bash bringt ein interne Variante ebenfalls mit.
    Also nicht nur help something sondern auch immer gleich man something probieren.

    Eine einige Runde Klammer ist die Anweisung, die darin stehenden Befehle in einer Subshell auszuführen.
    Zwei runde Klammern sind der arithmetische Kontext.


    Shell-Script

    1. # eine Subshell
    2. ( doSomething ; doAnotherthing -with someARGS )
    3. # Rumrechnen
    4. (( i++))
    5. echo $i
    6. ((i++))
    7. echo $i
    8. echo $((i++))

    Ein paar gute Links zu einigen guten Seiten habe ich wohl,
    aber noch etwas viel besseres:
    Ich kann dir das leicht in ein paar Stunden live beibringen.
    Sauerland und ich haben einen Server, der nicht nur Mumble anbietet. (Mumble == bessere open source Variante wie Teamspeak)
    Installiere dir Mumble und gehe auf den Server computer.krauttranslate.de
    Dann zeige ich dir das in einer gesharten screen- session.
    Mit Sicherheit effizienter als alles andere.
    Sokrates sagte, dass er nichts wisse.
    Ich bin viel, viel klüger als Sokrates.
    Ich weiß ganz genau, dass ich gar nichts weiß.

    Für den Inhalt des Beitrages 108139 haftet ausdrücklich der jeweilige Autor: Berichtigung

  • Kaum macht mans richtig, schon gehts... :)

    Danke für die ausführliche Hilfe. Die man oder help Seiten benutze ich oft für Befehle wie grep, ls, oder für Programme ( stty, motion, etc ).
    Wäre nie darauf gekommen man while einzugeben.. ;-O

    Ich lerne am Besten mit Hands On. An einem eigenen Projekt, das man vorantreiben möchte. Das Live Coatching hört sich
    echt sau gut an. Ich werde in meinem nächsten Urlaub mal darauf zurückgreifen. Das Forum wird auf jeden Fall mit einer Spende unterstützt.
    Kaum macht man´s richtig, schon geht´s.

    Für den Inhalt des Beitrages 108143 haftet ausdrücklich der jeweilige Autor: griwl