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

Убедитесь, что переменная - это число в оболочке UNIX.

Как проверить, является ли переменная числом или содержит номер в оболочке UNIX?

4b9b3361

Ответ 1

if echo $var | egrep -q '^[0-9]+$'; then
    # $var is a number
else
    # $var is not a number
fi

Ответ 2

Переменные оболочки не имеют типа, поэтому самый простой способ - использовать команду return test:

if [ $var -eq $var 2> /dev/null ]; then ...

(Или просто проанализируйте его с помощью регулярного выражения)

Ответ 3

Нет вилок, нет труб. Чистая оболочка POSIX:

case $var in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac

(принимает число: = строка цифр). Если вы хотите разрешить подписанные номера с одним ведущим - или +, разделите необязательный знак следующим образом:

case ${var#[-+]} in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac

Ответ 4

В любом случае ksh93 или bash с включенной опцией extglob:

if [[ $var == +([0-9]) ]]; then ...

Ответ 5

Это можно проверить с помощью регулярного выражения.

 ###    
    echo $var|egrep '^[0-9]+$'
    if [ $? -eq 0 ]; then
        echo "$var is a number"
    else
        echo "$var is not a number"
    fi

Ответ 6

Здесь версия, использующая только функции, доступные в оболочке bare-bones (т.е. она работает в sh), и с одним меньшим процессом, чем с использованием grep:

if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
    echo yes
else
    echo no
fi

Это проверяет, что $var представляет только целое число; отрегулируйте регулярное выражение по вкусу и обратите внимание, что аргумент expr regexp неявно закреплен в начале.

Ответ 7

Я вроде как новичок в программировании на оболочке, поэтому я стараюсь найти самые простые и понятные Он просто проверит, что var больше или равно 0 Я думаю, что это хороший способ выбора параметров... может быть, не что-то...:

if [ $var -ge 0 2>/dev/null ] ; then ...

Ответ 8

INTEGER

if echo "$var" | egrep -q '^\-?[0-9]+$'; then 
    echo "$var is an integer"
else 
    echo "$var is not an integer"
fi

(с var = 2 и т.д.):

2 is an integer
-2 is an integer
2.5 is not an integer 
2b is not an integer

NUMBER

if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then 
    echo "$var is a number"
else 
    echo "$var is not a number"
fi

(с var = 2 и т.д.):

2 is a number
-2 is a number
-2.6 is a number
-2.c6 is not a number
2. is not a number
2.0 is a number

Ответ 9

if echo $var | egrep -q '^[0-9]+$'

На самом деле это не работает, если var является многострочным.

т

var="123
qwer"

Особенно, если var происходит из файла:

var=`cat var.txt`

Это самое простое:

if [ "$var" -eq "$var" ] 2> /dev/null
then echo yes
else echo no
fi

Ответ 10

Вы можете сделать это с помощью простой тестовой команды.

$ test ab -eq 1 >/dev/null 2>&1
$ echo $?
2

$ test 21 -eq 1 >/dev/null 2>&1
$ echo $?
1

$ test 1 -eq 1 >/dev/null 2>&1
$ echo $?
0

Итак, если статус выхода равен 0 или 1, то это целое число, но если статус exis равен 2, то это не число.

Ответ 11

Вот тест без каких-либо регулярных выражений (код tcsh):

Создать контрольный номер файла:

#!/usr/bin/env tcsh
if ( "$*" == "0" ) then
    exit 0 # number
else
    ((echo "$*" | bc) > /tmp/tmp.txt) >& /dev/null
    set tmp = `cat /tmp/tmp.txt`
    rm -f /tmp/tmp/txt
    if ( "$tmp" == "" || $tmp == 0 ) then
        exit 1 # not a number
    else
        exit 0 # number
    endif

endif

и запустите

chmod +x checknumber

Использование

checknumber -3.45

и вы получите результат как errorlevel ($?).

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

Ответ 12

Взятие значения из командной строки и отображение INPUT IS DECIMAL/NON-DECIMAL и NUMBER или нет:

NUMBER=$1

            IsDecimal=`echo "$NUMBER" | grep "\."`

if [ -n "$IsDecimal" ]
then
            echo "$NUMBER is Decimal"
            var1=`echo "$NUMBER" | cut -d"." -f1`
            var2=`echo "$NUMBER" | cut -d"." -f2`

            Digit1=`echo "$var1" | egrep '^-[0-9]+$'`
            Digit2=`echo "$var1" | egrep '^[0-9]+$'`
            Digit3=`echo "$var2" | egrep '^[0-9]+$'`


            if [ -n "$Digit1" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"
            elif [ -n "$Digit2" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"

            else
                echo "$NUMBER is not a number"
            fi
else
            echo "$NUMBER is not Decimal"

            Digit1=`echo "$NUMBER" | egrep '^-[0-9]+$'`
            Digit2=`echo "$NUMBER" | egrep '^[0-9]+$'`

            if [ -n "$Digit1" ] || [ -n "$Digit2" ]; then
                echo "$NUMBER is a number"
            else
                echo "$NUMBER is not a number"
            fi
fi

Ответ 13

( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
   # $num is a number
}

Ответ 14

a=123
if [ `echo $a | tr -d [:digit:] | wc -w` -eq 0 ]
then
    echo numeric
else
    echo ng
fi

Числовое

a=12s3
if [ `echo $a | tr -d [:digit:] | wc -w` -eq 0 ]
then
    echo numeric
else
    echo ng
fi

нг