Como executar um loop for em 5 meses?

3

Eu criei este loop que ativa meu script somente em 1 mês (20170301 - 20170331):

for ((i = 20170301; i<=20170331; i++)) ; do /home/jul/exp/prod/client/apps/scripts/runCer client-layer-name $i; done

mas eu quero que ele seja executado em 5 meses (entre 20170301 -20170831), como posso fazer isso?

    
por roy roy 15.09.2017 / 11:36

3 respostas

3

Supondo que o% GNUdate esteja disponível, você pode usar este script bash / ksh93 / zsh :

start=$(date -ud 20170301 "+%s") # start time in epoch time (seconds since Jan. 1st, 1970)
end=$(date -ud 20170831 "+%s") # end time 

for ((i=start; i <= end; i+=86400)); do # 86400 is 24 hours
    runCerclient-layer-name "$(date -ud "@$i" +%Y%m%d)"
done
    
por 15.09.2017 / 11:53
2

Esse loop é executado por 5 * 30 dias, começando em 20170301:

for (( i=0; i <= 150; ++i )); do
    thedate=$( date -d "20170301 + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Isso não nos leva até 20170831, então ...

Este é executado a partir de uma data até atingirmos uma data final específica:

startdate='20170301'
thedate=$startdate

for (( i=0; thedate != 20170831; ++i )); do
    thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Isso usa uma data de início e calcula a data final de 5 meses para o futuro a partir dessa data e, em seguida, faz um loop lá:

startdate='20170301'
enddate=$( date -d "$startdate + 5 months" "+%Y%m%d" )

thedate=$startdate

for (( i=0; thedate != enddate; ++i )); do
    thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
    printf 'The date is "%s"\n' "$thedate"
done

Isso pressupõe o% GNUdate e um shell como bash , ksh93 ou zsh .

    
por 15.09.2017 / 11:51
0

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 .

    
por 15.09.2017 / 13:19

Tags