Shell Skript IF-Abfrage mit mehreren Konditionen
PeTaGeh
- perl
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
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
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
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
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:
*/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