【问题标题】:Performing crontab-like numeric matching in a shell script在 shell 脚本中执行类似 crontab 的数字匹配
【发布时间】:2018-08-21 07:32:59
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 到目前为止你都尝试过什么?

标签: regex bash shell cron


【解决方案1】:

我主要是一个 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
  • 捕获数学表达式并将其转换为可计算的表达式 (哦,你可能可以在 case 语句之前得到结果 只需将值合并到 ....) 将所有派生值保存为 变量,
  • 将这些变量用作案例目标,可以包装整个事物并根据需要使用 eval 转义字符。
  • 评估所有 5 列返回值的组合真值(任何 false == false)

(在 bash 中可能是 (( ${hrVal} / 3 )) )

IHTH

【讨论】:

  • 谢谢,这很有帮助; (( ${hrVal} / 3 )) 匹配似乎对我不起作用,所以我最终编写了一个函数来专门处理这些模式。我对 shell 脚本有点陌生,所以可能有更简单的方法可以做到这一点,但这是我最终使用的脚本:pastie.org/1758972
  • @Tom :(你怎么这么晚才加入,仍然得到一个 3 个字母的名字!?;-)(无需回复))......非常好。优秀的cmets。我会考虑改变的主要事情是您使用文件 divisors.txt 并从文件中读取它。使用您的 ${divisors} 变量并使用 print -- "${divisors}" | while read divisors ... ; done。此外,不推荐使用反引号,使用 $( ) 并且永远不必担心将来如何嵌套命令替换。 ;-) 总而言之,非常适合“shell 脚本新手”。您显然已经用其他语言编写过代码。祝你好运!
  • @Tom :感谢您接受这个!你的项目进展如何?继续祝你好运!
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2013-08-28
  • 2020-07-10
  • 2013-10-18
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多