Testing if a variable is an integer [duplicate]

醉酒当歌 提交于 2019-12-20 09:36:08

问题


I would like to test if my variable $var is actually an integer or not. How can I please do that?


回答1:


As long as you're using bash version >=3 you can use a regular expression:

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

While this bash FAQ mentions inconsistencies in the bash regex implementation in various bash 3.x (should the regex be quoted or not), I think in this case, there are no characters that need quoting in any version, so we are safe. At least it works for me in:

  • 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



回答2:


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



回答3:


I was needing something that would return true only for positive integers (and fail for the empty string). I settled on this:

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

the 2>/dev/null is there because test prints an error (and returns 2) if an input (to -ge) doesn't parse as an integer

I wish it could be shorter, but "test" doesn't seem to have a "quiet" option and treats "" as a valid integer (zero).




回答4:


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



回答5:


echo your_variable_here | grep "^-\?[0-9]*$" will return the variable if it is an integer and return nothing otherwise.




回答6:


You can do this:

shopt -s extglob

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

The ## greedily removes the regular expression from the value returned by "varname", so if the var is an integer it is true, false if not.

It has the same weakness as the top answer (using "$foo != [!0-9]"), that if $varname is empty it returns true. I don't know if that's valid. If not just change the test to:

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



回答7:


You can perform a *2 /2 operation that check both if value is numeric and is integer. The operation returns 0 if not numeric

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


来源:https://stackoverflow.com/questions/3623662/testing-if-a-variable-is-an-integer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!