8

I need to generate strings with all days in a year

ex:

MIN_DATE=01.01.2012

MAX_DATE=31.12.2012

for date in {1...366..1}
 do
 echo ...
done
Lev Levitsky
  • 63,701
  • 20
  • 147
  • 175
Dmitry Dubovitsky
  • 2,186
  • 1
  • 16
  • 24

3 Answers3

12
for d in {0..365}; do date -d "2012-01-01 + $d days" +'%d.%m.%Y'; done
Lev Levitsky
  • 63,701
  • 20
  • 147
  • 175
2

Not a pure bash solution, but my dateutils can help:

dseq 01.01.2012 31.12.2012 -f %d.%m.%Y -i %d.%m.%Y
=>
  01.01.2012
  02.01.2012
  ...
  31.12.2012

Output format can be configured with -f and input format with -i.

hroptatyr
  • 4,702
  • 1
  • 35
  • 38
1

Using an ISO 8601 date format (year-month-day), you can compare dates lexicographically. It's a little messier than I'd like, since bash doesn't have a "<=" operator for strings.

year=2011
d="$year-01-01"
last="$(($year+1))-01-01"
while [[ $d < $last ]]; do
    echo $d
    d=$(date +%F --date "$d + 1 day")
done
chepner
  • 497,756
  • 71
  • 530
  • 681
  • Comparing years lexicographically is a bad idea if your years can have a different number of digits. For example `d="999-01-01"; last="1000-01-01"` will produce no output. – Boris Verkhovskiy Aug 30 '19 at 06:35
  • 1
    ISO-8601 requires at least 4 digits for the year (although the problem will arise if you are trying to avoid a Y10k problem). – chepner Aug 30 '19 at 12:34