2010-10-21 38 views
6

Ho bisogno di incrementare minuti e secondi (in relazione al tempo) in una variabile.Tempo di incremento (minuti e secondi) nello script bash/shell

In primo luogo, io non sono sicuro se dichiarare una variabile 'tempo' è scritto come

time="00:00:00" 

o

time=$(date +00:00:00)? 

Da lì, voglio incrementare questa variabile da 10 minuti e secondi risultante in

01:00:00 aumentato a
01:10:10 a
01:20:20 ecc. (fino a mezzanotte - 00:00:00)

Quale sarebbe il modo migliore Per realizzare questo?

Capisco che fare $ date -d "2010-07-07 200 days" aggiunge (200) giorni ma non so come applicare questo esempio al tempo (minuti e secondi) e non alla data?

Tutte le risposte sono molto apprezzate.

+0

È necessario chiarire gli obiettivi e i vincoli che si hanno, soprattutto se si tratta di una domanda a casa (in tal caso, dovrebbe essere contrassegnata come tale).Eseguire un eseguibile esterno come 'date' molte volte in un ciclo può essere molto lento, ma può semplificare notevolmente il codice. Se hai bisogno di migliorare le prestazioni, dovrai codificare qualcosa di più complesso e fare l'incremento, il modulo e portare te stesso. Bash non ha un concetto di "variabile temporale". Se usi 'date' devi usare qualcosa che capisce (il tuo primo esempio, forse). Altrimenti dovrai usare le stringhe e gli interi di Bash. –

risposta

5

Si noti che questo è solo Linux. date -d su unix BSD (e forse altri) fa qualcosa di significativamente diverso (e spiacevole).

Si potrebbe utilizzare il tempo all'epoca - vale a dire, secondi dal 1 Gen 1970 00:00:00, ad esempio:

#!/bin/bash 

time=0 
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"` 
time=$((time + 600)) 
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"` 
time=$((time + 600)) 
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"` 

dà questo output:

$ /tmp/datetest.sh 
00:00:00 
00:10:00 
00:20:00 
$ 
+1

Si potrebbe voler aggiungere '-u' al comando date. –

+0

'+"% H:% M:% S "' è equivalente a '% T' afair –

+0

Ahimè, l'opzione' -d' di 'date' fa qualcosa di completamente diverso da ciò che si intenda in BSD unices e macOS. Questa soluzione è specifica per Linux, anche se la domanda non lo era. – ghoti

0

Il comando non è date parte di bash. È fornito dal tuo sistema operativo e il suo comportamento è diverso nei diversi sistemi operativi. In particolare, la data di GNU coreutils (nella maggior parte delle distribuzioni Linux) ha un'opzione -d utilizzata per interpretare le date di origine, mentre la data di BSD ha un'opzione -f per interpretare date di input formattate in modo specifico e un'opzione -v per la regolazione dei tempi da parte di varie unità.

Hai già una risposta accettata per l'opzione Linux. Per essere completa su questo, ecco un BSD (e MacOS) opzione:

$ for ((s=0; s<86400; s+=610)); do date -j -v+${s}S -f '%H:%M:%S' "$time" '+%T'; done | head -5 
00:00:00 
00:10:10 
00:20:20 
00:30:30 
00:40:40 

uscita qui è ovviamente tagliato a 5 righe.

Naturalmente, questo è ancora specifico della piattaforma. Se si desidera qualcosa che lavorerà con bash ovunque, quindi fino a quando si sta utilizzando bash> 4.2, il seguente potrebbe fare:

$ offset=$(printf '%(%z)T\n' 0) 
$ for ((s=$((${offset:1:2}*3600 + ${offset:3}*60)); s<86400; s+=610)); do printf '%(%T)T\n' "$s"; done | head -5 
00:00:00 
00:10:10 
00:20:20 
00:30:30 
00:40:40 

La variabile $offset ci permette di compensare il fatto che si può non essere in UTC. :) Come la soluzione date, questa procedura prevede incrementi di 610 secondi, ma utilizza il formato %T di printf per generare l'output. È possibile aggiungere o sottrarre l'offset del fuso orario al punto finale 86400 per ottenere un giorno intero di volte. Gestione che viene lasciata come esercizio per il lettore. :-)

Problemi correlati