Schleife in bash und Variable

L I V E Stammtisch ab 20:30 Uhr im Chat
  • ich habe ein kleines Problem,

    eigentlich wollte ich ja eine Webseite per PI mit cronjop clonen

    wget macht mich verrückt also suche ich Ausgabemöglichkeiten, komme aber im Moment nicht weiter

    Schleife:

    for I in {1..16}; do
    #...
    sleep I * 10
    done

    ich denke ich habe alle Varianten durch

    $I * 10
    $(I * 10)
    wie = 10
    wie = I * wie
    wie = $I * wie
    wie = $I * 10
    sleep $(I * 10)

    sleep hat ewig was zu meckern

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Hi jar alter basher ;) ...

    versuch mal:

    sleep `expr 1 \* 2`

    cheers,
    -ds-

    wenn du mir verrätst wo da die Schleifenvariable I drin steckt ?

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Code
    for i in $(seq 16)
    do
        $i * 10
    done

    Wolltest du sowas in der Art haben?

    MfG,
    Miau

    nö, der sollte I x 10 sleepen vor dem nächsten Schleifendurchlauf

    beim -ds- fehlte I bei dir fehlt sleep

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (16. August 2013 um 17:19)

  • wenn du mir verrätst wo da die Schleifenvariable I drin steckt ?

    das kannst Du Dir aussuchen ;) ...
    1 und 2 sind Konstanten ... rechnen kannst Du nur mit expr, wobei das Multipl ... Malzeichen escaped (\*) werden muss.
    Das Ergebnis wird zurückgegeben (backticks) und ist das Argument für sleep.

    Da kannst Du jetzt $I statt 1 oder was weiss ich rein schreiben.

    hm .. hoffe, das war klar genug.

    cheers,
    -ds-

  • Da kannst Du jetzt $I statt 1 oder was weiss ich rein schreiben.

    hm .. hoffe, das war klar genug.

    cheers,
    -ds-

    ich hoffe mit dir, gleich die nächste Frage, wie mache ich die pipe oder Umleitung gleichzeitig zu

    stdout / stderr und FILE report.txt ?

    weil ich die Ausgaben ja im cmd sehe im cronjob aber nicht

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • hier einfach in ner doppelten Klammer, dann funzt es

    for I in {1..16}; do sleep $((I * 10)); echo $I; done


    Respekt ... gabs zu meiner Zeit nicht, dass die shell rechnen konnte :denker:

    Wie man sieht, lernt man nie aus ...

    cheers,
    -ds-

    ich hoffe mit dir, gleich die nächste Frage, wie mache ich die pipe oder Umleitung gleichzeitig zu

    stdout / stderr und FILE report.txt ?

    weil ich die Ausgaben ja im cmd sehe im cronjob aber nicht

    hm ... wenn das als cronjob läuft, verschwinden die Ausgaben sowieso im Nirvana, weil der Jobstarter kein zugeordnetes tty hat.

    Meinst Du jetzt sowas in der Art wie "2>&1 >>/tmp/report.txt" - also stdout und stderr nach /tmp/report.txt umleiten?

    cu,
    -ds-


  • Meinst Du jetzt sowas in der Art wie "2>&1 >>/tmp/report.txt" - also stdout und stderr nach /tmp/report.txt umleiten?

    cu,
    -ds-

    sowas in der Art

    zum testen rufe ich ja das bash file direkt auf, da sehe ich die Ausgaben wenn ich nicht umleite

    im cron job sehe ich die Ausgaben nie ohne Umleitung

    jedesmal das bash umschreiben ist doof, ergo sollen die Ausgaben immer im cmd Fenster und im report.txt landen !

    Ich habe ein bash, das funktioniert aus der cmd toll (wget) , im cronjob nie !

    und ich weiss nicht warum, ergo will ich wissen was passiert also die Ausgaben loggen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (16. August 2013 um 17:46)

  • Hallo jar,

    schonmal daran gedacht dass man die Ausgabe auch in der Crontab umleiten kann? Dadurch werden alle Ausgaben welche das Skript erzeugt umgeleitet und du musst nicht das Bash-Skript anpassen.

    Im übrigen gehen die Ausgaben bei einem Cronjob nicht einfach ins Nirvana über wie dreamshader geschrieben hat. Sobald in der Crontab MAILTO definiert ist werden die Ausgaben per Mail versendet.

    Gruß Georg


  • Hallo jar,

    schonmal daran gedacht dass man die Ausgabe auch in der Crontab umleiten kann?
    Dadurch werden alle Ausgaben welche das Skript erzeugt umgeleitet und du musst nicht das Bash-Skript anpassen.
    Gruß Georg


    danke Georg, logisch dachte ich an Umleitung der Ausgabe auch in der Crontab, aber alle Versuche meinerseits scheiterten. Entweder hatte ich die falsche Richtung vorgegeben oder ich kann einfach nicht die richtige Syntax. Mit Umleitung ins File bin ich einerseits schon weitergekommen, andererseits kostet die Schreiberei so viel Zeit das der Job offensichtlich nicht richtig erledigt wird, ohne Umleitung aus der CMD geht der Job ja, aber im Cron eben nicht und ich wusste mir keinen anderen Rat als mitzuschreiben.

    Wenn du eine Idee hast würde ich das gerne testen

    MAILTO denke ich eher nicht wo sollte die auch hingehen, ich progge @work über putty nach @home und auf mail warten ist nicht so mein Ding, abgesehen davon welches Mailkonto ?

    LG jar

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • schonmal daran gedacht dass man die Ausgabe auch in der Crontab umleiten kann? Dadurch werden alle Ausgaben welche das Skript erzeugt umgeleitet und du musst nicht das Bash-Skript anpassen.


    Ich stelle in die Crontab immer nur die Commandaufrufe und das Tracing wird dann im Script ein- und ausgeschaltet.
    Die folgenden 3 Zeilen sind dann immer ganz hilfreich:

    Code
    LOG_FILE="/tmp/myprog.log"
    exec 1> >(tee -a $LOG_FILE >&1)
    exec 2> >(tee -a $LOG_FILE >&2)


    Speziell auch fuer normale Scripts die man in der Commandline als User aufruft sind sie nützlich.

  • nö, der sollte I x 10 sleepen vor dem nächsten Schleifendurchlauf

    beim -ds- fehlte I bei dir fehlt sleep

    Dann setz die Variable für sleep entweder vorher oder rechne es zusammen

    Code
    sleep $I * 10


    wird nicht funktionieren, also stattdessen entweder

    Code
    S=$(expr $I * 10)
    sleep $S


    oder

    Code
    sleep $(expr $I * 10)


    oder wenn du bash benutzt (sh kann das nicht!)

    Code
    sleep $(($I * 10))


    Allerdings versteh ich gerade nicht was du damit überhaupt im Zusammenhang mit wget bezwecken willst?

    Zeig mal dein Script, dann kann man dir vermutlich auch besser helfen ;)


    Beim Umleiten der Ausgabe entweder im Script
    >> /tmp/report.txt 2>&1
    nutzen, oder im cronjob

    " 2>&1 >>/tmp/report.txt " ist glaub ich falsch, da bin ich mir aber grad selber nicht sicher - ich nutze aber immer er die umleitung in die datei und danach erst die umleitung von stderr nach stdout


  • Allerdings versteh ich gerade nicht was du damit überhaupt im Zusammenhang mit wget bezwecken willst?

    ich wollte meine NETIO Webseite auf den PI spiegeln

    zur Begründung, der NETIO ist mit User und PW geschützt, da kann man nicht nur die Betriebsspannungen sehen, auch das Wohnzimmer Licht einschalten und den PC resetten

    das muss nicht jeder können, ausserdem ist der NETIO etwas überfordert ergo soll der PI den ersetzen, aber ich muss den Umzug so nach und nach machen

    aber vorab mal jedem die Seite zeigen zu können kann der PI schon ganz gut ohne das sich jemand einloggen muss oder mir das Licht an oder aus macht.

    Das dumme ist nur, rufe ich wget manuell auf (bzw. das script) dann läuft das ganz brauchbar, wenn der wget Aufruf nicht beim ersten Mal klappt dann zumindest nach dem zweiten oder dritten Versuch, deswegen die Schleife. Ich habe schon alle wget Parameter probiert, --tries=3 --wait=5 --waitretry=4 mit mehr oder weniger Erfolg

    wenn es aber in der cmd klappt, im cronjob fast nie, deswegen die Ausgaben


    Zeig mal dein Script, dann kann man dir vermutlich auch besser helfen ;)

    OK


    nutzen, oder im cronjob

    " 2>&1 >>/tmp/report.txt " ist glaub ich falsch, da bin ich mir aber grad selber nicht sicher - ich nutze aber immer er die umleitung in die datei und danach erst die umleitung von stderr nach stdout

    nicht das ich falsch verstanden wurde, ich weiss das normale Ausgaben in stdout gehen, aber wohin gehen errors ? eigentlich doch auch in stdout, ich sehe sie ja im CMD

    im bash sehe ich nix, Umleitung in File gibt scheinbar nur stdout aus, errors habe ich nie im File gesehen, deswegen meine Vermutung ich muss auch stderr ins file umleiten

    und nun möchte ich alles in ein File schreiben damit ich alle Ausgaben im File nachlesen kann wenn es im cronjob läuft

    im CMD darf nicht nur ins File geschrieben werden sondern auch ins aktive Fenster vom command interpreter (vermutlich stdout)

    Ich hoffe das ist jetzt klarer.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (16. August 2013 um 21:08)

  • Wenn du die Daten übertragen willst solltest du das nicht mit wget machen sondern besser mit scp oder direkt ftp.. Weil wenn da php Dateien dabei sind wird wget nur die Ausgabe dieser Datein kriegen aber nicht den Source ;)


    Wenn du einen Befehl im Script ausführst und dort ein Fehler auftritt, wird das normalerweise direkt ausgegeben
    Wenn du das Script aber über crontab ausführst, werden Fehler entweder ins syslog ausgegeben, oder wenn du MAILTO eingestellt hast dort hin gemailt

    Wenn du sowohl stdout als auch stderr sehen möchtest wenn das Script über crontab ausgeführt wird, ist eine Umleitung in eine Datei, also " >> /tmp/report.txt 2>&1 " deine einzige möglichkeit

    Im Script kannst du prüfen ob der vorherige Befehl normal verlief oder einen Fehler (exitstatus) verursacht hat durch:

    Code
    $?

    Da nutze ich zB gerne, ums simpel zu halten:

    Code
    befehl
    [ $? -gt 0 ] && echo Error && exit 1

    In meinen eigenen Scripts ist das aber etwas umfangreicher:

    einen befehl "ls-la" (absichtlich ohne leerzeichen) gibt es nicht also würde der Befehl einen exitstatus höher 0 zurückgeben und somit würde die Bedingung in _error zutreffen


  • Wenn du die Daten übertragen willst solltest du das nicht mit wget machen sondern besser mit scp oder direkt ftp..

    ich möchte aber nur den Quelltext der HTML spiegeln


    Wenn du sowohl stdout als auch stderr sehen möchtest wenn das Script über crontab ausgeführt wird, ist eine Umleitung in eine Datei, also " >> /tmp/report.txt 2>&1 " deine einzige möglichkeit

    danke probiere ich


    Wenn du sowohl stdout als auch stderr sehen möchtest wenn das Script über crontab ausgeführt wird, ist eine Umleitung in eine Datei, also " >> /tmp/report.txt 2>&1 " deine einzige möglichkeit


    " >> /tmp/report.txt 2>&1 "

    Unterschied Datei erstellen neu schreiben

    und append

    die erste Ausgabe soll ja die Datei /tmp/report.txt erstellen bzw. überschreiben
    jede weitere Ausgabe soll aber angehängt werden

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (16. August 2013 um 21:38)

  • " >> " ist append - es wird also an den bereits vorhanden Inhalt (falls vorhanden) unten drunter eingefügt - aber nichts überschrieben

    " > " löscht den inhalt der datei (falls vorhanden) und fügt es ein...

    In beiden Fällen wird die Datei angelegt falls noch nicht vorhanden

    Also zum beispiel würde bei:

    Code
    echo 1 >> /tmp/bla
    echo 2 >> /tmp/bla
    echo 3 >> /tmp/bla

    Der Inhalt von /tmp/bla so aussehen:

    Code
    1
    2
    3

    Aber bei:

    Code
    echo 1 > /tmp/bla
    echo 2 > /tmp/bla
    echo 3 > /tmp/bla

    Wäre der Inhalt von /tmp/bla:

    Code
    3


    Das " 2>&1 " am Ende bedeutet das der Ausgabe-Kanal 2 nach 1 umgeleitet wird
    1 ist stdout
    2 ist stderr

  • also ins report.txt geht es ja aber Ausgabe auf CMD Fenster bei Aufruf geht nicht

    ich wollte es ja im Fenster (bei Direktaufruf) und ins File ausgegeben haben

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

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