如何在UNIX shell中检查变量是否为数字或包含数字?
答案 0 :(得分:22)
if echo $var | egrep -q '^[0-9]+$'; then
# $var is a number
else
# $var is not a number
fi
答案 1 :(得分:16)
Shell变量没有类型,所以最简单的方法是使用返回类型test
命令:
if [ $var -eq $var 2> /dev/null ]; then ...
(或者用正则表达式解析它)
答案 2 :(得分:12)
没有叉子,没有管道。纯POSIX shell:
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 :(得分:3)
在启用了extglob选项的ksh93或bash中:
if [[ $var == +([0-9]) ]]; then ...
答案 4 :(得分:1)
可以使用正则表达式检查。
###
echo $var|egrep '^[0-9]+$'
if [ $? -eq 0 ]; then
echo "$var is a number"
else
echo "$var is not a number"
fi
答案 5 :(得分:1)
这是一个仅使用裸机shell中可用功能的版本(即它在sh
中工作),并且使用的进程少于使用grep
的进程:
if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
echo yes
else
echo no
fi
这会检查$var
仅代表 整数;调整正则表达式,并注意expr
regexp参数隐含地锚定在开头。
答案 6 :(得分:1)
我是shell编程的新手,所以我试着找出最简单易读的东西 它只会检查var是大于还是大于0 我认为这是选择参数的好方法......可能不是......:
if [ $var -ge 0 2>/dev/null ] ; then ...
答案 7 :(得分:1)
var selectedBG = UIImage(named:””)
UITabBar.appearance().selectionIndicatorImage = selectedBG
测试(var = 2等):
if echo "$var" | egrep -q '^\-?[0-9]+$'; then
echo "$var is an integer"
else
echo "$var is not an integer"
fi
2 is an integer
-2 is an integer
2.5 is not an integer
2b is not an integer
测试(var = 2等):
if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then
echo "$var is a number"
else
echo "$var is not a number"
fi
答案 8 :(得分:0)
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
答案 9 :(得分:0)
你可以用简单的测试命令来做到这一点。
$ 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,那么它不是数字。
答案 10 :(得分:0)
这是没有任何正则表达式的测试(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($?)。
您可以轻松优化它。
答案 11 :(得分:0)
从命令行获取值并显示输入是否为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
答案 12 :(得分:0)
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
# $num is a number
}
答案 13 :(得分:-1)
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
纳克