我试图检查一个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]
的类可以匹配类中的任何字符。 .
不是一个特殊的字符; 它只匹配.
。 ?
匹配任何单个字符。 *
匹配任何字符序列。 ^
开头,以$
结尾。 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