检查变量是否为UNIX shell中的数字

时间:2008-11-21 18:44:32

标签: unix shell

如何在UNIX shell中检查变量是否为数字或包含数字?

14 个答案:

答案 0 :(得分:22)

if echo $var | egrep -q '^[0-9]+$'; then
    # $var is a number
else
    # $var is not a number
fi

答案 1 :(得分:16)

Shell变量没有类型,所以最简单的方法是使用返回类型test命令:

if [ $var -eq $var 2> /dev/null ]; then ...

(或者用正则表达式解析它)

答案 2 :(得分:12)

没有叉子,没有管道。纯POSIX shell:

case $var in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac

(假设数字:=一串数字)。如果您想允许带有一个前导-+的已签名号码,请删除这样的可选符号:

case ${var#[-+]} in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac

答案 3 :(得分:3)

在启用了extglob选项的ksh93或bash中:

if [[ $var == +([0-9]) ]]; then ...

答案 4 :(得分:1)

可以使用正则表达式检查。

 ###    
    echo $var|egrep '^[0-9]+$'
    if [ $? -eq 0 ]; then
        echo "$var is a number"
    else
        echo "$var is not a number"
    fi

答案 5 :(得分:1)

这是一个仅使用裸机shell中可用功能的版本(即它在sh中工作),并且使用的进程少于使用grep的进程:

if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
    echo yes
else
    echo no
fi

这会检查$var仅代表 整数;调整正则表达式,并注意expr regexp参数隐含地锚定在开头。

答案 6 :(得分:1)

我是shell编程的新手,所以我试着找出最简单易读的东西 它只会检查var是大于还是大于0 我认为这是选择参数的好方法......可能不是......:

if [ $var -ge 0 2>/dev/null ] ; then ...

答案 7 :(得分:1)

INTEGER

var selectedBG = UIImage(named:””)
UITabBar.appearance().selectionIndicatorImage = selectedBG

测试(var = 2等):

if echo "$var" | egrep -q '^\-?[0-9]+$'; then 
    echo "$var is an integer"
else 
    echo "$var is not an integer"
fi

2 is an integer
-2 is an integer
2.5 is not an integer 
2b is not an integer

测试(var = 2等):

if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then 
    echo "$var is a number"
else 
    echo "$var is not a number"
fi

答案 8 :(得分:0)

if echo $var | egrep -q '^[0-9]+$'

实际上,如果var是多线,这不起作用。

var="123
qwer"

特别是如果var来自文件:

var=`cat var.txt`

这是最简单的:

if [ "$var" -eq "$var" ] 2> /dev/null
then echo yes
else echo no
fi

答案 9 :(得分:0)

你可以用简单的测试命令来做到这一点。

$ test ab -eq 1 >/dev/null 2>&1
$ echo $?
2

$ test 21 -eq 1 >/dev/null 2>&1
$ echo $?
1

$ test 1 -eq 1 >/dev/null 2>&1
$ echo $?
0

因此,如果退出状态为0或1,那么它是一个整数,但如果exis状态为2,那么它不是数字。

答案 10 :(得分:0)

这是没有任何正则表达式的测试(tcsh代码):

创建文件检查编号:

#! / usr / bin / env tcsh
if ( "$*" == "0" ) then
    exit 0 # number
else
    ((echo "$*" | bc) > /tmp/tmp.txt) >& /dev/null
    set tmp = `cat /tmp/tmp.txt`
    rm -f /tmp/tmp/txt
    if ( "$tmp" == "" || $tmp == 0 ) then
        exit 1 # not a number
    else
        exit 0 # number
    endif

endif

并运行

chmod +x checknumber

使用

checknumber -3.45

你将得到的结果为errorlevel($?)。

您可以轻松优化它。

答案 11 :(得分:0)

从命令行获取值并显示输入是否为DECIMAL / NON-DECIMAL和NUMBER与否:

NUMBER=$1

            IsDecimal=`echo "$NUMBER" | grep "\."`

if [ -n "$IsDecimal" ]
then
            echo "$NUMBER is Decimal"
            var1=`echo "$NUMBER" | cut -d"." -f1`
            var2=`echo "$NUMBER" | cut -d"." -f2`

            Digit1=`echo "$var1" | egrep '^-[0-9]+$'`
            Digit2=`echo "$var1" | egrep '^[0-9]+$'`
            Digit3=`echo "$var2" | egrep '^[0-9]+$'`


            if [ -n "$Digit1" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"
            elif [ -n "$Digit2" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"

            else
                echo "$NUMBER is not a number"
            fi
else
            echo "$NUMBER is not Decimal"

            Digit1=`echo "$NUMBER" | egrep '^-[0-9]+$'`
            Digit2=`echo "$NUMBER" | egrep '^[0-9]+$'`

            if [ -n "$Digit1" ] || [ -n "$Digit2" ]; then
                echo "$NUMBER is a number"
            else
                echo "$NUMBER is not a number"
            fi
fi

答案 12 :(得分:0)

( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
   # $num is a number
}

答案 13 :(得分:-1)

a=123
if [ `echo $a | tr -d [:digit:] | wc -w` -eq 0 ]
then
    echo numeric
else
    echo ng
fi
  

数字

a=12s3
if [ `echo $a | tr -d [:digit:] | wc -w` -eq 0 ]
then
    echo numeric
else
    echo ng
fi
  

纳克