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

简介: PS:  shell结合C应该是可以写出非常强大的脚本的!加油~~~ Shell中经常需要判断一个参数的类型,用来决定是否将该参数传给后续代码执行。 这里简单介绍两种判断一个字符串是否为数字的方法:   1.使用Linux下相当牛X的计算器bc,当然这里有点大材小用了,不过也不失为一种方法 echo $str | bc 将字串打印出来,通过管

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编译器。当然用其他语言比如pythonjava等应该也是可以的。

相信除了这两种方法外还有其他方法,比如使用正规式。

if echo "$var" | grep -q '^[a-zA-Z0-9]\+$'; then
echo "$var is number."
else
echo "$var is not number."
fi

原文

目录
相关文章
|
4月前
|
Shell Linux
6:父子shell-步入Linux的现代方法
6:父子shell-步入Linux的现代方法
39 0
|
4月前
|
Linux Shell Windows
4:Bash shell命令-步入Linux的现代方法
4:Bash shell命令-步入Linux的现代方法
53 0
|
5月前
|
Shell Linux
Linux Shell脚本调试方法
Linux Shell脚本调试方法
|
5月前
|
运维 Shell
运维(15)-shell脚本的调试方法
运维(15)-shell脚本的调试方法
37 0
|
4月前
|
Kubernetes Shell Linux
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
60 0
|
3天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
28 3
|
1天前
|
监控 Shell
生产环境Shell脚本Ping监控主机是否存活(多种方法)
生产环境Shell脚本Ping监控主机是否存活(多种方法)
|
1天前
|
运维 Shell
Shell脚本判断IP是否合法性(多种方法)
Shell脚本判断IP是否合法性(多种方法)
|
23天前
|
Shell
【shell】shell命令行放在变量中执行以及变量的常用方法
【shell】shell命令行放在变量中执行以及变量的常用方法
|
2月前
|
监控 Shell Linux
Linux如何系统的学习shell方法
Linux如何系统的学习shell方法
29 0