3

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

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

我需要验证所有可能的数字和通配符,并在其他任何内容上抛出错误。我不知道我只是累了还是怎么了,但我似乎无法从逻辑上开始。

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

感谢任何帮助

这是配置的示例。很简单。

# SUMMARY REPORT FREQUENCY ( * Wildcards acceptable )
MIN="30"
HOUR="*"
DAY="12"
MON="*"
WEEK="*"

* 更新 *

Bash 4.2.25 附带的 Ubuntu 12.04 LTS

这是进行更新的代码。

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 中的内容,它只是忽略并继续前进。这些功能不按顺序排列。希望这增加了足够的细节哈哈。

4

1 回答 1

1

如果您坚持使用基于正则表达式的方法,那么这组正则表达式(regex?)应该可以帮助您入门。它不支持在星期几或月份使用名称,也不支持用“频率”表示法*/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。如果你有一个*in 变量并且不引用它,shell 会将它内联扩展到当前目录中的所有文件名。

于 2013-08-03T19:39:23.357 回答