我有一个每天运行的脚本。根据今天是一周中的哪一天,或者明天是该月的最后一天,它会将文件移动到不同的位置。我省略了实际的功能。
变量:
TOM=$(TZ=UTC-24 date +%d)
SUNDAY=$(date +%w)
逻辑如下:
if [ $TOM -eq 1 ]; then
move_files monthly
echo EXEUTING END OF MONTH MOVE AND PURGE, NON-DAILY, NON-END-OF-MONTH
elif [ $SUNDAY -eq 0 ]; then
move_files weekly
echo EXECUTING SUNDAY MOVE AND PURGE, NON-DAILY, NON-END-OF-MONTH
else echo EXECUTING DAILY MOVE AND PURGE NON-SUNDAY, NON-END-OF-MONTH
move_files daily
fi
一切都正常执行,但是昨天(11 月 30 日)它没有正确地将文件移动到目录中monthly
,这是该功能的一部分move_files monthly
。在其他地方测试,这似乎工作正常。
我运行它的主机是 UTC。
答案1
将上面的一些评论放在一起,使用 GNU 日期,您可以检查明天是否是该月的第一天:
if [[ "$(date -d tomorrow +%d)" == "01" ]]; then
echo "Tomorrow is the first day of the month"
fi
如果您想知道明天是否是该月的最后一天,您可以类似地执行以下操作:
if [[ "$(date -d "2 days" +%d)" == "01" ]]; then
echo "Tomorrow is the last day of the month"
fi
答案2
您的问题可能与您的本地时区实际上并非 UTC 有关。使用 GNU 获取偏移时间的最佳方法是将其选项与描述您想要用作参考的日期而不是“现在”的参数一起date
使用(如-d
安迪的回答)。如果您还想从 GNU 获取 UTC 格式的响应date
,请使用它的-u
选项。
不使用 GNU date
,在bash
版本 4.3+ 中:
#!/bin/bash
# Unix timestamp "now"
printf -v now '%(%s)T' # append "-1" as argument to get it working in bash 4.2
# Today's weekday, 1-7, 1=Monday
printf -v today_day '%(%u)T' "$now"
# Tomorrow's date, 1-31
printf -v tomorrow_date '%(%e)T' "$(( now + 24*60*60 ))"
if [ "$tomorrow_date" -eq 1 ]; then
echo Today is the last day of the month
elif [ "$today_day" -eq 7 ]; then
echo Today is Sunday
else
echo Today is some other day
fi