我是新来的Linux。 如何在指定的date范围内打印和存储date。
例如,我有startdate = 2013-03-01和enddate = 2013-03-25; 我想打印该范围内的所有date。
提前致谢
只要日期是YYYY-MM-DD格式,就可以按照字典顺序对它们进行比较,并让date
执行日历算术,而不先转换为秒:
startdate=2013-03-15 enddate=2013-04-14 curr="$startdate" while true; do echo "$curr" [ "$curr" \< "$enddate" ] || break curr=$( date +%Y-%m-%d --date "$curr +1 day" ) done
使用[ ... ]
,您需要转义<
以避免与输入重定向操作符混淆。
如果它大于结束日期,则具有打印开始日期的疣。
如果你想要“最近”的日期是一个替代是:
echo {100..1} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y-%m-%d"
显然不适用于任意的日期范围。
使用date
将您的日期转换为秒,做一点数学和转换:
#/bin/bash dstart=2013-03-01 dend=2013-03-25 # convert in seconds sinch the epoch: start=$(date -d$dstart +%s) end=$(date -d$dend +%s) cur=$start while [ $cur -le $end ]; do # convert seconds to date: date -d@$cur +%Y-%m-%d let cur+=24*60*60 done
有关日期参数的更多信息,请参阅man date
..
另一种选择是使用dateseq
的dateutils
( http://www.fresse.org/dateutils/#dateseq ):
$ dateseq 2013-03-01 2013-03-25 2013-03-01 2013-03-02 2013-03-03 2013-03-04 2013-03-05 2013-03-06 2013-03-07 2013-03-08 2013-03-09 2013-03-10 2013-03-11 2013-03-12 2013-03-13 2013-03-14 2013-03-15 2013-03-16 2013-03-17 2013-03-18 2013-03-19 2013-03-20 2013-03-21 2013-03-22 2013-03-23 2013-03-24 2013-03-25
稍微改进版本
#!/bin/bash startdate=2013-03-15 enddate=2013-04-14 curr="$startdate" while true; do [ "$curr" \< "$enddate" ] || { echo "$curr"; break; } echo "$curr" curr=$( date +%Y-%m-%d --date "$curr +1 day" ) done