2010-10-21 7 views
6

Je dois incrémenter les minutes et les secondes (par rapport à l'heure) dans une variable.Temps d'incrémentation (minutes et secondes) dans le script bash/shell

D'abord, je ne suis pas sûr que la déclaration d'une variable 'temps' est écrit

time="00:00:00" 

ou

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

À partir de là, je veux augmenter cette variable en 10 minutes et secondes résultant en

01:00:00 augmenté à
01:10:10 à
01:20:20 etc (tout le chemin jusqu'à minuit - 00:00:00)

Quelle serait la meilleure façon pour y parvenir?

Je comprends que faire $ date -d "2010-07-07 200 days" ajoute (200) jours mais je ne sais pas comment appliquer cet exemple à l'heure (minutes et secondes) et pas la date?

Toutes les réponses sont très appréciées.

+0

Vous devriez clarifier les objectifs et les contraintes que vous avez, surtout s'il s'agit d'une question de devoirs (si oui, cela devrait être étiqueté comme tel).Exécuter un exécutable externe tel que 'date' plusieurs fois dans une boucle peut être très lent, mais peut grandement simplifier le code. Si vous avez besoin d'améliorer la performance, vous devrez coder quelque chose de plus complexe et faire l'incrémentation, le module et le porter vous-même. Bash n'a pas de concept de "variable temps". Si vous utilisez 'date', vous devez utiliser quelque chose qu'il comprend (votre premier exemple, peut-être). Sinon, vous devrez utiliser les chaînes et les entiers de Bash. –

Répondre

5

Notez que ceci est uniquement Linux. date -d sur BSD unixes (et éventuellement d'autres) fait quelque chose de significativement différent (et fâcheux).

Vous pouvez utiliser le temps époque - c.-à-secondes depuis le 1er janvier 1970 à 00:00:00, par exemple:

#!/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"` 

donne cette sortie:

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

Vous pouvez ajouter '-u' à la commande date. –

+0

'+"% H:% M:% S "' équivaut à '% T' afair –

+0

Hélas, l'option' -d' de 'date' fait quelque chose de complètement différent de ce que vous voulez dans les BSD Unices et macOS. Cette solution est spécifique à Linux, même si la question ne l'était pas. – ghoti

0

La commande date n'est pas une partie de bash. Il est fourni par votre système d'exploitation et son comportement diffère selon les systèmes d'exploitation. Notamment, la date GNU coreutils (dans la plupart des distributions Linux) a une option -d utilisée pour interpréter les dates source, tandis que la date BSD a une option -f pour interpréter les dates d'entrée spécifiquement formatées et une option -v pour ajuster les temps par différentes unités.

Vous avez déjà une réponse acceptée pour l'option Linux. Pour être complet à ce sujet, voici une option BSD (et Mac OS):

$ 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 

sortie est évidemment coupé ici 5 lignes.

Bien sûr, il s'agit toujours d'une plate-forme spécifique. Si vous voulez quelque chose qui fonctionnera avec bash partout, puis aussi longtemps que vous utilisez bash> 4.2, ce qui suit pourrait faire:

$ 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 variable $offset nous permet de compenser le fait que vous pouvez ne pas être en UTC. :) Comme la solution date, cette étape passe par des incréments de 610 secondes, mais utilise le format de printf pour générer une sortie. Vous pouvez avec ajouter ou soustraire le décalage de fuseau horaire au point final 86400 pour obtenir une journée complète de fois. La manipulation est laissée comme un exercice pour le lecteur. :-)

Questions connexes