编辑:我设法自己解决了这个问题,实际上我删除了原来的问题,因为我使过程稍微复杂化了,但后来回答了它,以防其他人发现它有用。在这种情况下不需要 RegExp,因为它主要处理基于数字的结果。
原问题:
我有一个write_cronjob()
函数可以检查传递的作业是否已经存在,或者如果 grep 条件没有找到任何匹配的内容,则写入 crontab。
由于某些网络限制,cronjobs 只能安排在特定的窗口中。由于用户可以自由设置计划,因此脚本需要检测尝试在定义的窗口之外计划的任何作业,因为它们不会运行。
该函数有两个参数:
$1
- 仅包含 cron 计划,例如0 19 * * 3
$2
- 包含要运行的作业/命令
如果需要,它们会在写入操作之前合并。
Cron 调度规则必须符合以下标准:
- 周一至周五(平日)
- 上午 7 点 (07:00 AM) - 晚上 10 点 (22:00 PM)
我正在考虑对日部分进行范围检查,这很简单,但小时部分有点难,使用 24 小时时间,即 22 = 10 PM。
我的要求是:
- 能够拆分
$1
以挑选 cronjob 的小时和日期部分进行条件检查。 - RegExp 模式/范围检查分割部分以检测它们是否超出标准,并
exit 1
相应地进行检查。
笔记:
我的外壳是 ash (BusyBox),我无法使用数组。
答案1
我能够$1
用 awk 分割并提取小时和日期部分。由于其默认分隔符是空格,因此可以很好地分割 cronjob 时间值。
的示例值$1
:0 19 * * 1-5
CRONJOB_HOUR=$(echo "$1" | awk '{ print $2 }') # Second position: 19
CRONJOB_DAY=$(echo "$1" | awk '{ print $5 }') # Fifth position: 1-5
将这些部分放在变量中,我就可以进行条件检查。
第一个检查将是小于或大于检查以创建范围
if [ "${CRONJOB_HOUR}" -lt 7 ] || [ "${CRONJOB_HOUR}" -gt 22 ] ; then
echo "Cronjob cannot be scheduled within specified hour"
exit 1
fi
第二个条件是在匹配的基础上完成的,而不是等于,以捕获像 1-6 这样的值
if [[ "${CRONJOB_DAY}" == *"6"* ]] ||
[[ "${CRONJOB_DAY}" == *"7"* ]]
then
echo "Cronjob cannot be set to run at weekends"
exit 1
fi