J'ai du mal à comprendre comment vérifier correctement à partir d'un script bash si l'heure actuelle est comprise entre 23h00 et 06h30. J'essaie d'exécuter une boucle infinie pour vérifier l'heure maintenant et de faire quelque chose si la plage horaire se situe entre 23 h et 6 h 30. Voici ce que j'ai écrit jusqu'à présent, qui ne fonctionne pas le lendemain:
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 &
}
Qu'est ce que je fais mal?
Réponses:
Si tout ce dont vous avez besoin est de vérifier s'il se
HH:MM
situe entre 23h00 et 06h30, n'utilisez pas d'horodatage Unix. Vérifiez simplement lesHH:MM
valeurs directement:Remarques:
HH:MM
entrée sera dans l'ordre lexicographique, vous pouvez donc les comparer directement sous forme de chaînes.-a
ou-o
dans[ ]
, utilisez||
et à la&&
place.[[ ]]
plutôt[ ]
, cela rend la vie plus facile.la source
date
utiliser un fuseau horaire spécifique en utilisant laTZ
variable (par exemple,TZ=Asia/Tokyo date
ouTZ=UTC date +%H:%M
Si vous voulez être plus explicite sur les heures auxquelles vous voulez correspondre, vous pouvez utiliser une
case
déclaration. Voici une boucle de 24 heures avec une déclaration de cas à l'intérieur qui indique si l'heure actuelle correspond à votre plage:Pour l'utiliser dans votre script, remplacez simplement les variables par un appel à
date
:Vous pourriez envisager d'être plus convivial avec votre CPU et de calculer la durée entre (maintenant) et la prochaine heure de démarrage, et
sleep
pendant cette durée.la source
Vous pouvez convertir le temps en secondes depuis le début de "ce" jour, puis vérifier que la valeur des secondes est supérieure à
23*60*60
(82800) ou inférieure à6*60*60+30*60
(23400).Pour obtenir des secondes depuis le début de "ce" jour, vous pouvez faire:
Et le test serait:
la source
J'ai une situation similaire. Mon objectif est d'avoir une solution très simple à maintenir pour les geeks non-unix.
Lorsque mon serveur Linux redémarre, il exécute un script qui envoie une alerte. Mais si cela se produit dans le cadre de notre "fenêtre de maintenance" qui est définie entre 23h samedi et 6h dimanche, je ne veux pas envoyer la page, car un redémarrage pendant cette fenêtre est correct (correctifs appliqués, etc.). Je l'ai testé et cela fonctionne comme prévu (pour autant que je sache).
Voici le calendrier pour référence:
Voici mon code de test:
Voici la sortie
la source
Dans ce cas particulier, une alternative pour simplifier le test consiste à ajouter une heure et à tester une fois pour moins de
07:30
la source
Astuce: la réponse de muru ci-dessus a fonctionné pour moi, mais au lieu de || (tuyaux, "ou"), j'ai dû utiliser && ("et" opérateur).
comme ceci: si [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
la source