Há o dateseq (às vezes chamado dseq ou dateutils.dseq ) de dateutils para isso:
dateseq -{i,f}%Y%m%d 20170301 20170831
Dos três shells que suportam essa sintaxe for ((...)) ( ksh93 (de onde vem), zsh e bash ) dois têm suporte interno para isso, embora de maneiras diferentes:
ksh93
for ((i = 20170301; i<=20170831; i=$(TZ=UTC0 printf '%(%Y%m%d)T' "$i 24:00")))
do
echo "$i"
done
zsh
zmodload zsh/datetime
for ((i = 20170301; i<=20170831;)); do
echo "$i"
TZ=UTC0 strftime -rs s %Y%m%d $i
TZ=UTC0 strftime -s i %Y%m%d $((s + 86400))
done
bash
O printf do shell GNU também suporta ksh93 -like %T , mas apenas para formatação, não para datas de análise. No entanto, onde bash está disponível, o GNU date está frequentemente disponível e várias respostas foram dadas para isso.
Outras implementações de date como o busybox ou o BSD também têm a capacidade, mas com uma sintaxe diferente.
Outras alternativas incluem o GNU awk ou perl .