2010-12-14 10 views
9

La funzione di data su OS X (Snow Leopard) non ha l'opzione --date come la versione GNU e non sono in grado di capire come ottenere equivalente del seguente su OS X:Loop dalla data di inizio alla data di fine nello script di shell di 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 

risolto con risposte da 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

Felice di vedere che funziona per voi. Non sono sicuro di quale versione di 'bash' OSX abbia (se abbia anche bash), ma se lo fa dovresti includere i comandi in' $() 'invece di apici come' sDateTs = $ (date -j -f ...) 'e usa le parentesi doppie' [['invece di un singolo' ['così puoi fare' mentre [["$ dateTS" <"$ eDateTs"]] ' – SiegeX

risposta

1

Leggi pagina di manuale di data eseguendo man date e guardare l'opzione -v. Ecco un estratto:

-v Regolare (vale a dire, prendere la data corrente e visualizzare il risultato della della regolazione; in realtà non impostare la data) il secondo, minuto, ora, giorno mese, giorno della settimana, mese o anno secondo il val. Se val è preceduto da un segno più o meno, la data è spostata in avanti o indietro in base allo alla stringa rimanente, altrimenti viene impostata la parte rilevante della data . La data può essere regolata quante volte è necessario utilizzando questi flag. Le bandiere sono elaborate nell'ordine indicato.

+1

SiegeX, l'ho fatto, ma non riesco a capire fuori come vorrei cambiare qualcosa di diverso dal risultato della data con tale opzione. In altre parole, posso aggiungere un giorno a "ora" con data -j -v + 1d, ma come aggiungerei un giorno a un giorno arbitrario? –

+0

Il problema con -v è "prendi la data corrente ..." (dalla manpage e sopra). Non voglio modificare la data corrente, ho bisogno di modificare una data arbitraria - quella che specifichi. –

+0

@hglattergotz sembra che l'unica cosa che puoi fare è salvare la data corrente su una variabile, quindi impostare la data sul $ foldate e usare '-v' per ottenere l'offset da quello. Infine imposta nuovamente la data sul suo valore originale – SiegeX

Problemi correlati