Newsgroup: it.comp.os.linux.sys
Titolo: Bash script e comparazione date

Qualcuno saprebbe dirmi se e come posso verificare se sono 
"all'interno" di un intervallo di ore?
Esempio, tra le 23:00 e le 07:00 dormo, altrimenti sono sveglio.
 
-- 
J.
 
 


date +%H ?

Nel suo scritto precedente, zava ha sostenuto :

mi stampa l'ora (senza i minuti)
conosco il comando, ma forse non del tutto, non ti seguo :-)
posso fare che 01:22 e' maggiore di 23:00? in reala e' minore.
Il problema e' che non so come fare a capire di essere all'interno di 
ore notturne.
 
-- 
J.
 
 

 ore notturne.
 
HOUR=$(date '+%H')
[ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte
 
 
-- 
Flavio Visentin
 
Scientists discovered what's wrong with the female brain: on the left
side, there's nothing right, and on the right side, there's nothing left

 Esempio, tra le 23:00 e le 07:00 dormo, altrimenti sono sveglio.
 
1) usare PERL
2) usare la data in formato UNIX e controllare con due semplici if
3) scrivere delle routine per la manipolazione del tempo

 [ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte
 
Cavolate. Cerca di capire il problema prima di rispondere.
 

 ....
 
Non ho capito, forse sono ancora addormentato.
Ho cancellato messaggio precedente, mi scuso se si dovesse 
essere già propagato.
 
 


Il concetto è che se il secondo numero dell'intervallo è più piccolo del 
primo... allora vorrà dire che c'è la mezzanotte in mezzo. Chiaro 'sto 
fatto?
Allora, dato l'intervallo da ora X a ora Y, se si verifica questa 
condizione allora il secondo numero sarà uguale a Y+24
 
Trasforma questo in un paio di righe di script ed il gioco è fatto.
 
Per quanto riguarda la notazione dell'ora, poiché il punto è il separatore 
dei decimali che puoi usare con "bc -l", dovresti usare: date +%H.%M
 
 


tratta le 01:22 come se fossero le 25:22 e risolvi :)
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 ore notturne.
 
Magari usando *due* intervalli?
 
Uno da, per esempio, 22:00 a 23:59 e l'altro
da 00:00 a 07:00...
 
In "or" ovviamente...
 
bye,
 
-- 
 
piergiorgio
 
 

 Magari usando *due* intervalli?
...
 
Un altro modo, volendo per esempio l'intervallo
22:00-07:00, e farsi dare l'orario attuale piu`
due ore.
Cosi` non resta che controllare l'intervallo
00:00-09:00.
 
Come fare questo, e` lasciato per esercizio
allo studente :-)
 
bye,
 
-- 
 
piergiorgio
 
 


il problema è che lui non dice cosa vuole fare dopo....
Ipotizziamo che voglia sapere quante ore ci sono dalle 23:00 alle 7:00.
Poiché è posto che l'intervallo del quale lui parla è comunque 
"crescente", se il secondo numero è più piccolo vuol dire che c'è 
mezzanotte in mezzo (sempre e comunque).
 
Pertanto:
se [ secondo_numero -lt primo_numero ]; allora
   7=7+24
es
E quindi sottrae il primo al secondo: 31 - 23 = 8
mi pare la cosa più sensata... se mette pure i minuti la cosa si incasina 
perché può andare in negativo e dovrà togliere un'ora.
Io trasformerei i sessagesimali in decimali, farei quindi la sottrazione e 
trasformerei il risultato nuovamente in sessagesimale :)

On 07/18/2012 11:30 PM, Max_Adamo wrote:
[...]
 
L'OP scrive di voler sapere quando e` "all'interno
di ore notturne".
 
Quindi, per esempio, dalle 23:00 alle 05:00.
E` chiaro che non puo` confrontare 01:22 (orario
attuale) con 23:00 allo stesso modo con cui
confronta 01:22 con 05:00...
 
Quindi deve fare due confronti separati, ovvero
confrontare l'orario attuale + offset, in modo
da tornare in un sistema di riferimento opportuno.
 
bye,
 
-- 
 
piergiorgio
 
 

 trasformerei il risultato nuovamente in sessagesimale :)
 
Quanti giri.... :)
 
