首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CRON的Bash正则表达式

CRON的Bash正则表达式
EN

Stack Overflow用户
提问于 2013-08-03 15:31:15
回答 1查看 2.4K关注 0票数 3

有没有人对为CRON编写正则表达式的最佳方法有任何建议?

请允许我解释得更好一点。我有一个配置文件,其中包含与CRON中的字段对应的各个变量。我需要验证每个字段是否有效。使用sed更新CRON,如果配置文件有语法错误(意外的额外字符、字母、任何CRON不喜欢的内容),结果是灾难性的(CRON文件被破坏了)。

我将需要验证所有可能的数字和通配符,并抛出一个错误的任何其他。我不知道我是不是累了什么的,但我似乎不能从逻辑上开始这个问题。

我愿意接受任何建议,而不仅仅是编码。如何防止CRON受到打击,可能会在一个字符串(配置文件中)为CRON编辑所有内容,而不是单个变量。

Thx寻求任何帮助

下面是配置的一个示例。非常简单。

代码语言:javascript
复制
# SUMMARY REPORT FREQUENCY ( * Wildcards acceptable )
MIN="30"
HOUR="*"
DAY="12"
MON="*"
WEEK="*"

* UPDATE *

Ubuntu 12.04 LTS,附带Bash 4.2.25

下面是正在进行更新的代码。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2013-08-03 19:39:23

如果您坚持基于正则表达式的方法,那么这组regexes (regeces?)该让你开始了。它不支持在一周或几个月的时间里使用名称,也不支持像*/5这样的“频率”符号来替代every five minutes。但是,尝试以下操作(假设您已将配置文件打开为id $configfile文件)

代码语言:javascript
复制
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匹配,这显然不是真正的一个小时。但是,既然已经保存了该值,就可以这样做:

代码语言:javascript
复制
if [ "$hour" -gt 23 ]; then
  #throw an error, exit the test, whatever
fi

只需确保引用变量时,您测试他们!例如,"$hour",而不是$hour。如果变量中有一个*,并且不引用它,shell将将它内联地展开到当前目录中的所有文件名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18034394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档