2010-04-16 12 views
11

Ho bisogno di creare uno script di shell bash a partire da un giorno e poi scorrere ogni giorno successivo la formattazione che l'uscita in% Y_% m_dbash data shell analisi, iniziare con la data e l'anello specifico attraverso ogni giorno nel mese

Immagino di poter inviare un giorno di inizio e poi un altro parametro per il numero di giorni.

Il mio problema/domanda è come impostare una DATA (che non è ora) e quindi aggiungere un giorno.

così il mio ingresso sarebbe 2010_04_01 6

mia uscita sarebbe

2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 

risposta

19
[[email protected] ~]$ cat a.sh 
#!/bin/bash 

START=`echo $1 | tr -d _`; 

for ((c=0; c<$2; c++)) 
do 
    echo -n "`date --date="$START +$c day" +%Y_%m_%d` "; 
done 

Ora, se si chiama questo script con i tuoi params tornerà quello che volevi:

[[email protected] ~]$ ./a.sh 2010_04_01 6 
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06 
2
#!/bin/bash 
inputdate="${1//_/-}" # change underscores into dashes 
for ((i=0; i<$2; i++)) 
do 
    date -d "$inputdate + $i day" "+%Y_%m_%d" 
done 
0

È possibile passare una data linea di comando tramite -d ad oggi GNU la gestione di più formati di input:

http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats

Passo data di inizio come argomento della riga di comando o utilizzare la data corrente:

underscore_date=${1:-$(date +%y_%m_%d)} 
date=${underscore_date//_/-} 

for days in $(seq 0 6);do 
    date -d "$date + $days days" +%Y_%m_%d; 
done 
-1

è possibile utilizzare gawk

#!/bin/bash 

DATE=$1 
num=$2 
awk -vd="$DATE" -vn="$num" 'BEGIN{ 
    m=split(d,D,"_") 
    t=mktime(D[1]" "D[2]" "D[3]" 00 00 00") 
    print d 
    for(i=1;i<=n;i++){ 
     t+=86400 
     print strftime("%Y_%m_%d",t) 
    } 
}' 

uscita

012.
$ ./shell.sh 2010_04_01 6 
2010_04_01 
2010_04_02 
2010_04_03 
2010_04_04 
2010_04_05 
2010_04_06 
2010_04_07 
1

Lo script bash di base dovrebbe essere in grado di farlo.

Script:
#!/Bin/bash

data_iniziale = 20.100.501
num_days = 5
for i in seq 1 $num_days
fanno
    data = date +%Y/%m/%d -d "${start_date}-${i} days"
    echo $ data # Usa questo come vuoi!
fatto

uscita:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

Nello script precedente, avviare la sequenza da '0' nel tuo caso invece di '1'. – anonymous

+0

Si noti inoltre che le tilde "' "sono scomparse (dalle parti ombreggiate) a causa della formattazione html. – anonymous

10

Lo script bash molto semplice dovrebbe essere in grado di fare questo:

#!/bin/bash 
start_date=20100501 
num_days=5 
for i in `seq 1 $num_days` 
do 
    date=date +%Y/%m/%d -d "${start_date}-${i} days" 
    echo $date # Use this however you want! 
done 

uscita:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

Fantastico! Soluzione davvero intelligente – ToinoBiclas

+1

Funzionerebbe solo per 1..30. Se è necessario eseguire l'iterazione per più di un mese, questa soluzione non funzionerebbe. – Marcel

6

Nota: nessuna delle soluzioni qui lavorerà con OS X. si avrebbe bisogno, per esempio, qualcosa di simile:

data -v-1D +% Y% m% d

questa sarebbe la stampa ieri per voi. O con sottolineature naturalmente:

data -v-1D +% Y_% M_% d

Quindi tenendo conto di, si dovrebbe essere in grado di regolare alcune delle anse in questi esempi con questo comando invece. L'opzione -v ti consentirà facilmente di aggiungere o sottrarre giorni, minuti, secondi, anni, mesi, ecc. -v + 24d aggiungerebbe 24 giorni. e così via.

1

È inoltre possibile utilizzare cal, ad esempio

YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done 

(originariamente pubblicato here on my commandlinefu account)

Problemi correlati