START=23:09:24
END=01:22:23
echo $(((`date -d "tomorrow $END" '+%s'` - \
         `date -d "$START" '+%s'`) / 3600 % 24 ))


 trasformerei il risultato nuovamente in sessagesimale :)
 
La "richiesta" e' semplice.
Data un'ora di "partenza" xx:yy, un'ora di fine "xx:yy" e l'ora attuale 
xx:yy, restituire true che l'ora attuale e' compresa nell'intervallo.
 
Non posso soffermarmi sulla sola ora, devo considerare anche i minuti.
 
*Ad esempio*
devi verificare l'ora attuale 01.10 se e' compresa tra le 22.30 e le 
07.15
come procedi?
 
-- 
J.
 
 

 come procedi?
 
VENTITRE=82800   # cioe' ore 23:00:00
SETTE=25200      # cioe' ore 07:00:00
 
ORE="$(date "+%H")"
MIN="$(date "+%M")"
SEC="$(date "+%S")"
 
let ATTUALE="$ORE*3600 + $MIN*60 + $SEC"
 
E poi: se $ATTUALE < $SETTE oppure > $VENTITRE; then
dormo
else
non faccio un caxxo; fi
 
(Da guardare e sistemare tutta la sintassi, sto andando a memoria).
 
-- 
Tanti saluti
 

Sembra che Yoda abbia detto :

ottimo metodo. grazie :D
 
-- 
J.
 
 

 [ $HOUR -ge 7 ] && [ $HOUR -lt 23 ] && echo giorno || echo notte
 
In effetti, questa e` ancora piu` "smart"!
 
bye,
 
-- 
 
piergiorgio
 
 

 come procedi?
 
Scusa, ma non ti abbiamo gia` abbondantemente risposto?
 
Per prima cosa, basta scrivere ora e minuti senza alcun
separatore, cioe` 0110 per 01:10, ovvero 2230 per 22:30.
 
Questi sono sempre e comunque numericamente ordinati.
 
Poi hai tutte le possibilita` che ti sono state suggerite
precedentemente.
 
Sei si vuole controllare di essere dentro un intervallo ed
il problema e` il passaggio della mezzanotte si puo`:
 
1) controllare l'intervallo complementare
2) fare due controlli
3) aggiungere un offset (prima di estrarre l'orario) in modo
tale non cadere a cavallo della mezzanotte
 
Ovviamente i dettagli dello script sono per il
tuo personale divertimento... :-)
 
bye,
 
-- 
 
piergiorgio
 
 

 Scusa, ma non ti abbiamo gia` abbondantemente risposto?
 
si, grazie di cuore.
 
-- 
J.
 
 

          `date -d "$START" '+%s'`) / 3600 % 24 ))
 
Tranquillo: abbiamo pisciato *tutti* fuori dal vaso. Ha ragione Malin... 
bisogna usare l'ora Unix: date +%s

 07.15 come procedi?
 
 
come già scritto: abbiamo cannato tutti (tranne uno).
Ha ragione malin: date +%s
Tutto il resto non ha senso.

 Tutto il resto non ha senso.
 
Tutto il resto che *tu* hai scritto non ha senso...
 
bye,
 
-- 
 
piergiorgio
 
 


Diciamo pure che oltre a pisciar fuori dal vaso non sai nemmeno leggere
quel che quoti.


 quel che quoti.
 
e mi sa tanto.... cavolo :)
p.s.: comunque tu, invece, non c'era bisogno che mi facevi lo svolgimento 
dell'esercizietto :)


 
non mi pare complicato.
più in generale:
 
 
START=22:30:00
END=1:18:00
 
EPOCHNOW=$(date +%s)
EPOCHSTART=$(date --date="$START" +%s)
EPOCHEND=$(date --date="$END" +%s)
 
if (( $EPOCHEND > $EPOCHSTART )); then BOOL='&&'; else BOOL='||'; fi
 
if (( $EPOCHEND > $EPOCHNOW $BOOL $EPOCHNOW > $EPOCHSTART ))
    then echo "sono dentro"
    else echo "sono fuori"
fi
 

 più in generale:
 
Ma e` molto piu` semplice usare direttamente
l'orario, specialmente come suggerito da Flavio.
 
bye,
 
-- 
 
piergiorgio