在shell脚本中执行类似crontab的数字匹配

时间:2011-03-04 06:14:33

标签: regex bash shell cron

模拟用于crontab行的前五个字段中的表达式的相同数字匹配的最简单方法是什么?

例如,给定模式“1,5-7,16,* / 3”(愚蠢的例子,我知道)和值“6”的输入,输出将是布尔值true。

如果没有一个死的简单解决方案,在我的情况下提供第三个输入是切合实际的,该输入将指定星号需要匹配的最大值,以便星号(以及连字符范围)可以转换为值列表,输入值可以与该列表匹配。 (上面的示例模式列表将是“1,3,5,6,7,9,12,15,16,18”,最大值为“18”。)

谢谢!

1 个答案:

答案 0 :(得分:2)

我主要是一个ksh人,但我对bash的经验说这应该有用(给出你的例子),或者至少指出你需要做什么。

hrVal=6
case ${hrVal} in   
   1|[5-7]|16 ) print -- "true" ;;
   * ) print -- "false" ;;
esac

编辑2018-08-20 对于bash,您需要将print --更改为echo ....printf "%s\n"

实际上,我会移除print -- ""内容,只需调用exit 0exit 1,然后使用相应的返回码退出,然后通过调用进行测试过程


包括你的例子的其余部分,我必须做

  hrVal=6
  eval "
    case ${hrVal} in

      1|[5-7]|16|$(( ${hrVal} / 3 )) ) print -- "true" ;;
      * ) print -- "false" ;;
    esac
 "

所以,这可能是令人兴奋的!

  • 如上所述解析5个时段中的每一个
  • 应用sed之类命令将1,5-7,16之类的条目转换为1 | [5-7] | 16
  • 陷阱并将您的数学表达式转换为可评估的表达式      (哦,你可以在案例陈述之前得到结果        只需将值合并到....中将所有派生值保存为 变量,
  • 将这些变量用作案例目标,可以根据需要包装整个事物和转义字符。
  • 评估所有5列返回值的合并事实(任何false == false)

(也许是($ {hrVal} / 3))bash)

IHTH