bash – 如何在cron中每个月的第一个工作日运行脚本?
我必须在每个月的第一个工作日设置cronjob,这意味着脚本应该在每个月的第一个工作日运行.
如果假设第一次工作是假期,那么脚本应该在第二个工作日运行. 解决方法
首先,运行date命令:
$date '+%x' 12/29/2014 %x告诉日期以当前语言环境的格式显示今天的日期.使用完全相同的格式,将假期列表放在名为holidays的文件中.例如: $cat holidays 01/01/2015 07/04/2015 接下来,创建以下shell脚本: #!/bin/sh dom=$(date '+%d') # 01-31,day of month year=$(date '+%Y') # four-digit year month=$(date '+%m') # two-digit month nworkdays=0 for d in $(seq 1 $dom) do today=$(date -d "$year-$month-$d" '+%x') # locale's date representation (e.g. 12/31/99) dow=$(date -d "$year-$month-$d" '+%u') # day of week: 1-7 with 1=Monday,7=Sunday if [ "$dow" -le 5 ] && grep -vq "$today" /path/holidays then workday=Yes nworkdays=$((nworkdays+1)) else workday= fi done [ "$workday" ] && [ "$nworkdays" -eq 1 ] && /path/command 其中/ path /命令由您希望在该月的第一个工作日运行的任何命令替换.另外,将/ path / holidays替换为假日文件的正确路径. 最后,告诉cron每天运行上面的脚本.您的命令将仅在该月的第一个工作日执行. 这个怎么运作 让我们看一下脚本的核心: >对于d in $(seq 1 $dom);做 这将启动一个循环,将变量d从1运行到当前的每月. 这将今天设置为本月和第d天的日期字符串. 这将d设置为第d天的星期几,其中1 =星期一,7 =星期日. 测试“$dow”-le 5]验证第d天是工作日(周一至周五).测试grep -vq“$today”/ path / holidays验证day.d日期是否未出现在holiday文件中.如果两个测试都为真,那么第d天是工作日,然后执行then子句: then子句将工作日设置为是,并且还增加了本月到目前为止的工作日数:nworkdays else子句将workday设置回空字符串. fi表示if语句的结束. 完成表示for循环的结束. for语句中的最后一个循环是今天的日期.因此,如果在循环结束后workday = Yes,那么今天是工作日.此外,如果nworkdays = 1,那么今天是本月的第一个工作日.如果两个条件均为真,则执行命令/ path /命令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |