2010-12-14 13 views
9

La fonction de date sous OS X (Snow Leopard) n'a pas l'option --date comme la version GNU et je ne suis pas en mesure de comprendre comment obtenir le équivalent de ce qui suit sur OS X:Boucle de la date de début à la date de fin dans le script shell Mac OS X

startdate=2010-01-01 
enddate=2010-01-31 
foldate="$startdate" 

until [ "$foldate" == "$enddate" ] 
do 
    # do something with the date here - like pass it as a parameter to a command 
    foldate=`/bin/date --date "$foldate 1 day" +%Y-%m-%d` 
done 

SOLVED avec des réponses de SiegeX:

startdate=2010-01-01 
enddate=2010-01-31 

sDateTs=`date -j -f "%Y-%m-%d" $startdate "+%s"` 
eDateTs=`date -j -f "%Y-%m-%d" $enddate "+%s"` 
dateTs=$sDateTs 
offset=86400 

while [ "$dateTs" -le "$eDateTs" ] 
do 
    date=`date -j -f "%s" $dateTs "+%Y-%m-%d"` 
    printf '%s\n' $date 
    dateTs=$(($dateTs+$offset)) 
done 
+0

Heureux de voir que cela fonctionne pour vous. Je ne suis pas sûr de la version de 'bash' OSX (si elle a même bash), mais si c'est le cas, vous devriez envelopper vos commandes dans' $() 'au lieu de backticks comme' sDateTs = $ (date -j -f ...) 'et utiliser des doubles crochets' [['au lieu d'un seul' [donc vous pouvez faire 'alors que [[" $ dateTS "<" $ eDateTs "]]' – SiegeX

Répondre

1

Lire la page de manuel de votre date en exécutant man date et regarder l'option -v. Voici un extrait:

-v Ajuster (c.-à-prendre la date actuelle et afficher le résultat de l'ajustement, pas réellement mis la date), la seconde, minute, heure, jour de mois, jour de la semaine, mois ou année selon val. Si val est précédé d'un signe plus ou moins, la date est ajustée en avant ou en arrière en fonction de la chaîne restante, sinon la partie correspondante de la date est définie. La date peut être ajustée autant de fois que nécessaire en utilisant ces drapeaux. Les drapeaux sont traités dans l'ordre donné.

+1

SiegeX, je l'ai fait, mais ne peux pas comprendre comment je changerais autre chose que la sortie de la date avec cette option. En d'autres termes, je peux ajouter un jour à "maintenant" avec la date -j -v + 1d, mais comment ajouter un jour à un jour arbitraire? –

+0

Le problème avec -v est "prenez la date actuelle ..." (à partir de la page de manuel et ci-dessus). Je ne veux pas modifier la date actuelle, j'ai besoin de modifier une date arbitraire - celle que je spécifie. –

+0

@hglattergotz ressemble à la seule chose que vous pouvez faire est d'enregistrer la date actuelle dans une variable, puis définissez la date à $ foldate et utilisez '-v' pour obtenir le décalage de cela. Enfin, remettez la date à sa valeur d'origine – SiegeX

Questions connexes