10

我正在尝试检查一个变量是否恰好是两个数字,但我似乎无法弄清楚。

如何在 KornShell (ksh) 中检查正则表达式 (regex)?

我试过了:

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

我还没有找到任何关于它的文档。

有什么见解吗?

4

5 回答 5

9
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
于 2010-01-23T00:11:03.563 回答
8

自 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 的混乱,它引入了一个全新的扩展类,包括完整的正则表达式:

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

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

于 2011-04-02T14:38:30.460 回答
5

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

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

或者

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

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

[[ $month =~ ^(0[1-9]|1[012])$ ]]
于 2010-01-23T03:32:45.330 回答
3

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].

于 2010-01-23T10:37:15.440 回答
0

你也可以试试这个

$ 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
于 2010-01-23T01:03:26.107 回答