2010-04-16 8 views
11

trzeba utworzyć skryptu bash'a począwszy od dnia, a następnie pętli każdego następnego dnia formatowania wyjścia jako% Y_% m_datakujących Data powłoki analizowany początek określonej daty i pętli każdego dnia w dniach

Sądzę, że mogę przesłać dzień rozpoczęcia, a następnie inny parametr dotyczący liczby dni.

Moje pytanie/pytanie brzmi: jak ustawić DATE (to nie jest teraz), a następnie dodać dzień.

więc mój wkład będzie 2010_04_01 6

mój wynik byłby

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

Odpowiedz

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 

Teraz, jeśli nazwać ten skrypt ze swoimi params powróci czego chciał:

[[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

można przekazać datę pośrednictwem opcji wiersza poleceń -d aktualne GNU obsługi wielu formatów wejściowych:

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

Przełęcz datę rozpoczęcia jako argument wiersza poleceń lub użyj bieżącą datę:

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

można użyć 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) 
    } 
}' 

wyjście

$ ./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

Bardzo prosty skrypt bash powinien być w stanie to zrobić.

Script:
#!/Bin/bash

data_rozpoczęcia = 20100501
num_days = 5
dla I w seq 1 $num_days
zrobić
    date = date +%Y/%m/%d -d "${start_date}-${i} days"
    echo $ data # Użyj tego, jak chcesz!
zrobić

wyjściowa:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

W powyższym skrypcie uruchomić sekwencję od „0” w przypadku zamiast „1”. – anonymous

+0

Należy również zauważyć, że tyldy "" "zaginęły (z zacienionych części) z powodu formatowania html. – anonymous

10

Bardzo prosty skrypt bash powinien być w stanie to zrobić:

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

wyjściowa:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26

+0

Awesome! Naprawdę sprytne rozwiązanie – ToinoBiclas

+1

To działałoby tylko dla 1.30. Jeśli potrzebujesz iteracji przez więcej niż jeden miesiąc, to rozwiązanie nie zadziałałoby. – Marcel

6

Uwaga: Żaden z rozwiązań tutaj będzie działać z systemem OS X, co jest potrzebne, na przykład coś takiego:

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

to by wydrukować wczoraj dla Ciebie. Lub podkreślenia przedmiotu:

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

więc biorąc to pod uwagę, należy być w stanie dostosować niektóre z pętli w tych przykładach z tego polecenia zamiast. Opcja -v umożliwia łatwe dodawanie lub odejmowanie dni, minut, sekund, lat, miesięcy itd. -v + 24d dodaje 24 dni. i tak dalej.

1

Można również użyć cal np

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

(pierwotnie opublikowany here on my commandlinefu account)

Powiązane problemy