我创建了这个循环,仅在 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
脚本: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
答案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 。bash
ksh93
zsh
答案3
有dateseq
(有时称为dseq
或dateutils.dseq
)dateutils
:
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)也具有此功能,但语法不同。
其他替代方案包括 GNUawk
或perl
.