![在每月第一个工作日运行 cron 作业](https://linux22.com/image/1143029/%E5%9C%A8%E6%AF%8F%E6%9C%88%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%BF%90%E8%A1%8C%20cron%20%E4%BD%9C%E4%B8%9A.png)
我尝试在每个月的第一个工作日使用以下 crontab 条目运行一项作业:
00 07 1-3 * * [ "$(date '+\%a')" == "Mon" ] && echo "Its Monday!"
00 07 1 * * [ "$(date '+\%a')" == "Tue" ] && echo "Its Tuesday!"
00 07 1 * * [ "$(date '+\%a')" == "Wed" ] && echo "Its Wednesday!"
00 07 1 * * [ "$(date '+\%a')" == "Thu" ] && echo "Its Thursday!"
00 07 1 * * [ "$(date '+\%a')" == "Fri" ] && echo "Its Friday!"
但是今天早上我收到以下错误:
/bin/sh: 1: [: Thu: unexpected operator
答案1
从man test
:
STRING1 = STRING2
the strings are equal
请注意,是=
,而不是==
。然而,这不是唯一的问题……
firas@itsuki ~ % sh
$ [ "$(date '+\%a')" == "Thu" ] && echo "Its Thursday!"
sh: 1: [: \Thu: unexpected operator
$ [ "$(date '+\%a')" = "Thu" ] && echo "Its Thursday!"
$
另一个问题是,由于你的date
字符串+\%a
位于单身的引号,它将被按字面解释,所以
$ date '+\%a'
\Thu
这不是你想要的。你应该删除不必要的反斜杠,然后
$ [ "$(date '+%a')" = "Thu" ] && echo "Its Thursday!"
Its Thursday!
答案2
我正在寻找一种在 java quartz CronTrigger 中执行此操作的方法,最后找到了这个页面。不确定这是否适用于常规 cron,但 quartz 支持0 7 1 1W * ?
每月第一个工作日的表示法。我把它写在这里以备将来使用。
0 7 1 1W * ?
:
- 秒
0
- 分钟
7
- 小时
1
1W
最接近每月第一天的星期几- 月
*
- 星期几
?
没有具体值
答案3
问题在于您使用的代码中混合了语法和合适的命令,而不是设置的方式cron
。对于您要实现的目标,bash 代码应该真正使用if
这样的语句:
if [[ "$(date '+\%a')" == "\Thu" ]]; then echo "Its Thursday!"; fi
(请注意额外的方括号、分号的使用以及终止fi
条目)。
其结果如下:
chris@loki:/$ if [[ "$(date '+\%a')" == "\Thu" ]]; then echo "Its Thursday!"; fi
Its Thursday!
值得注意的是,在您的代码中,布尔值&&
并不合适,因为它实际上应该用于字符串条件语句。例如:
if [ $condition1 ] && [ $condition2 ]
希望这就是您所追求的!