想把输入值限定在0-23之间,请问用grep如何检查合法性???

sh/bash/dash/ksh/zsh等Shell脚本
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

想把输入值限定在0-23之间,请问用grep如何检查合法性???

#1

帖子 vincent_zh » 2008-04-22 16:15

想把输入值限定在0-23之间,请问用grep如何检查合法性???
修己,安人
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#2

帖子 yaoms » 2008-04-22 16:25

用 expr 好一点:

代码: 全选

$ read i
43
Exit status: 0
yaoms@yaoms-laptop:~
$ echo $i
43
Exit status: 0
yaoms@yaoms-laptop:~
$ expr $i \> 0 && expr $i \< 23
1
0
Exit status: 1
yaoms@yaoms-laptop:~
$ 
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#3

帖子 BigSnake.NET » 2008-04-22 17:10

既然一定要用grep....

代码: 全选

read i
grep -E '^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23)$' <<<"$i"
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#4

帖子 bones7456 » 2008-04-22 17:27

...BT的球猫..
关注我的blog: ε==3
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#5

帖子 yaoms » 2008-04-22 17:28

BigSnake.NET 写了:既然一定要用grep....

代码: 全选

read i
grep -E '^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23)$' <<<"$i"
。。。。BT
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

#6

帖子 HuntXu » 2008-04-22 20:07

yaoms 写了:
BigSnake.NET 写了:既然一定要用grep....

代码: 全选

read i
grep -E '^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23)$' <<<"$i"
。。。。BT
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

#7

帖子 vincent_zh » 2008-04-22 22:01

我的意思是从键盘上输入一个值,要是输入值是0-23,则返回该值,要不是,而是随便输入的值的话,如10a,ab,-5等,则判断出错。所以想用grep来验证所得到的输入值。请问有比较简洁的语句吗???
修己,安人
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

#8

帖子 vincent_zh » 2008-04-22 22:06

或者要是有其它比较好的简洁的判断方法,也可以,谢谢
修己,安人
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#9

帖子 yaoms » 2008-04-23 15:10

vincent_zh 写了:或者要是有其它比较好的简洁的判断方法,也可以,谢谢
我的的代麻不可以吗?
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

#10

帖子 vincent_zh » 2008-04-23 16:38

不可以啊,看下这个你就知了

vincent@NSHM:~/Desktop$ read i
2a
vincent@NSHM:~/Desktop$ echo $i
2a
vincent@NSHM:~/Desktop$ expr $i \> 0
1
vincent@NSHM:~/Desktop$ expr $i \< 23
0

这就不对了啊,输入的时候可以输入任何字符的,没有限定的
修己,安人
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#11

帖子 patrickhe » 2008-04-23 16:50

代码: 全选

#!/bin/bash

EXIT_CONDITION=exit
until [ "$var" = "$EXIT_CONDITION" ]
do
        read -p "Please input: " var
        echo "String: $var"
        nbr=`echo $var | pcregrep -o '\d+'`
        if [[ -n "$nbr" && "$nbr" -ge 0 && "$nbr" -le 23 ]]; then
                echo "Valid"
        else
                echo "Invalid"
        fi
done

我在这里使用了 pcregrep。Ubuntu 中的 grep 默认是不支持 -P 参数的,也就是不能使用 perl 风格的 regex。如果使用 GNU grep 的话,将其中的

代码: 全选

pcregrep -o '\d+'
改成

代码: 全选

grep -o '[0-9]+'
上次由 patrickhe 在 2008-04-23 16:59,总共编辑 1 次。
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#12

帖子 yaoms » 2008-04-23 16:54

vincent_zh 写了:不可以啊,看下这个你就知了

vincent@NSHM:~/Desktop$ read i
2a
vincent@NSHM:~/Desktop$ echo $i
2a
vincent@NSHM:~/Desktop$ expr $i \> 0
1
vincent@NSHM:~/Desktop$ expr $i \< 23
0

这就不对了啊,输入的时候可以输入任何字符的,没有限定的
。。。。原来你不会变通。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

#13

帖子 vincent_zh » 2008-04-23 17:17

请大侠指点,谢谢
修己,安人
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#14

帖子 yaoms » 2008-04-23 17:21

我是小虾米,不好意思
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
vincent_zh
帖子: 129
注册时间: 2008-04-05 10:56
来自: 学校

#15

帖子 vincent_zh » 2008-04-23 17:24

我倒是想到先检查输入的是不是数字,再判断其范围是不是在0-23之间,但我想知道有没有简洁的方法呢???
期待高手
修己,安人
回复