【发布时间】:2015-02-26 14:52:02
【问题描述】:
我有一个 bash 脚本,参数中有 2 个日期。我想通过使用日期在这两个日期之间循环。所以我写了这段代码:
START_DATE=$1
END_DATE=$2
for ((date=$START_DATE; date != "$END_DATE + 1"; ));do
echo $END_DATE
date="$(date --date="$date + 1 days" +'%Y%m%d')"
done
我的日期是这样的格式:例如 20150226
所以我的脚本运行良好,直到 END_DATE 是这个月底(例如 20150228、20141231 20150131 ...)
对于这个错误你有什么建议吗?
谢谢
【问题讨论】:
-
不要对非数字(日期戳)值使用数字数学。或者,如果您想在几秒钟内使用值。
-
那我应该用什么?
-
将时间戳转换为从纪元开始的秒数(在数字上可用)或找到其他方法来检测范围循环的结束。
-
请注意:如果
END_DATE是20150228,那么ENDDATE+1是20150229。因为它不是闰年,date永远不会等于那个,你会得到一个无限循环。您可以执行 'ENDDATE_PLUS_ONE=$(date --date="$END_DATE + 1 days" +'%Y%m%d')',然后进行比较。 -
Etan -- 有几根尖锐的秒针 -- 即由于夏令时。如果您在春季增加 24 小时,您可能会缺少 $END_DATE。您可以通过比较(使用小于)与 END_DATE 加上十二小时来解决这个问题,但这似乎不直观。
标签: bash shell date unix unix-timestamp