2010-09-02 57 views

回答

1

echo your_variable_here | grep "^-\?[0-9]*$"如果它是一个整数将返回该变量,否则返回任何内容。

+2

其实它也将打印出来的变量到stdout,如果它是一个整数。你真的想'grep -q',它不打印到标准输出,如果匹配,它只会退出0或非0。 – 2010-09-02 03:57:36

1
shopt -s extglob 
case "$var" in 
+([0-9])) echo "integer"; 
esac 
3
function is_int() { return $(test "[email protected]" -eq "[email protected]" > /dev/null 2>&1); } 

input=0.3 
input="a b c" 
input=" 3 " 
if $(is_int "${input}"); 
    then 
    echo "Integer: $[${input}]" 
else 
    echo "Not an integer: ${input}" 
fi 
1

我需要的东西,只为正整数返回true(以及失败的空字符串)。我对这个解决:

test -n "$1" -a "$1" -ge 0 2>/dev/null

2>/dev/null有没有因为测试打印错误(和返回2)如果输入(-GE)不解析成整数

我希望它可能会更短,但“测试”似乎没有“安静”选项并将“”视为有效整数(零)。

1

你可以这样做:

shopt -s extglob 

if [ -z "${varname##+([0-9])}" ] 
then 
    echo "${varname} is an integer" 
else 
    echo "${varname} is not an integer" 
fi 

的##贪婪地消除由“varname的”返回值的正则表达式,所以如果VAR是一个整数它是真实的,否则为false。

它与最上面的答案一样(使用“$ foo!= [!0-9]”),如果$ varname为空则返回true。我不知道这是否有效。如果不只是将测试更改为:

if [ -n "$varname" ] && [ -z "${varname##[0-9]}" ] 
+0

(刚刚注意到上面的一个错误,它说1a1是一个整数:P ... 1秒) – 2012-03-28 09:11:14

+0

我无法弄清写“一个或多个patter xxx”的“文件名扩展”方式。所以当我写[0-9] *它匹配一个整数后跟任何字符,所以“1a1”,“1a”或“1blah”都匹配... 通过与常见问题相关的测试可以这样完成:'if [[“$ varname”== +([0-9])]]''但'[['不是标准的BASH和必须使用“正确的”正则表达式扩展而不是文件扩展。任何人都知道如何使我的解决方案工作? :P – 2012-03-28 09:44:56

+0

ghostdog74的解决方案给了我答案。添加'shopt -s extglob'我猜想启用所需的模式语法:) – 2012-03-28 09:50:06

0

您可以执行* 2/2操作来检查值是数字还是整数。 操作返回0,如果不是数字

echo "Try with 10" 

var=10 
var1=`echo $((($var*2)/2))` 

if [ "$var" == "$var1" ]; then 
    echo '$var integer' 
else 
    echo '$var not integer' 
fi 

echo "Try with string" 

var=string 
var1=`echo $((($var*2)/2))` 

if [ "$var" == "$var1" ]; then 
    echo '$var integer' 
else 
    echo '$var not integer' 
fi 
+0

确切的重复http://stackoverflow.com/questions/2210349/bash-test-whether-string-is-valid-as-an-integer/ 21884506#21884506 – 2014-02-20 10:09:56

10

只要你使用bash版本> = 3,你可以使用正则表达式:

[[ $a =~ ^-?[0-9]+$ ]] && echo integer 

虽然this bash FAQ提到在bash的正则表达式执行不一致在各种bash 3.x(,如果正则表达式应引用或不是),我认为在这种情况下,没有任何字符需要在任何版本中引用,所以我们是安全的。至少它为我的作品中:

  • 3.00.15(1)-release下(x86_64-红帽Linux的GNU的)
  • 3.2.48(1)-release下(x86_64-苹果darwin12)
  • 4.2.25(1)-release下(x86_64-PC-Linux的GNU)
 
$ a="" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a=" " 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="a" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a='hello world!' 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a='hello world 42!' 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="42" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
integer 
$ a="42.1" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
$ a="-42" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer 
integer 
$ a="two" 
$ [[ $a =~ ^-?[0-9]+$ ]] && echo integer