正则expression式在KornShell中

我试图检查一个variables是不是两个数字,但我似乎无法弄清楚。

如何检查KornShell(ksh)中的正则expression式(正则expression式)?

我努力了:

if [[ $month =~ "[0-9]{2}" ]] if [[ $month = _[0-9]{2}_ ]] 

我一直没有find任何文件。

任何见解?

 case $month in [0-9][0-9]) echo "ok";; *) echo "no";; esac 

应该管用。

如果你需要完整的正则表达式搜索,你可以像这样使用egrep

 if echo $month | egrep -q '^[0-9]{2}$' then echo "ok" else echo "no" fi 

自从ksh88以来,Ksh支持有限的扩展模式,使用

 special '(' pattern ')' 

句法。

在ksh88中,“特殊”字符前缀改变了预期的匹配次数:

 '*' for zero or more matches '+' at least one match '@' for exactly one match '?' for zero or one matches '!' for negation 

在ksh93中,这个扩展了

 '{' min ',' max '}' 

表达确切的范围:

 for w in 1423 12 "" abc 23423 9 33 3 333 do [[ $w == {1,3}(\d) ]] && print $w has between 1 and three digits [[ $w == {2}(\d) ]] && print $w has exactly two digits done 

最后,你可以用'〜'来代替perl-like,它引入了一个全新的扩展类,包括完整的正则表达式:

'〜(E)(正则表达式)'

更多的例子可以在Finnbarr P. Murphy的博客中找到

我来自哪里,这更可能验证数字月份:

 if (( $month >= 1 && $month <= 12 )) 

要么

 [[ $month =~ ^([1-9]|1[012])$ ]] 

或者在个位数月份包含前导零:

 [[ $month =~ ^(0[1-9]|1[012])$ ]] 

ksh不使用正则表达式; 它使用了一个更简单,但仍然相当有用的语言,称为“shell globbing patterns”。 关键的想法是

  • [0-9][chly]的类可以匹配类中的任何字符。
  • . 不是一个特殊的字符; 它只匹配.
  • 这个? 匹配任何单个字符。
  • *匹配任何字符序列。
  • 与正则表达式不同,shell匹配模式必须匹配整个单词,所以它的工作原理就好像它是一个正则表达式,总是以^开头,以$结尾。

Globbing模式不像正则表达式那样强大,但是它们更容易阅读,并且它们对于匹配文件名和简单的文字非常方便。 case结构是我最喜欢的匹配,但也有其他人。

正如Alok所指出的,你可能想要

 case $number in [0-9][0-9]) success ;; *) failure;; esac 

虽然可能你可能不希望匹配一个两位数字的初始值为零,所以更喜欢[1-9][0-9]

你也可以试试这个

 $ month=100 $ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no" no $ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no" no $ month=10 $ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no" ok $ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no" ok