PeTaGeh: Shell Skript IF-Abfrage mit mehreren Konditionen

Moinsen,

ich hab auf unserem Linux-Server (im Büro) ein Skript eingerichtet, dass alle 20 Minuten 24/7 gestartet wird.

Mit einer IF-Abfrage teste ich den Wochentag und die Stunde ab, damit das Skript nur zu bestimmten Tageszeiten (16.oo - 8.oo) von Montag bis Freitag läuft. Funzt aber nicht richtig.

Allerdings reichen meine Shell-Skripting-Kenntnisse nicht aus, um das sauber hinzukriegen:

#!/bin/bash
CHECKHOUR=$(date +"%k")
CHECKDAY=$(date +"%u")

#Abfrage ob das Skript überhaupt laufen darf (Crontab-Ersatz)

if [ "$CHECKHOUR" -le "8" -o "$CHECKHOUR" -ge "16" -a "$CHECKDAY" -ge "1" -o "$CHECKDAY" -le "5" ]; then
  #Tue dies und das
  echo Kannst laufen!
else
  #Tue nichts
  echo Nee, lieber nicht!
fi

Ich will und muss die Crontab umgehen, damit ich alle 20 Minuten einen Log-Eintrag in unserer DB (bei 1&1) erzeugen kann.

Ich hoffe, dass mir einer helfen kann die IF-Abfrage richtig zu formulieren. Besten Dank im Voraus! :D

Gruss, Peter

--
If kids had been influenced by Pacman, they'd be jumping around in dark rooms eating strange pills and listening to monotonous music these days.
  1. Hi,

    Funzt aber nicht richtig.

    Das ist keine gute Fehlerbeschreibung ...

    if [ "$CHECKHOUR" -le "8" -o "$CHECKHOUR" -ge "16" -a "$CHECKDAY" -ge "1" -o "$CHECKDAY" -le "5" ]; then

    ... aber hier liegt wohl der Fehler.

    Ich weiß nicht genau in welcher Reihenfolge die Operatoren abgearbeitet werden, aber ich vermute mal nicht in der, die du dir wünscht.

    In den Sprachen wo ich es weiß wird AND vor OR abgearbeitet.
    Das heißt deine Bedingung würde so aussehen: (Pseudocode)

    (HOUR <= 8) OR ( (HOUR >= 16) AND (DAY >= 1) ) OR (DAY <= 5)

    Wie man in Bash-Scripts die Reihenfolge der Operatoren Festlegt weiß ich nicht. Hab es mit runden und eckigen Klammern versucht, hat aber nicht funktioniert.
    (Vielleicht weiß das ja jemand hier im Forum)

    Außerdem hast du einen logischen Fehler drin:
    (DAY >= 1)  OR (DAY <= 5)
    ist immer wahr.

    Aber in deinem Fall reicht eh eine Verknüpfungsart:
    (HOUR >= 8) AND (HOUR <= 16) AND (DAY >=1) AND (DAY <= 5)

    Das ist Wahr wenn HOUR von 8 bis 16 geht und DAY von 1 bis 5.
    Also wenn ich mich nicht täusche Montag bis Freitag von 8 Uhr bis 16:59 Uhr.

    mfG,
    steckl

    1. Moinsen,

      Ich weiß nicht genau in welcher Reihenfolge die Operatoren abgearbeitet werden, aber ich vermute mal nicht in der, die du dir wünscht.

      In den Sprachen wo ich es weiß wird AND vor OR abgearbeitet.
      Das heißt deine Bedingung würde so aussehen: (Pseudocode)

      (HOUR <= 8) OR ( (HOUR >= 16) AND (DAY >= 1) ) OR (DAY <= 5)

      Danke schonmal für die Antwort, steckl.
      Das wäre schonmal ein Ansatz. Dass die Logik in der Abfrage noch nich so 100pro war, hab ich mir schon gedacht :D
      Ich werd mir die Aussage, dass AND vor OR kommt, mal zur Brust nehmen und das Skript anpassen. Und berichte dann wieder.

      Gruss, Peter

      --
      If kids had been influenced by Pacman, they'd be jumping around in dark rooms eating strange pills and listening to monotonous music these days.
      1. So,
        ich habs jetzt ein bisschen unkonventioneller gelöst:

        #!/bin/bash

        CHECKHOUR=$(date +"%k")
        CHECKDAY=$(date +"%u")
        LIMITHOURFROM=14
        LIMITHOURTO=8
        LIMITDAYFROM=1
        LIMITDAYTO=5
        #Abfrage ob der Pricechecker überhaupt laufen soll (Crontab-Ersatz)

        if [ "$CHECKHOUR" -le "$LIMITHOURTO" -o "$CHECKHOUR" -ge "$LIMITHOURFROM" ]; then

        echo Stunde ist ok!
          if [ "$CHECKDAY" -gt "$LIMITDAYFROM" -a "$CHECKDAY" -le "$LIMITDAYTO" ]; then
            echo Tag ist ok!
            echo Kannst laufen!
          else
            echo Tag nicht gut!
            echo Nee, lieber nicht!
          fi
        else
          echo Stunde nicht gut!
          echo Nee, lieber nicht!
        fi

        Was Besseres fiel mir nicht ein:(

        Gruss, Peter

  2. Moin Moin!

    Moinsen,

    ich hab auf unserem Linux-Server (im Büro) ein Skript eingerichtet, dass alle 20 Minuten 24/7 gestartet wird.

    [...]

    damit das Skript nur zu bestimmten Tageszeiten (16.oo - 8.oo) von Montag bis Freitag läuft

    [...]

    Ich will und muss die Crontab umgehen, damit ich alle 20 Minuten einen Log-Eintrag in unserer DB (bei 1&1) erzeugen kann.

    Öm, was hat das Log bei 1&1 mit der Art und Weise zu tun, wie Dein Script auf dem Rechner im Büro gestartet wird?

    Überlasse es cron, Dein Script aufzurufen, statt das Rad neu zu erfinden:

    MIN HOUR DAY MONTH DAYOFWEEK COMMAND

    */20 0-7,16-23 * * mon-fri /usr/local/bin/DeinScript.sh -foo -bar -baz server42.1und1.de root geheimespasswort

    (Kombiniert aus drei Beispielen in der crontab-Manpage ...)

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".