Ich habe Probleme zu verstehen, wie ich anhand eines Bash-Skripts richtig überprüfen kann, ob die aktuelle Zeit zwischen 23:00 und 06:30 Uhr liegt. Ich versuche, eine Endlosschleife auszuführen, um die Uhrzeit jetzt zu überprüfen und etwas zu tun, wenn der Zeitbereich zwischen 23 Uhr und 6:30 Uhr liegt. Folgendes habe ich bisher geschrieben, was am nächsten Tag nicht funktioniert:
fireup()
{
local starttime=$(date --date="23:00" +"%s")
local endtime=$(date --date="06:30" +"%s")
while :; do
local currenttime=$(date +%s)
if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
local currenttime=$(date +%s)
done &
}
Was mache ich falsch?
Antworten:
Wenn Sie nur überprüfen müssen, ob
HH:MM
zwischen 23:00 und 06:30 Uhr liegt, verwenden Sie keine Unix-Zeitstempel. Überprüfen Sie einfach dieHH:MM
Werte direkt:Anmerkungen:
HH:MM
wird in lexikografischer Reihenfolge angegeben, sodass Sie sie direkt als Zeichenfolgen vergleichen können.-a
oder-o
in[ ]
, verwenden Sie||
und&&
stattdessen.[[ ]]
Sie es vor[ ]
, es macht das Leben leichter.quelle
date
eine bestimmte Zeitzone mit derTZ
Variablen verwenden (z. B.TZ=Asia/Tokyo date
oderTZ=UTC date +%H:%M
Wenn Sie die Zeiten, zu denen Sie übereinstimmen möchten, genauer angeben möchten, können Sie eine
case
Anweisung verwenden. Hier ist eine 24-Stunden-Schleife mit einer case-Anweisung, die angibt, ob die aktuelle Zeit Ihrem Bereich entspricht:Um es in Ihrem Skript zu verwenden, ersetzen Sie einfach die Variablen durch einen Aufruf von
date
:Sie könnten in Betracht ziehen, freundlicher mit Ihrer CPU umzugehen und die Zeitspanne zwischen (jetzt) und der nächsten Startzeit und
sleep
für diese Zeitspanne zu berechnen .quelle
Sie können die Zeit seit Beginn dieses Tages in Sekunden umrechnen und dann überprüfen, ob der Sekundenwert entweder größer als
23*60*60
(82800) oder6*60*60+30*60
kleiner als (23400) ist.Um Sekunden seit dem Beginn "dieses" Tages zu erhalten, können Sie Folgendes tun:
Und der Test wäre:
quelle
Ich habe eine ähnliche Situation. Mein Ziel ist es, eine Lösung zu haben, die für Nicht-Unix-Geeks sehr einfach zu warten ist.
Beim Neustart meines Linux-Servers wird ein Skript ausgeführt, das eine Warnung sendet. Wenn dies jedoch als Teil unseres "Wartungsfensters" geschieht, das zwischen Samstag 23 Uhr und Sonntag 6 Uhr definiert ist, möchte ich die Seite nicht senden, da ein Neustart in diesem Fenster in Ordnung ist (Patches angewendet usw.). Ich habe es getestet und es funktioniert wie beabsichtigt (soweit ich das beurteilen kann).
Hier ist der Kalender als Referenz:
Hier ist mein Testcode:
Hier ist die Ausgabe
quelle
In diesem speziellen Fall besteht eine Alternative zur Vereinfachung des Tests darin, eine Stunde hinzuzufügen und einmal für weniger als zu testen
07:30
quelle
Hinweis: Murus Antwort oben hat bei mir funktioniert, aber anstelle von || (Pipes, "oder") musste ich && ("und" Operator) verwenden.
wie folgt: if [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
quelle