我是一名打击脚本的新生,我很难解决任务问题。 我想知道是否有一种简单的方法来确定用户的输入是否是整数。更具体地说,如果提示用户输入整数,是否需要快速检查以验证?
答案 0 :(得分:27)
一种方法是检查它是否包含非数字字符。用任何东西替换所有数字字符并检查长度 - 如果长度有非数字字符。
if [[ -n ${input//[0-9]/} ]]; then
echo "Contains letters!"
fi
另一种方法是检查在算术上下文中计算的变量是否等于自身。这是特定于bash的
if [[ $((foo)) != $foo ]]; then
echo "Not just a number!"
fi
答案 1 :(得分:12)
这是一种kludge,它使用-eq来表示其他目的,但它检查一个整数,如果它没有找到一个int,它会返回一个错误,你可以抛到/ dev / null,值为false。
read input
if [ $input -eq $input 2>/dev/null ]
then
echo "$input is an integer"
else
echo "$input is not an integer"
fi
答案 2 :(得分:10)
您可以使用正则表达式进行测试
if ! [[ "$yournumber" =~ ^[0-9]+$ ]] ;
then exec >&2; echo "error: Not a number"; exit 1
fi
答案 3 :(得分:1)
我发现这篇帖子http://www.unix.com/shell-programming-scripting/21668-how-check-whether-string-number-not.html正在讨论这个问题。
如果你的输入不需要检查数字上是否有+/-,那么你可以这样做:
expr $num + 1 2> /dev/null
if [ $? = 0 ]
then
echo "Val was numeric"
else
echo "Val was non-numeric"
fi
答案 4 :(得分:1)
这是另一种方法。在大多数情况下,它可能比需要的更精细,但也会处理小数。我写了下面的代码来得到四舍五入的数字。它还会检查过程中的数字输入。
#--- getRound -- Gives number rounded to nearest integer -----------------------
# usage: getRound <inputNumber>
#
# echos the rounded number
# Best to use it like:
# roundedNumber=`getRound $Number`
# check the return value ($?) and then process further
#
# Return Value:
# 2 - if <inputNumber> is not passed, or if more arguments are passed
# 3 - if <inputNumber> is not a positive number
# 0 - if <inputNumber> is successfully rounded
#
# Limitation: Cannot be used for negative numbers
#-------------------------------------------------------------------------------
getRound (){
if [ $# -ne 1 ]
then
exit 2
fi
#--- Check if input is a number
Input=$1
AB=`echo A${Input}B | tr -d [:digit:] | tr -d '.'`
if [ "${AB}" != "AB" ] #--- Allow only '.' and digit
then
exit 3
fi
DOTorNone=`echo ${Input} | tr -d [:digit:]` #--- Allow only one '.'
if [ "${DOTorNone}" != "" ] && [ "${DOTorNone}" != "." ]
then
exit 3
fi
echo $Input | awk '{print int($1+0.5)}' #--- Round to nearest integer
}
MyNumber=`getRound $1`
if [ $? -ne 0 ]
then
echo "Empty or invalid input passed"
else
echo "Rounded input: $MyNumber"
fi
答案 5 :(得分:0)
这对我有用,处理空的输入案例。
if [ $input -eq $input 2>/dev/null -o $input -eq 0 2>/dev/null ]
then
echo Integer
else
echo Not an integer
fi