Подтвердить что ты не робот

Проверка, является ли переменная целым числом

Я бы хотел проверить, действительно ли моя переменная $var является целым числом или нет. Как я могу это сделать?

4b9b3361

Ответ 1

Пока вы используете bash version >= 3, вы можете использовать регулярное выражение:

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

Пока этот bash FAQ упоминает несоответствия в реализации bash regex в различных bash 3.x(должно ли регулярное выражение быть цитата или нет), я думаю, что в этом случае нет символов, которые нуждаются в цитировании в любой версии, поэтому мы в безопасности. По крайней мере, это работает для меня в:

  • 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 "[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

Ответ 3

Мне нужно что-то, что вернет true только для положительных целых чисел (и не будет для пустой строки). Я остановился на этом:

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

2>/dev/null существует, потому что тест печатает ошибку (и возвращает 2), если вход (to -ge) не анализируется как целое число

Я бы хотел, чтобы он был короче, но "тест", похоже, не имеет "тихой" опции и рассматривает "" как допустимое целое число (ноль).

Ответ 4

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

Ответ 5

echo your_variable_here | grep "^-\?[0-9]*$" вернет переменную, если она является целым числом и ничего не возвращает.

Ответ 6

Вы можете сделать это:

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]}" ]

Ответ 7

Вы можете выполнить операцию * 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