Как проверить, является ли переменная числом в Bash?

В разделе Window > Preferences перейдите в раздел Run/Debug > Console, затем вы увидите опцию «Limit console output». Вы можете снять этот флажок или изменить номер в текстовом поле «Размер буфера консоли (символов)» ниже.

(Это в Galileo, Kepler, Juno, Luna, Neon, Mars, Helios CDT и Oxygen)

517
задан codeforester 5 February 2017 в 17:12
поделиться

6 ответов

Один из подходов заключается в использовании регулярного выражения, например, так:

re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1
fi

Если значение не обязательно является целым числом, рассмотрите возможность внесения соответствующих изменений в регулярное выражение; например:

^[0-9]+([.][0-9]+)?$

... или, для обработки чисел со знаком:

^[+-]?[0-9]+([.][0-9]+)?$
727
ответ дан 22 November 2019 в 22:20
поделиться

The following solution can also be used in basic shells such as Bourne without the need for regular expressions. Basically any numeric value evaluation operations using non-numbers will result in an error which will be implicitly considered as false in shell:

"$var" -eq "$var"

as in:

#!/bin/bash

var=a

if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
  echo number
else
  echo not a number
fi

You can can also test for $? the return code of the operation which is more explicit:

[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
   echo $var is not number
fi

Redirection of standard error is there to hide the "integer expression expected" message that bash prints out in case we do not have a number.

CAVEATS (thanks to the comments below):

  • Numbers with decimal points are not identified as valid "numbers"
  • Using [[ ]] instead of [ ] will always evaluate to true
  • Most non-Bash shells will always evaluate this expression as true
  • The behavior in Bash is undocumented and may therefore change without warning
  • If the value includes spaces after the number (e.g. "1 a") produces error, like bash: [[: 1 a: syntax error in expression (error token is "a")
  • If the value is the same as var-name (e.g. i="i"), produces error, like bash: [[: i: expression recursion level exceeded (error token is "i")
171
ответ дан 22 November 2019 в 22:20
поделиться

Я использую следующее (для целых чисел):

## ##### constants
##
## __TRUE - true (0)
## __FALSE - false (1)
##
typeset -r __TRUE=0
typeset -r __FALSE=1

## --------------------------------------
## isNumber
## check if a value is an integer 
## usage: isNumber testValue 
## returns: ${__TRUE} - testValue is a number else not
##
function isNumber {
  typeset TESTVAR="$(echo "$1" | sed 's/[0-9]*//g' )"
  [ "${TESTVAR}"x = ""x ] && return ${__TRUE} || return ${__FALSE}
}

isNumber $1 
if [ $? -eq ${__TRUE} ] ; then
  print "is a number"
fi
0
ответ дан 22 November 2019 в 22:20
поделиться

Это проверяет, является ли число неотрицательным целым числом и независимо от оболочки (т. Е. Без bashisms) и использует только встроенные функции оболочки:

НЕПРАВИЛЬНО.

Поскольку этот первый ответ (ниже) допускает целые числа с символами в них, если первые не являются первыми в переменной.

[ -z "${num##[0-9]*}" ] && echo "is a number" || echo "is not a number";

ПРАВИЛЬНО .

Как jilles прокомментировал и предложил в свой ответ , это правильный способ сделать это с использованием шаблонов оболочки.

[ ! -z "${num##*[!0-9]*}" ] && echo "is a number" || echo "is not a number";
38
ответ дан 22 November 2019 в 22:20
поделиться

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html

Вы также можете использовать классы символов bash.

if [[ $VAR = *[[:digit:]]* ]]; then
 echo "$VAR is numeric"
else
 echo "$VAR is not numeric"
fi

Числа будут включать пробел, десятичную точку и «e» или «E» для чисел с плавающей запятой.

Но если вы укажете шестнадцатеричное число в стиле C, то есть «0xffff» или «0XFFFF», [[: digit:]] вернет истину. Здесь небольшая ловушка, bash позволяет вам делать что-то вроде "0xAZ00" и по-прежнему считать это цифрой (разве это не из-за какой-то странной причуды компиляторов GCC, которые позволяют вам использовать нотацию 0x для оснований, отличных от 16 ??? )

Вы можете захотеть проверить "0x" или "0X" перед проверкой, является ли это числовым, если ваш ввод полностью ненадежен, если вы не хотите принимать шестнадцатеричные числа. Это можно сделать с помощью:

if [[ ${VARIABLE:1:2} = "0x" ]] || [[ ${VARIABLE:1:2} = "0X" ]]; then echo "$VAR is not numeric"; fi
6
ответ дан 22 November 2019 в 22:20
поделиться

Это немного грубо по краям, но немного более удобно для новичков.

if [ $number -ge 0 ]
then
echo "Continue with code block"
else
echo "We matched 0 or $number is not a number"
fi

Это вызовет ошибку и напечатает «Недопустимое число:», если $ число не число, но оно будет не вырваться из сценария. Как ни странно, я не могу найти ни одного варианта проверки, чтобы просто проверить целое число. Логика здесь будет соответствовать любому числу, которое больше или равно 0.

-4
ответ дан 22 November 2019 в 22:20
поделиться