从通过arg提供的日期计算第二天的日期的技术?

SDG*_*ero 2 linux bash scripting cron date

我在解决这个问题时遇到了一些麻烦.

我有一个脚本,用于检查脚本调用指定的日期之后生成的日志文件.这是因为直到第二天才会获取为指定日期数据提取的文件.当cron在早上运行时,日志文件将在第二天的文件名中包含时间戳,而不是arg指定的日期.我需要保持arg相同,因为我们组的标准约定只指定数据引用的日期,而不是cron作业提取的日期.该日期(在此脚本中以$ NOW存储)对其他操作使用了很多.

所以现在我正在做这个疯狂的嵌套条件事件(实际上有效,但我觉得它很可怕):

#Setup the date, and variables
TENANT=$1
DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
NOW=$YEAR$MONTH$DAY
...

# The next 15 lines or so will iterate the cron log date to the correct
# month or year if the load date is at the end of the month/year.
if [ "$DAY" -eq 28 ] && [ "$MONTH" -eq 02 ]; then
        CRON_NOW=$(($NOW + 173))
elif [ "$DAY" -le 29 ]; then
        CRON_NOW=$(($NOW + 1))
elif [ "$DAY" -eq 30 ]; then
        if [ "$MONTH" -eq 04 ] || [ "$MONTH" -eq 06 ] || [ "$MONTH" -eq 09 ] || [ "$MONTH" -eq 11 ]; then
                CRON_NOW=$(($NOW + 171))
        else
                CRON_NOW=$(($NOW + 1))
        fi
elif [ "$DAY" -eq 31 ]; then
        if [ "$MONTH" -eq 01 ] || [ "$MONTH" -eq 03 ] || [ "$MONTH" -eq 05 ] || [ "$MONTH" -eq 07 ] || [ "$MONTH" -eq 08 ] || [ "$MONTH" -eq 10 ]; then
                CRON_NOW=$(($NOW + 170))
        fi
        if [ "$MONTH" -eq 12 ]; then
                CRON_NOW=$(($NOW + 8870))
        fi
fi
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我做了这个疯狂的工作,因为我无法弄清楚如何使用"日期"来显示指定的日期.我有一种感觉,有一些抽象的令人敬畏的方式与"日期"这样做,但我只是不知道它,不能从手册页解密它.

我知道"date --date = xx/xx/xxxx"或"date --date = 23天前"或其他什么.我想要更像"date --date = xx/xx/xxxx减去一天"之类的东西,因为我想尝试计算出它前几天和我每天迭代前进一样困难.

一如既往,非常感谢任何答案.这个网站晃动房子哟!-Ryan

0xf*_*xfe 10

这应该工作:

date --date="20 Feb 2010 1 day"
Run Code Online (Sandbox Code Playgroud)

它返回:

Sun Feb 21 00:00:00 EST 2010
Run Code Online (Sandbox Code Playgroud)

......这是在给定日期之后的一天.


Pau*_*ce. 6

$ date -d 'tomorrow'
Thu Feb 11 18:52:56 CST 2010

$ date -d '3/1/2011 - 1 day'
Mon Feb 28 00:00:00 CST 2011
Run Code Online (Sandbox Code Playgroud)