Macos 在Mac OS X shell脚本中从开始日期循环到结束日期
OS X(Snow Leopard)上的date函数没有GNU版本那样的--date选项,我无法弄清楚如何在OS X上获得以下等价项:Macos 在Mac OS X shell脚本中从开始日期循环到结束日期,macos,bash,shell,date,Macos,Bash,Shell,Date,OS X(Snow Leopard)上的date函数没有GNU版本那样的--date选项,我无法弄清楚如何在OS X上获得以下等价项: startdate=2010-01-01 enddate=2010-01-31 foldate="$startdate" until [ "$foldate" == "$enddate" ] do # do something with the date here - like pass it as a parameter to a command
startdate=2010-01-01
enddate=2010-01-31
foldate="$startdate"
until [ "$foldate" == "$enddate" ]
do
# do something with the date here - like pass it as a parameter to a command
foldate=`/bin/date --date "$foldate 1 day" +%Y-%m-%d`
done
用SiegeX的答案解决:
startdate=2010-01-01
enddate=2010-01-31
sDateTs=`date -j -f "%Y-%m-%d" $startdate "+%s"`
eDateTs=`date -j -f "%Y-%m-%d" $enddate "+%s"`
dateTs=$sDateTs
offset=86400
while [ "$dateTs" -le "$eDateTs" ]
do
date=`date -j -f "%s" $dateTs "+%Y-%m-%d"`
printf '%s\n' $date
dateTs=$(($dateTs+$offset))
done
通过运行
man-date
阅读日期手册页,并查看-v
选项。以下是摘录:
-v调整(即采取
当前日期并显示结果
调整;未实际设置
日期)第二天、分钟、小时、月日、星期日,
根据val.If的月份或年份
val前面有加号或减号,日期为
向前或向后调整
相符合的
到剩余字符串,否则为
日期已定。日期可以是
根据需要使用这些标志进行多次调整。旗帜是
按照给定的顺序处理
SiegeX,我这样做了,但我不知道如何使用该选项更改日期输出以外的任何内容。换句话说,我可以用日期-j-v+1d向“现在”添加一天,但如何向任意的一天添加一天?使用-v的问题是“使用当前日期…”(从主页和上面)。我不想修改当前日期,我需要修改任意日期-我指定的日期。@hGlaterGotz看起来您唯一能做的就是将当前日期保存到一个变量中,然后将日期设置为$foldate,并使用
-v
获取该日期的偏移量。最后将日期设置回原来的日期value@hglattergotz实际上,另一个选项是将偏移值转换为秒,然后通过-j-f“%Y-%m-%d”$foldate“+%s”
将$foldate转换为历元。将该历元值以秒为单位添加到偏移量中,并通过-j-f“%s”$epoch\u plus\u seconds“+%Y-%m-%d”
@SeigeX将其转换回日期,谢谢最后的提示。现在开始工作了。我将把这个例子作为单独的答案发布,因为我似乎无法在评论中正确地格式化它。很高兴看到这对你们有用。我不确定OSX有什么版本的bash
OSX(如果它甚至有bash),但是如果有,你应该用$()
来包装你的命令,而不是像sDateTs=$(date-j-f…
这样的反勾号,并且使用双括号[
而不是一个[
,这样你就可以在[[“$dateTS”<“$eDateTs]”时执行]
偏移的目的是什么?为什么需要它?请注意,在[
中使用=
比使用=
更安全,因为使用=
是一个扩展,并非所有基线POSIX shell都支持,而=
是由定义的。