如何在 5 个月内运行 for 循环?

如何在 5 个月内运行 for 循环?

我创建了这个循环,仅在 1 个月(20170301 - 20170331)激活我的脚本:

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

但我希望它运行 5 个月(20170301 -20170831 之间),我该怎么做?

答案1

假设 GNUdate可用,您可以使用这个//bash脚本:ksh93zsh

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

答案2

该循环运行 5*30 天,从 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

但这并没有把我们带到 20170831,所以......

这个日期从一个日期开始,直到我们达到特定的结束日期为止:

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

它使用开始日期并计算从该日期起 5 个月后的结束日期,然后循环:

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

这假设 GNU和像, , 或 之date类的 shell 。bashksh93zsh

答案3

dateseq(有时称为dseqdateutils.dseqdateutils

dateseq -{i,f}%Y%m%d 20170301 20170831

for ((...))在支持该语法(ksh93(它来自哪里)zsh和)的 3 个 shell 中,bash有两个具有对此的内置支持,尽管方式不同:

克什93

for ((i = 20170301; i<=20170831; i=$(TZ=UTC0 printf '%(%Y%m%d)T' "$i 24:00")))
do
   echo "$i"
done

桀骜

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

巴什

GNU shellprintf也支持ksh93-like %T,但仅用于格式化,而不用于解析日期。然而,只要bash有可用的地方,GNUdate通常都是可用的,并且对此已经给出了几个答案。

其他date实现(例如 busybox 或 BSD)也具有此功能,但语法不同。

其他替代方案包括 GNUawkperl.

相关内容