Saya mengalami kesulitan memahami cara memeriksa dengan benar dari skrip bash jika waktu saat ini adalah antara 23:00 dan 06:30. Saya mencoba menjalankan infinite loop untuk memeriksa waktu sekarang, dan melakukan sesuatu jika rentang waktunya antara 11 malam dan 6:30 pagi. Inilah yang telah saya tulis sejauh ini, yang tidak berfungsi pada hari berikutnya:
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 &
}
Apa yang saya lakukan salah?
Jawaban:
Jika yang Anda butuhkan adalah memeriksa apakah
HH:MM
antara 23:00 dan 06:30, maka jangan gunakan cap waktu Unix. Cukup periksaHH:MM
nilai secara langsung:Catatan:
HH:MM
akan berada dalam urutan leksikografis, sehingga Anda dapat langsung membandingkannya sebagai string.-a
atau-o
masuk[ ]
, gunakan||
dan&&
sebagai gantinya.[[ ]]
daripada[ ]
, itu membuat hidup lebih mudah.sumber
date
menggunakan zona waktu tertentu menggunakanTZ
variabel (misalnya,TZ=Asia/Tokyo date
atauTZ=UTC date +%H:%M
Jika Anda ingin lebih eksplisit tentang waktu yang ingin Anda cocokkan, Anda bisa menggunakan
case
pernyataan. Berikut adalah loop 24 jam dengan pernyataan kasus di dalamnya yang menunjukkan apakah waktu saat ini cocok dengan rentang Anda:Untuk menggunakannya dalam skrip Anda, cukup ganti variabel dengan panggilan ke
date
:Anda mungkin mempertimbangkan untuk lebih bersahabat dengan CPU Anda dan menghitung jumlah waktu antara (sekarang) dan waktu mulai berikutnya, dan
sleep
untuk jumlah waktu tersebut.sumber
Anda dapat mengonversi waktu ke detik sejak awal hari "ini" dan kemudian memeriksa bahwa nilai detik lebih besar dari
23*60*60
(82800) atau lebih rendah dari6*60*60+30*60
(23400).Untuk mendapatkan detik sejak awal hari "ini" dapat Anda lakukan:
Dan tesnya adalah:
sumber
Saya memiliki situasi yang sama. Tujuan saya adalah memiliki solusi yang sangat sederhana untuk dipelihara oleh Geeks non-unix.
Ketika server Linux saya restart, ia menjalankan skrip yang mengirimkan peringatan. Tetapi jika ini terjadi sebagai bagian dari "Jendela Perawatan" kami yang didefinisikan antara jam 11 malam Sabtu dan 6 pagi hari Minggu, saya tidak ingin mengirim halaman, karena memulai ulang selama jendela ini adalah Oke (tambalan diterapkan, dll.). Saya telah mengujinya dan berfungsi sebagaimana mestinya (sejauh yang saya tahu).
Berikut adalah kalender untuk referensi:
Ini kode pengujian saya:
Ini outputnya
sumber
Dalam kasus khusus ini, alternatif untuk membuat tes lebih sederhana adalah dengan menambahkan satu jam dan menguji sekali kurang dari
07:30
sumber
Petunjuk: jawaban muru di atas bekerja untuk saya, tetapi bukannya || (pipa, "atau"), saya harus menggunakan && ("dan" operator).
seperti ini: jika [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
sumber