分页: 1 / 2

判断输入的是整数还是字符串

发表于 : 2011-07-12 19:40
chengmoYS
我在网上搜索到expr可以用来判断输入的是否为整数
我写了个脚本如下

#!/bin/sh

read -p "Please enter an integer: " -t 5 i
expr $i + 1 > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "You have enter an integer"
else
echo "You have not enter an integer"
fi

当输入的整数为非-1时,都显示为you have not enter an integer

但是输入-1时,显示为you have not enter an integer

[user@localhost ~]$ sh test.sh
Please enter an integer: -1
The value of i is not an integer
[user@localhost ~]$

请问为啥

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-12 21:34
eexpress
读入字符串,用转换函数处理,或者用+1再-1的方法,比较原字符串。
shell只有那么多能力。

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-12 22:06
fnan
数学表达式结果为零时为逻辑值false,非零是true,所以expr $i + 1 而i=-1时$?返回1,即通常意义的不成功。
试试:
#!/bin/sh

read -p "Please enter an integer: " i
expr $i + 1 > /dev/null 2>&1
if [ $? -ne 2 ]
then
echo "You have enter an integer"
else
echo "You have not enter an integer"
fi

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 0:08
ChenFengyuan

代码: 全选

$ read i &&  echo $i | grep -qP '^\d+$'  ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi
3
a number
$ read i &&  echo $i | grep -qP '^\d+$'  ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi
aoeu
not a number
代码就是

代码: 全选

read i &&  echo $i | grep -qP '^\d+$'  ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi
to ee,可以用grep嘛,shell就是么借助别的bin啊 :em11

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 5:38
fnan
kose5@kose5-Aspire-4552:~$ read i && echo $i | grep -qP '^\d+$' ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi
-1
not a number

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 5:41
fnan
试试:
read i;((10#$i^2+1)) 2>/dev/null && echo integer! || echo not integer
#忘了shell里乘方是$i**2, 不如((10#$i%1+1))

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 7:58
ChenFengyuan
fnan 写了:kose5@kose5-Aspire-4552:~$ read i && echo $i | grep -qP '^\d+$' ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi
-1
not a number
嗯正则出问题了......
改成这个

代码: 全选

read i &&  echo $i | grep -qP '^-?\d+$'  ; if [ $? -eq 0 ];then echo 'a number' ;else echo not a number;fi

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 9:39
eexpress
我喜欢atoi。思路也是这种了。
正则去判断全数字的,不稀罕。
:em04

shell内建的+1 -1 还是容易点。

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 11:15
chengmoYS
fnan 写了:数学表达式结果为零时为逻辑值false,非零是true,所以expr $i + 1 而i=-1时$?返回1,即通常意义的不成功。
试试:
#!/bin/sh

read -p "Please enter an integer: " i
expr $i + 1 > /dev/null 2>&1
if [ $? -ne 2 ]
then
echo "You have enter an integer"
else
echo "You have not enter an integer"
fi
嗯 谢谢大家的思路啊

确实应该用[ $? -ne 2]这个是可以的

代码如下
#!/bin/sh

read -p "Please enter an integer: " -t 5 i
if [ -n "$i" ]
then
expr $i + 0 > /dev/null 2>&1
if [ $? -ne 2 ]
then
echo "integer"
else
echo "not integer"
fi
else
echo "nothing"
fi

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-13 15:33
ChenFengyuan
eexpress 写了:我喜欢atoi。思路也是这种了。
正则去判断全数字的,不稀罕。
:em04

shell内建的+1 -1 还是容易点。
稀罕干啥?能用就好阿.........要不提交到某cgi,然后再返回? :em05

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-14 9:02
chengmoYS
ChenFengyuan 写了:
eexpress 写了:我喜欢atoi。思路也是这种了。
正则去判断全数字的,不稀罕。
:em04

shell内建的+1 -1 还是容易点。
稀罕干啥?能用就好阿.........要不提交到某cgi,然后再返回? :em05
是阶段性。有些东西是慢慢学的。你看我正则表达式就不太熟。现在就shell学点。

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-14 21:39
fnan
shell内建正则法:
read i;[ ${i%%?(-[1-9])*([0-9])} ] && echo not integer! || echo integer.

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-14 22:14
fnan
有个疑问,无关算法,有关数学:
-12是整数,+12写法算不算整数?

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-15 9:17
chengmoYS
fnan 写了:有个疑问,无关算法,有关数学:
-12是整数,+12写法算不算整数?
算,你可以百度下整数。+号是必要时才写的。一般省略+号就可以了。0既不是正整数,也不是负整数。

问题是,这个程序中,当输入以0开头的字符串,像000(识别为0)、035(识别为35)、-067(识别为67),
所以在为了程序的健壮性,还要对所输入的字符串进行必要的判断。
这个时候可以考虑用正则表达式。

^[+-][1-9][0-9]* 合格的输入
45
+45
-45

0还没有被匹配到

^[+-]0[0-9]* 不合格的输入
-0
+0
-000
+0000
+0544
-0454

Re: 判断输入的是整数还是字符串

发表于 : 2011-07-15 21:42
tusooa

代码: 全选

use 5.012;
chomp ($_ = <STDIN>); say /^[+-]\s*\d+$/ ? 'yes' : 'no';