Trädvy Permalänk
Medlem
Plats
Luleå
Registrerad
Jan 2004

Hantera tid i shellscript

Hur skriver man egentligen ett korrekt uttryck i shellscript för att göra något mellan två klockslag, jag vill att ett scriptet inte ska köras mellan 23:55 och 00:05, då en backup görs, men annars varje minut i övrigt (har detta intervall inställt via cron, det funkar). If-uttrycket nedan ger ett felaktigt resultat då loggen visar att den fortsätter tolka tiden som mellan 23:55 och 00:05 varje gång klockan slår XX:X8 eller XX:X9 av någon anledning. Hur ska uttrycket se ut för att det ska bli rätt?

if (($currentTime < 235500 && $currentTime > 000500))

Någon ser säkert direkt vad jag gjort för fel, är ju bara en glad amatör

NOW=$(date +"%m-%d-%Y %H:%M") currentTime=$(date +"%H%M%S") echo "Current time is" $currentTime if (($currentTime < 235500 && $currentTime > 000500)) then **Do work** else echo "Nightly backup running..." $NOW >>log.log fi exit 0

Nightly backup running... 12-07-2016 23:55 Nightly backup running... 12-07-2016 23:56 Nightly backup running... 12-07-2016 23:57 Nightly backup running... 12-07-2016 23:58 Nightly backup running... 12-07-2016 23:59 Nightly backup running... 12-08-2016 00:00 Nightly backup running... 12-08-2016 00:01 Nightly backup running... 12-08-2016 00:02 Nightly backup running... 12-08-2016 00:03 Nightly backup running... 12-08-2016 00:04 Nightly backup running... 12-08-2016 00:08 Nightly backup running... 12-08-2016 00:09 Nightly backup running... 12-08-2016 00:18 Nightly backup running... 12-08-2016 00:19 Nightly backup running... 12-08-2016 00:28 Nightly backup running... 12-08-2016 00:29 Nightly backup running... 12-08-2016 00:38 Nightly backup running... 12-08-2016 00:39 Nightly backup running... 12-08-2016 00:48 Nightly backup running... 12-08-2016 00:49 Nightly backup running... 12-08-2016 00:58 Nightly backup running... 12-08-2016 00:59 Nightly backup running... 12-08-2016 01:08 Nightly backup running... 12-08-2016 01:09 Nightly backup running... 12-08-2016 01:18 Nightly backup running... 12-08-2016 01:19 Nightly backup running... 12-08-2016 01:28 Nightly backup running... 12-08-2016 01:29 Nightly backup running... 12-08-2016 01:38 Nightly backup running... 12-08-2016 01:39 Nightly backup running... 12-08-2016 01:48 Nightly backup running... 12-08-2016 01:49 Nightly backup running... 12-08-2016 01:58 Nightly backup running... 12-08-2016 01:59 Nightly backup running... 12-08-2016 02:08 Nightly backup running... 12-08-2016 02:09 Nightly backup running... 12-08-2016 02:18 Nightly backup running... 12-08-2016 02:19 Nightly backup running... 12-08-2016 02:28 Nightly backup running... 12-08-2016 02:29 Nightly backup running... 12-08-2016 02:38 Nightly backup running... 12-08-2016 02:39 Nightly backup running... 12-08-2016 02:48 Nightly backup running... 12-08-2016 02:49 Nightly backup running... 12-08-2016 02:58 Nightly backup running... 12-08-2016 02:59 Nightly backup running... 12-08-2016 03:08 Nightly backup running... 12-08-2016 03:09

Trädvy Permalänk
Medlem
Plats
Luleå
Registrerad
Jul 2008

Borde inte jämförelsen skrivas något liknande detta? (sjukt dålig på syntax i bash etc så kan finnas bättre sätt):
if [[ ( $currentTime < 235500 && $currentTime > 000500 ) ]];
then
* DO WORK*
else
echo "Nightly backup running..." $NOW >>log.log
fi

Gissar att de fallerar i din ifsats för att den tycker de är ett oktalt tal, dvs alla siffror större än 7 är inte tillåtna...

https://ubuntuforums.org/showthread.php?t=1402291

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jul 2004

Exempel jag testade med nyss med csh som fungerar mellan 7:30 och 8:30 (har inte testat midnatt):

#!/bin/sh now=`date +"%H%M%S"` if [ ${now} -gt 073000 ] & [ ${now} -lt 083000 ]; then # Between echo "Backup running..." else # Outside echo "Perform magic" fi

I ditt fall bör du skriva 235500 i första värdet och 000500 på andra för att det ska fungera.

Efter att ni har läst det här har ni insett att det inte gav något.

Trädvy Permalänk
Medlem
Plats
Luleå
Registrerad
Jan 2004
Skrivet av Kuufukuji:

Exempel jag testade med nyss med csh som fungerar mellan 7:30 och 8:30 (har inte testat midnatt):

#!/bin/sh now=`date +"%H%M%S"` if [ ${now} -gt 073000 ] & [ ${now} -lt 083000 ]; then # Between echo "Backup running..." else # Outside echo "Perform magic" fi

I ditt fall bör du skriva 235500 i första värdet och 000500 på andra för att det ska fungera.

Jag får det inte att fungera även om jag skriver uttrycket på ditt sätt. Om jag sätter "currentTime = 235700" dvs 23:57 på kvällen, så säger scriptet ändå att klockan är mellan 00:05 och 23:55? Den måste läsa av värdena fel på något sätt, men jag förstår inte hur?

EDIT: Tror att det funkar nu, satte bara "&&" istället för "&" i if-uttrycket och tog bort sekunderna från timestampen eftersom det egentligen är minuterna som är intressanta. Återkommer om det krånglar nåt mer, men stort tack för hjälpen