Bash:测试变量是否为整数

时间:2010-09-02 03:37:40

标签: bash testing variables integer

我想测试我的变量$var是否实际上是一个整数。我该怎么办呢?

7 个答案:

答案 0 :(得分:15)

只要您使用的是bash版本> = 3,就可以使用正则表达式:

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

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

  • 3.00.15(1)-release(x86_64-redhat-linux-gnu)
  • 3.2.48(1)-release(x86_64-apple-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

答案 1 :(得分:4)

function is_int() { return $(test "$@" -eq "$@" > /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

答案 2 :(得分:3)

我需要的东西只能为正整数返回true(并且空字符串失败)。我决定这个:

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

2>/dev/null是因为如果输入(to -ge)不解析为整数,test会输出错误(并返回2)

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

答案 3 :(得分:2)

shopt -s extglob
case "$var" in
 +([0-9]) ) echo "integer";
esac

答案 4 :(得分:1)

如果变量是整数,

echo your_variable_here | grep "^-\?[0-9]*$"将返回该变量,否则返回任何内容。

答案 5 :(得分: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是整数,则为true,否则为false。

它与顶部答案具有相同的弱点(使用“$ foo!= [!0-9] ”),如果$ varname为空,则返回true。我不知道这是否有效。如果不只是将测试更改为:

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

答案 6 :(得分: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
相关问题