2011-03-04 80 views
2

什么是效仿了在一个crontab行的前五个字段用于表达相同的数字匹配最简单的方法是什么?执行的crontab般的数字匹配在shell脚本

例如,给定的图案的输入端“1,5-7,16,*/3”(例如傻,我知道)和一值“6”时,输出将是一个true。

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

谢谢!

+1

什么都你尝试过这么远吗? – codaddict 2011-03-04 06:16:40

回答

1

我主要是一个ksh的人,但我在bash的经验说,这应该工作(给你的例子),或将至少做点对你有什么需要。

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

在现实中,我会删除打印 - “”的东西,只是调用true或false。

,包括你的榜样的休息,我不得不这样做

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语句之前得到结果, 只是将该值合并到....)将所有派生值保存为 变量,
  • 使用这些变量作为案例目标​​,可能包装整个东西,并根据需要逃脱字符与评估。
  • 评估的综合真理的全部5列返回值(任何虚假==假)

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

希望这有助于。

P.S.你似乎是一个新的用户,如果你得到一个答案,可以帮助你请记得将其标记为接受,或者给它一个+(或 - )作为一个有用的答案。

+0

谢谢,这很有帮助; (($ {hrVal}/3))匹配似乎不适合我,所以我最终编写了一个函数来专门处理这些模式。 我对shell脚本有点新,所以可能有一个更简单的方法来做到这一点,但这里是我最终使用的脚本: http://pastie.org/1758972 – Tom 2011-04-05 14:42:15

+0

@Tom:(怎么做的你加入这么晚,仍然得到一个3个字母的名字!?--(不需要回复))...非常好。优秀的评论。我会考虑改变的主要事情是使用文件divisors.txt并从文件中读取它。使用你的$ {divisors}变量,并使用'print - “$ {divisors}”|一边阅读除数......; done'。此外,反引号已被弃用,使用$(),并且不必担心将来如何嵌套命令替换。 ;-)总而言之,非常适合某些新的shell脚本。“你显然已经完成了其他语言的编码。祝你好运! – shellter 2011-04-05 16:17:36

+0

@Tom:感谢您接受这个!你的项目进展如何?续祝好运! – shellter 2011-06-13 15:01:17