如何验证十进制数?

时间:2013-01-23 08:20:43

标签: bash shell

嗨,我正在完成一项任务并陷入这一部分,如何验证shell中的十进制数/数字?

它可以接受数字而不是十进制数字。我希望它能够接受两者。

这是我到目前为止所拥有的

if echo $value | egrep '^[0-9]+$' >/dev/null 2>&1 ; then
echo "OK"
else
echo "There Is An Error"
echo "Please Try Again"
fi

7 个答案:

答案 0 :(得分:5)

您可以使用bash来检查表达式,而不是使用grep:

#!/bin/bash

value=98.23
if [[ "$value" =~ ^[0-9]+(\.[0-9]+)?$ ]]
then
   echo good
else
   echo bad
fi

答案 1 :(得分:2)

使用此正则表达式^[0-9]*(\.[0-9]+)?$

答案 2 :(得分:2)

使用bash的模式匹配:

shopt -s extglob
while read line; do
    if [[ $line == ?([-+])+([0-9])?(.*([0-9])) ]] ||
       [[ $line == ?(?([-+])*([0-9])).+([0-9]) ]]
    then
        echo "$line is a number"
    else 
        echo "$line NOT a number"
    fi
done << END
1
-1
a
1a
1.0
1.
.0
.
-.0
+
+0
+.0
END

输出

1 is a number
-1 is a number
a NOT a number
1a NOT a number
1.0 is a number
1. is a number
.0 is a number
. NOT a number
-.0 is a number
+ NOT a number
+0 is a number
+.0 is a number

模式:

  • 可选符号,后跟一个或多个数字,后跟可选的点和零个或多个数字
  • 可选符号,后跟零个或多个数字,后跟一个必填点,后跟一个或多个数字。

答案 3 :(得分:0)

这个怎么样:

if [ ! -z $(echo "$value" | grep -o "^[1-9][0-9]*\.\?[0-9]*$") ]; then echo ok; fi

-z测试一个空字符串。因此,如果给定的字符串以匹配的模式开始,则将满足否定[ ! -z "" ]

答案 4 :(得分:0)

在标准shell中,[[是非标准的)test将为您进行验证。

if test "$value" -eq 0 -o "$value" -ne 0 2> /dev/null; then
  : # $value is an integer
else
  : # $value is not an integer
fi

答案 5 :(得分:0)

试试这个:它也检查负数和十进制数。

echo $value | egrep '^-[0-9]+$|^[0-9]+$|^[0-9].[0-9]+$|^-[0-9].[0-9]+$' > /dev/null

答案 6 :(得分:0)

适用于Bash 3.0和4.0。

isInteger() {
    [[ $1 =~ ^[0-9]+$ ]];
}
isDecimal() {
    [[ $1 =~ ^[0-9]+\.[0-9]+$ ]] && ! isInteger $1;
}

computer:~ # isDecimal 123 && echo true || echo false
false
computer:~ # isDecimal 12.34 && echo true || echo false
true
computer:~ # isDecimal 12.34a && echo true || echo false
false
computer:~ # isDecimal 0.0000001 && echo true || echo false
true

要检查号码,只需针对这两个功能进行测试。