Estou tendo problemas para entender como verificar corretamente em um script bash se o horário atual é entre 23:00 e 06:30. Estou tentando executar um loop infinito para verificar a hora agora e fazer algo se o intervalo de tempo estiver entre 23h e 6h30. Aqui está o que escrevi até agora, que não funciona no dia seguinte:
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 &
}
O que estou fazendo errado?
Respostas:
Se tudo o que você precisa é verificar se
HH:MM
está entre 23:00 e 06:30, não use os carimbos de data e hora do Unix. Basta verificar osHH:MM
valores diretamente:Notas:
HH:MM
entrará em ordem lexicográfica, para que você possa compará-los diretamente como strings.-a
ou-o
em[ ]
, uso||
e&&
em vez disso.[[ ]]
mais[ ]
, facilita a vida.fonte
date
usar um fuso horário específico usando aTZ
variável (por exemplo,TZ=Asia/Tokyo date
ouTZ=UTC date +%H:%M
Se você quiser ser mais explícito sobre os horários que deseja corresponder, use uma
case
declaração. Aqui está um loop de 24 horas com uma declaração de caso dentro que indica se o horário atual corresponde ao seu intervalo:Para usá-lo em seu script, basta substituir as variáveis por uma chamada para
date
:Você pode considerar ser mais amigável à sua CPU e calcular a quantidade de tempo entre (agora) e a próxima hora de início e
sleep
por essa quantidade de tempo.fonte
Você pode converter o tempo em segundos desde o início deste "dia" e depois verificar se o valor de segundos é maior que
23*60*60
(82800) ou menor que6*60*60+30*60
(23400).Para obter segundos desde o início deste "dia", você pode:
E o teste seria:
fonte
Eu tenho uma situação parecida. Meu objetivo é ter uma solução que seja muito simples para os geeks não-unix manterem.
Quando meu servidor Linux é reiniciado, ele executa um script que envia um alerta. Mas se isso acontecer como parte da nossa "Janela de manutenção", definida entre 23h de sábado e 6h de domingo, não quero enviar a página, porque uma reinicialização durante esta janela é válida (correções aplicadas etc.). Eu testei e funciona como pretendido (tanto quanto eu posso dizer).
Aqui está o calendário para referência:
Aqui está o meu código de teste:
Aqui está a saída
fonte
Nesse caso específico, uma alternativa para simplificar o teste é adicionar uma hora e testar uma vez por menos de
07:30
fonte
Dica: a resposta de muru acima funcionou para mim, mas em vez de || (pipes "ou"), tive que usar o && ("and" operator).
assim: se [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
fonte