【问题标题】:Loop from start date to end date in Mac OS X shell script在 Mac OS X shell 脚本中从开始日期循环到结束日期
【发布时间】:2010-12-14 00:20:36
【问题描述】:

OS X (Snow Leopard) 上的日期函数没有 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
    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

【问题讨论】:

  • 很高兴看到这对您有用。我不确定bash OSX 有什么版本(如果它甚至有 bash),但如果有的话,你应该用$() 包装你的命令,而不是像sDateTs=$(date -j -f ...) 这样的反引号,并使用双括号[[ 而不是一个[ 所以你可以做while [[ "$dateTS" < "$eDateTs" ]]
  • 偏移量的目的是什么?为什么需要它?
  • 请注意,在[ 中使用= 比使用== 更安全,因为== 的使用不是所有baseline-POSIX shell 都支持的扩展,而= 定义为the POSIX standard for test.

标签: macos bash shell date


【解决方案1】:

通过运行man date 阅读您的日期手册页并查看-v 选项。摘录如下:

-v 调整(即,取 当前日期并显示结果 调整;实际上没有设置 日期)秒、分、时、月、日、星期、 根据 val 的月份或年份。如果 val 前面有一个加号或减号,日期是 向前或向后调整 根据 到剩余的字符串,否则的相关部分 日期已定。日期可以 使用这些标志根据需要调整多次。标志是 按照给定的顺序处理。

【讨论】:

  • SiegeX,我做到了,但除了使用该选项的日期输出之外,我不知道如何更改任何内容。换句话说,我可以用 date -j -v+1d 将一天添加到“现在”,但是我如何将一天添加到任意一天?
  • -v 的问题是“获取当前日期...”(来自手册页及以上)。我不想修改当前日期,我需要修改任意日期 - 我指定的日期。
  • @hglattergotz 看起来您唯一能做的就是将当前日期保存到变量中,然后将日期设置为 $foldate 并使用 -v 从中获取偏移量。最后将日期设置回原来的值
  • @hglattergotz 实际上,另一种选择是将您的偏移值转换为 seconds 然后通过-j -f "%Y-%m-%d" $foldate "+%s" 将您的 $foldate 转换为纪元。将该纪元值添加到您的偏移量(以秒为单位),然后通过 -j -f "%s" $epoch_plus_seconds "+%Y-%m-%d" 将其转换回日期
  • @SeigeX,感谢最后的提示。现在可以工作了。将示例作为单独的答案发布,因为我似乎无法在评论中正确格式化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多