wie kann man in bash ein for i in richtig programmieren

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    komme mit folgendem Befehl nicht weiter:

    #!/bin/sh

    Code
    for i in 10
    do
    echo -n -e  \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1
    done

    Was es machen sollte: es soll 10 mal den Befehl echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899 hintereinander ausfuehren.
    Zwischen jedem Befehl soll noch sleep 0.1 rein.

    Anstatt den Befehl 10 x zu schreiben und 10x sleep 0.1 dazwischen, muss das doch eleganter gehen.


    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (20. April 2014 um 18:09)

  • wie kann man in bash ein for i in richtig programmieren? Schau mal ob du hier fündig wirst!

  • Leider geht es nicht, was habe ich falsch gemacht`?


    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (20. April 2014 um 18:46)


  • > was habe ich falsch gemacht`?
    Zumindest das:

    #!/bin/sh

    Nope, das ist korrekt.
    Man kann auch #!/bin/bash oder #!/bin/dash verwenden, aber #!/bin/sh ist absolut valide. (Siehe google "shebang", ist sogar das Musterbeispiel bei den meisten)

    for in habe ich in bash leider noch nie verwendet, kann ich gerade nichts zu sagen und habe keine Zeit rumzuprobieren, vllt heute Abend wenn dann noch keiner eine Antwort gefunden hat.

  • das "for" - beispiel wie ich dir aufgeschrieben habe, geht so mit bash...

    Das Problem scheint in dem netcat Teil zu liegen, teste den mal separat...

    PS:

    Code
    for i in 1 2 3 4 5 6 7 8 9 10 ; do echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899 $i;

    hier ist zumindest das "$i" am Ende des nc Kommandos überflüssig..., lt. man page jedenfalls...


  • for i in 1 2 3 4 5 6 7 8 9 10 ; do echo $i; done

    Das geht kürzer, wenn die Bash mit dem entsprechenden configure flag für arithmetic evaluations in double parentheses
    (sorry, weiss jetzt nicht wie der genau heisst; wen's interessiert, der schaue in die Bash Quellen)
    kompiliert worden ist, was eigentlich bei allen aus Paketen des jeweiligen Package Management Tools der eigenen Distro installierten Bashes der Fall sein dürfte.

    Ich habe mal im echo unten die Option "-n" zur Unterdrückung des Zeilenumbruchs weggelassen, damit man sieht,
    dass es wirklich 10 echos produziert.

    Selbst, wenn kein o.g. Kompilat der Bash vorliegen sollte, geht es mit dem seq Kommando fast ebenso Tipparbeit sparend.

    Schaut mal in die Manpages von Bash (dort Abschnitt Arithmetic Evaluations) sowie in die von seq.
    Letzteres könnt Ihr durch mitgabe von Start-, Endwerten und Inkrement bzw, Dekrement in beliebiger Schrittweite hoch- und runterzählen lassen.

  • Danke fuer die Info, leider geht es immer noch nicht

    Code
    for i in 1 2 3 4 5 6 7 8 9 10 ; do echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1
    done

    Wenn ich es so mache funktioniert es;

    Code
    echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1
    echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1
    echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1

    So geht es mit jedem echo -n -e \0x3C\0x00\0x55 | nc -u -q 1 192.168.0.6 8899
    sleep 0.1
    eine Stufe runter. (brightness for light)

    Wie kann man das denn noch anderst machen`??

    So gehts immer noch nicht:


    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (20. April 2014 um 22:38)

  • Der einzige Unterschied zwischen den einzelnen wiederholten echo Befehlen und dem gleichen in einer for loop,
    was mir spontan in den Sinn kommt, könnte evtl. sein, dass in der for loop das shell builtin von echo ausgeführt wird,
    während in der ausgeschriebenen Variant das externe echo Kommando aus /usr/bin/echo ausgeführt wird,
    warum auch immer?

    Macht es einen Unterschied, wenn Du dem echo Statement in der for loop den Pfad zum externen echo bzw. das Wort command voranstellst?
    Also

    Code
    ...do
    /usr/bin/echo ...
    done


    bzw.

    Code
    ...do
    command echo ...
    done

    Wegen der Pipe tappt man manchmal auch in die Subshell Falle.
    Da Du aber die Schleifenvariable des Inkrements $i gar nicht benötigst und die nur ein Dummy ist,
    damit die for loop Syntax gewahrt bleibt,
    kommt das hier gar nicht zum Tragen.

  • Habe es jetzt so gemacht:


    Weiss der Geier warum "#Dimmen auf half brightness" mit dem echo commando geht, aber das "#Hell auf max." mit echo commando nicht geht. Mit dem /home.......milight 1 b 1 geht es einwand frei.

    Danke fuer die Hilfe an alle die etwas zur Loesung beigetragen haben.

    gruss

    gwaag

Jetzt mitmachen!

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