您的位置:首页 > 运维架构 > Shell

SHELL判断一个字串是否为数字的几种方法

2013-09-10 10:36 1591 查看
PS:  shell结合C应该是可以写出非常强大的脚本的!加油~~~

Shell中经常需要判断一个参数的类型,用来决定是否将该参数传给后续代码执行。

这里简单介绍两种判断一个字符串是否为数字的方法:

 

1.使用Linux下相当牛X的计算器bc,当然这里有点大材小用了,不过也不失为一种方法

echo $str | bc

将字串打印出来,通过管道传给计算器bc这个程序,这个程序的基本功能是计算表达式的值,但是特别的是

在输入单个数字,它返回的值仍然是这个数字(单个数字是特殊的表达式),根据这个特性,就可以用来判断一个字串是否为数字了。

根据方法1,下面给出了一个测试脚本。

#!/bin/sh

#这个脚本用来判断后面的参数的种类(非数字,奇数,偶数,浮点数)。
#用法:Usag: [参数列表]
# checknum.sh

#检测参数个数是否合法
iftest $# -lt 1 #当参数个数小于2时,也就是没有整数输入,报错。
thenecho "参数错误,使用方法:checknum n1 n2 n3... (一个参数序列)。"
exit1 #直接退出
fi

#判断参数种类
forstr in $* #用一个临时变量str,从参数列表中依次次取出各个参数。
do
{
#将取出的参数传给程序bc,用它来检测这个参数是否为数字,并将错误信息重定向。
var=$(echo$str | bc 2>/dev/null)
#如果传入的参数是一个数字,bc返回值就是这个数,否则不是,通过这个可以判断参数是否为数字。
if ["$var" != "$str" ] #如果bc返回值与这个参数相同,则参数一定是数字,反之则不是。
then {
echo "$str 不是一个数字。"
}
#如果参数是数字,则只需要查找是否含有小数点来判断是否为浮点数。
elifecho $str|grep "\." >/dev/null 2>&1
then {
echo "$str 是一个浮点数。"
}
else {
#如果这个参数是一个整数,将他模2,余数为0则是偶数,为1则为奇数。
if test `expr $str % 2` -eq 0
then echo "$str 是一个偶数。"
else echo "$str 是一个奇数。"
fi
}
fi
}
done
exit


方法2:可以自己写一个程序来判断一个字串是否为数字,然后在脚本中调用这个程序就可以达到目的。比如写一个简单的C程序来判断一段字符串是否为数字。程序代码如下:

//check.c

#include<stdio.h>
#include<string.h>

/****************************
* check a char == digital
*****************************/

intisnumber( char ch ) //
{
if( '0'<= ch && '9'>=ch )
{
return 1; //digital
}
else
{
return 0; //notdigital
}
}

/****************************
* check a string == numbers
*****************************/

int check( char *str )
{
int i = 0;
int dot = 0; //thenumber of decimal point
for(; i<strlen(str); i++ )
{
if( !isnumber( str[i]) )
{
if( '.' == str[i] )
{
dot++;
}
else
{
return 0; // not number
}
}
}

if( 0 == dot )
{
return 1; //is number
}
else if( 1 == dot )
{
return 2; //is floatingpoint number, include 4.0 3. .3etc.
}
else
{
return 0; //is notnumber
}
}

/****************************
* mainfuction just recieve one parametter
*****************************/

int main(int argc, char* argv[])
{
int i = 0;
if( 2 != argc )
{
printf("Parametter Error, just recieve oneparametter.\n");
return 3;
}
printf("%d", check(argv[1]) );
return 0;
}用GCC编译之后,将可执行文件命名为check,然后在脚本中调用它。check的功能是接受一个字符串,然后判断它的类型,然后将判断结果打印出来。脚本的内容如下:

#!/bin/sh

#checknum.sh
if [$# -lt 1 ]
then {
echo "Usage: ./checknum.sh n1, n2, ..."
exit 1
}
fi
for var in $*
do
{
res=$(echo `./check $var`)
if [ $res -eq 0 ]
then {
echo "$var is not number."
}
elif [ $res -eq 1 ]
then {
if [ `expr $var % 2` -eq 0 ]
then {
echo "$var is even number."
}
else {
echo "$var is oddnumber."
}
fi
}
elif [ $res -eq 2 ]
then {
echo "$var is float number."
}
else
{
echo "Unknow Error."
}
fi
}
done
exit

使用第二种方法的前提是系统中装了GCC或其他C编译器。当然用其他语言比如python,java等应该也是可以的。

相信除了这两种方法外还有其他方法,比如使用正规式。
if echo "$var" | grep -q '^[a-zA-Z0-9]\+$'; then
echo "$var is number."
else
echo "$var is not number."
fi


原文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: