LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 675|回复: 8

关于test中的配匹遗漏的问题

[复制链接]
发表于 2007-1-6 15:44:31 | 显示全部楼层 |阅读模式
有如下scripts:

******************************************
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

function added_account(){
echo -n " Please input pppoe account,must more than six characters "
echo
read -p "Example :sg[0-9A-Za-z]: " account
        if [ "$account" != "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" ];then
                echo -e "invalid account ,please choose another one "
                read -p "Example :sg[0-9A-Za-z]: " account
        fi
        if egrep "^$account:" /etc/passwd > /dev/null 2>&1;then
                echo -e "your accont exist in the system,please choose another one"
                read -p "Example :sg[0-9A-Za-z]: " account
        fi
}

*****************************************************************************
问题:

如果输入用户名:sg^^^^^^,判别式:
if [ "$account" != "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" ];then
                echo -e "invalid account ,please choose another one "
                read -p "Example :sg[0-9A-Za-z]: " account
fi

能正常配匹,显示invalid account,如果输入sg^^^^^^^(字长超过8个字符)则判别式配匹遗漏,但是可以明显看这,这是一个非法的输入

但是在正则表达中没有问题如:
[root@sg002 tmp]# cat user
sg^^^^^^
sg^^^^^^^^^
sg*************

#有user文件,内有如上3行:
[root@sg002 tmp]# egrep "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" user;echo $?
1

# 可以看出,正则表达是正常的

不知问题出在何处,请DX们指教
发表于 2007-1-6 22:09:44 | 显示全部楼层
我用bash, 你的脚本无论输入什么它都会说
invalid account ,please choose another one
为什么不用
if echo "$account"|egrep -q "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*"
then
....
fi
回复 支持 反对

使用道具 举报

发表于 2007-1-7 02:33:05 | 显示全部楼层
test并不支持所谓的正则吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-8 09:54:43 | 显示全部楼层
很抱歉,lastart兄,我用bash shell,上面的scripts是有些问题,正则表达是正确的,其实我是想实现这样一个循环,但是在while里,我不知怎么写,如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-1-8 19:22:53 | 显示全部楼层
bash支持无限递归调用子函数的,
你把判断出错的read改成再调用函数本身就是了.

你的结构可以这样:

  1. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  2. export PATH

  3. function added_account(){
  4. echo -n " Please input pppoe account,must more than six characters "
  5. echo
  6. read -p "Example :sg[0-9A-Za-z]: " account

  7. if [ "$account" != "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" ];then
  8. echo -e "invalid account ,please choose another one "
  9. elif egrep "^$account:" /etc/passwd > /dev/null 2>&1;then
  10. echo -e "your accont exist in the system,please choose another one"
  11. else
  12. return
  13. fi
  14. added_account
  15. }
复制代码

其实这样写跟循环一样吧, 只是效率可能比循环低?,
要改成循环只要把return改成break就好了.
不过你的判断在我这除了输入sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*, 它都给我一个通不过, 可能是版本不一样吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-9 11:47:18 | 显示全部楼层
lastart兄,这条语句[ "$account" != "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" ]确有问题,并不是你bash版本的问题,可能确如huan兄说的test中并不支持正则?在shell方面我确实是个菜鸟,故同样求证,

上面的那个循环,我用while写了一下,你看看是否有问题,如下:

******************************************************
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

function added_account(){
etc_pwd=/etc
read -p "Example :sg[0-9A-Za-z]: " account
until echo "$account"|egrep -q "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*" && ! egrep -q "$account" "$etc_pwd"/passwd
do
        if ! echo "$account"|egrep -q "sg[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z]*";then
                echo -e "invalid account ,please choose another one "
        elif egrep -q "$account" "$etc_pwd"/passwd;then
                echo -e "Account exist in system,please choose another one "
        fi
        read -p "Example :sg[0-9A-Za-z]: " account
done
}


*******************************************************

写得难看,请别见笑,说实在的,没有您的提示,我还不知道grep中能用管道呢
回复 支持 反对

使用道具 举报

发表于 2007-1-9 12:28:24 | 显示全部楼层
应该没问题. 但要是我写的话,我会写成

  1. while [ 1 ]
  2. do
  3. read ...........
  4. if ................
  5. then
  6. .............
  7. elif .........
  8. then
  9. ..........
  10. else
  11. break
  12. fi
  13. done
复制代码

因为可以少判断两次.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-9 13:38:24 | 显示全部楼层
我试试看,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-9 13:45:24 | 显示全部楼层
哇,搞掂,lastart兄,你的代码更高效,更精简,在午睡时我还想把上面我写的改成这样,

原代码:
elif egrep -q "$account" "$etc_pwd"/passwd;then
echo -e "Account exist in system,please choose another one "

更改为:
else
echo -e "Account exist in system,please choose another one "

# 因为上面已判断过有2种可能,不是第一种,就是第二种了,

不过你的这种更高效,好好学习一下!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表