我需要为每个月设置一个cronjob,因为我对脚本还不熟悉,我对脚本感到困惑。
例如,我需要为每个月末的-5和+2个工作日设置cronjob。
2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,02天。
如何为此编写cronjob脚本。

最佳答案

下面的脚本将测试今天是本月最后5个工作日还是前2个工作日之一。如果是,它将执行/path/command。对于此代码,假定工作日为周一到周五。此脚本应每天运行一次:

#!/bin/bash
do_run() {
    dom=$(date '+%_d') # 1-31, day of month
    dow=$(date '+%u') # 1-7 with 1=Monday, day of week
    currentm=$(date '+%_m')
    nextm=$(date -d '+7 days' '+%_m')
    limit=(0 4 4 2 2 2)
    [ "$dow" -le 5 ] && {
        [ "$dom" -le "${limit[$dow]}" ] ||
        [ "$currentm" -ne "$nextm" ]
    }
}

do_run && /path/command

工作原理:
do_run如果今天是(1)一个工作日,并且(2)它是本月前两个工作日之一,或者(3)是本月最后五个工作日之一,则返回true。一次吃一片:
do_run()
这将启动名为do_run的shell函数的定义。
dom=$(date '+%_d')
这会将shell变量dom设置为每月的第几天。这是一个从1到31的数字。
dow=$(date '+%u')
这将shell变量dow设置为一周中的第几天,其中1=星期一,7=星期日。
currentm=$(date '+%_m')
这将shell变量currentm设置为1=一月和12=十二月的月份数。
nextm=$(date -d '+7 days' '+%_m')
这将shell变量nextm设置为7天后的月份数。
limit=(0 4 4 2 2 2)
这定义了shell数组limit。(见下文。)
[ "$dow" -le 5 ]
如果当前日期是工作日,则返回true
[ "$dom" -le "${limit[$dow]}" ]
如果一个月中的某一天小于或等于一周中这一天的限制,则返回true。
例如,考虑一个月,其中第四个月是星期一。在这种情况下,dom=4dow=1。从limit的定义来看,${limit[$dow]}是4。由于4小于或等于4,此测试返回true,正确地表明本周一是本月前两个工作日之一。
[ "$currentm" -ne "$nextm" ]
如果我们在这个月的最后一个星期之内,这就返回真值。
如果今天是一个月的前2个工作日或最后5个工作日之一,则上述三个测试与&&||逻辑组合以返回true。
do_run && /path/command
如果do_run返回true,则将执行/path/command。否则,它将不会被执行。

10-04 20:13