Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1512586
  • 博文数量: 297
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3082
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 11:36
文章分类

全部博文(297)

文章存档

2011年(1)

2009年(45)

2008年(67)

2007年(184)

我的朋友

分类: LINUX

2009-07-28 11:36:25

在用shell的实际工作中,总会遇到需要正则表达式解决问题的时候.在http://blog.chinaunix.net/u/31547/article_60982.html
已经介绍过,相关正则表达式的概念,下面记录一些鄙人在工作中遇到的问题和经验:
 
1.使用正则表达式判断交互输入;
 
问题:
    在输入的值里,可以简单的判断其范围,但有些时候还需要判断类型,避免因为输入错误造成脚本不能
执行,或错误执行等问题;
 
示例:
    判断一个以>0数字开头的数字组合:
   
    if [[ $1 =~ '^([1-9][0-9])*$' ]] && [ $1 -le $max ]
    then
        .........
    else
        .........
    fi
 
看上去这个判断没有什么问题(事实上它的确可以实现),但在应用的时候发现"在正常判断数字的时候没有问题,但在判断特殊字符的时候却出现问题".
    这会带来一个比较严重的安全问题,如果我将这个代码写的很冗长,很难避免里面那个调用不会被利用.
问题就处在"^([1-9][0-9])*$"上,在正则表达式里"*"代表的是"匹配0次或多次".说明即使不输入数字,只要不是字母,其它的输入也可能被调用.
    如果简单的将"*"改为"+"则会造成不能输入个位数字的请款.
 
解决:
    解决的办法也很简单,将"^([1-9][0-9])*$"改为"^([1-9]){1}([0-9])*$"即可.这样就完全匹配了输入的类型.

注:
    zmt1982 兄说的对,其实只需要"^[1-9][0-9]*$"(以1-9数字开头,0-9数字出现0次或多次为结尾)就可以了 ^^ 俺是想的太多了.....欢迎大家指正
 
经验:
    别拿shell不当干粮.
阅读(3056) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zmt19822009-08-03 09:44:45

这样就可以了: ^[1-9][0-9]*$