2010-12-14 8 views
9

Funkcja daty na OS X (Snow Leopard) nie ma opcji --date takiej jak wersja GNU i nie jestem w stanie wymyślić, jak uzyskać równoważne z następujących na OS X:Pętla od daty rozpoczęcia do daty końcowej w skrypcie powłoki 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 

rozwiązany z odpowiedziami z 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

Cieszę się, że to działa dla ciebie. Nie jestem pewien, jaka wersja "bash' OSX ma (jeśli ma nawet bash), ale jeśli tak, powinieneś owijać swoje polecenia w' $() 'zamiast backticks takich jak' sDateTs = $ (date -j -f ...) 'i użyj podwójnego nawiasu' [['' zamiast pojedynczego '[' tak można zrobić 'podczas gdy [[" $ dateTS "<" $ eDateTs "]]' – SiegeX

Odpowiedz

1

Czytaj manpage datę poprzez uruchomienie man date i spojrzeć na opcji -v. Oto fragment:

-v Adjust (tj wziąć aktualną datę i wyświetli wynik korektę a nie faktycznie ustawić data) drugi, minuty, godziny, dni miesiąca, dzień tygodnia, miesiąc lub rok zgodny z art. Jeśli przed znakiem val jest znakiem plus lub minus, data jest dostosowana do przodu lub do tyłu zgodnie z do pozostałego ciągu znaków, w przeciwnym razie ustawiana jest odpowiednia część daty . Data może być dostosowywana tyle razy, ile jest wymagane przy użyciu tych flag. Flagi są przetwarzane w podanej kolejności.

+1

SiegeX, Zrobiłem to, ale nie mogę wymyślić jak zmienić coś innego niż wyjście daty z tą opcją. Innymi słowy, mogę dodać dzień do "teraz" z datą -j -v + 1d, ale jak dodać dzień do dowolnego dnia? –

+0

Problem z opcją -v to "bierz aktualną datę ..." (od strony podręcznika i powyżej). Nie chcę modyfikować bieżącej daty, muszę zmodyfikować dowolną datę - taką, którą określam. –

+0

@hglattergotz wygląda tak, że jedyną rzeczą, którą możesz zrobić, to zapisać bieżącą datę w zmiennej, a następnie ustawić datę na $ foldate i użyć '-v', aby uzyskać offset. Na koniec ustaw datę powrotu do oryginalnej wartości – SiegeX