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