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
*****************************/
intcheck( 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
*****************************/
intmain(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
forvar 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."
}