Убедитесь, что переменная является числом в оболочке UNIX - PullRequest
21 голосов
/ 21 ноября 2008

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

Ответы [ 14 ]

22 голосов
/ 21 ноября 2008
if echo $var | egrep -q '^[0-9]+$'; then
    # $var is a number
else
    # $var is not a number
fi
16 голосов
/ 21 ноября 2008

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

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

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

12 голосов
/ 08 мая 2013

Нет вилок, нет труб. Чистая оболочка 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
3 голосов
/ 21 ноября 2008

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

if [[ $var == +([0-9]) ]]; then ...
1 голос
/ 01 октября 2015

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

НОМЕР

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
1 голос
/ 20 февраля 2014

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

if [ $var -ge 0 2>/dev/null ] ; then ...
1 голос
/ 08 мая 2013

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

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

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

1 голос
/ 08 мая 2013

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

 ###    
    echo $var|egrep '^[0-9]+$'
    if [ $? -eq 0 ]; then
        echo "$var is a number"
    else
        echo "$var is not a number"
    fi
0 голосов
/ 07 декабря 2017
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
   # $num is a number
}
0 голосов
/ 20 января 2016

Взяв значение из командной строки и показывая, что вход десятичный / недесятичный и номер или нет:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...