有没有人建议为CRON编写正则表达式的最佳方法?
请允许我解释一下。我有一个配置文件,其中包含与CRON中的字段对应的单个变量。我需要验证每个字段是否有效。即0-59秒,0-31个月等。我正在使用sed来更新CRON,如果配置文件有语法错误(意外的额外字符,字母,CRON不喜欢的任何东西),结果都是灾难性的(CRON文件)被摧毁了)
我需要验证所有可能的数字和通配符,并在其他任何内容上抛出错误。我不知道我是刚刚累了还是什么,但我似乎无法从逻辑上开始这个。
我愿意接受任何建议,而不仅仅是编码。如何防止CRON被破坏,可能在一个字符串(在配置文件中)中为CRON而不是单个变量编辑所有内容
获取任何帮助
以下是配置示例。非常简单。
# SUMMARY REPORT FREQUENCY ( * Wildcards acceptable )
MIN="30"
HOUR="*"
DAY="12"
MON="*"
WEEK="*"
*更新*
Ubuntu 12.04 LTS随Bash 4.2.25一起发布
以下是正在进行更新的代码。
function REPORT.CHECK {
sleep 1s
if [ "`crontab -l | grep report.sh`" \> " " ]; then
CTMP="$(set -f; crontab -l | grep report.sh)"
if [ "$CTMP" = "$MIN $HOUR $DAY $MON $WEEK cd $DIR && ./report.sh" ]; then
if [ "$DISABLE" = "false" ]; then
RETURN="true"
fi
else
if [ "$DISABLE" = "false" ]; then
CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR")
crontab -l | sed "s%$CTMPESC%/$MIN /$HOUR /$DAY /$MON /$WEEK cd $DIRESC \&\& \./report\.sh" | crontab -
RETURN="update"
fi
fi
if [ "$DISABLE" = "true" ]; then
crontab -l | grep -F -v report.sh | crontab -
RETURN="disable"
fi
else
if [ "$DISABLE" = "true" ]; then
RETURN="exit"
else
(crontab -l ; echo "$MIN $HOUR $DAY $MON $WEEK cd $DIR && ./report.sh") | crontab -
RETURN="default"
fi
fi
}
这段代码实际上做了很多。如果它不存在,它会将条目添加到CRON。如果在配置中禁用了该部分(报告部分),它还会杀死脚本(返回退出),如果它看到CRON中的内容与配置中的内容不同,它还会更新CRON,最后如果配置相同对于CRON中的什么,它只是忽略并继续前进。这些功能不合适。希望这增加了足够的细节lol。
答案 0 :(得分:1)
如果您坚持使用基于正则表达式的方法,那么这套正则表达式(regeces?)应该可以帮助您入门。它不支持在一周或几个月中使用名称,也不支持&#34;频率&#34;用*/5
代替every five minutes
的符号。但请尝试这一点(假设您已将配置文件打开为文件ID $configfile
:
min=$(grep -P 'MIN="([0-5]?[0-9]|\*)"' $configfile | grep -oP '([0-5]?[0-9]|\*)')
hour=$(grep -P 'HOUR=\"([1-2]?[0-9]|\*)"' $configfile | grep -oP "([1-2]?[0-9]|\*)")
day=$(grep -P 'DAY=\"([1-3]?[0-9]|\*)"' $configfile | grep -oP "([1-3]?[0-9]|\*)")
mon=$(grep -P 'MON=\"(1?[0-9]|\*)"' $configfile | grep -oP "(1?[0-9]|\*)")
week=$(grep -P 'WEEK=\"([0-7]|\*)"' $configfile | grep -oP "([0-7]|\*)")
在您收集了这些值后,您可以轻松检查它们是否在正确的范围内 - 例如,HOUR
正则表达式可以匹配29
,这显然不是真正的小时。但是现在保存了这个值,你可以这样做:
if [ "$hour" -gt 23 ]; then
#throw an error, exit the test, whatever
fi
确保在测试变量时引用变量!例如,"$hour"
,而非$hour
。如果变量中有*
并且没有引用它,那么shell会将其内联展开到当前目录中的所有文件名。