Как проверить, является ли переменная числом или содержит номер в оболочке UNIX?
Убедитесь, что переменная - это число в оболочке UNIX.
Ответ 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 tcshif ( "$*" == "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
нг