我一直在尝试编写一个bash函数来检查变量是否为整数。下面脚本中的is_number函数会进行此检查。
当我运行它(测试值为1234)时,我收到以下错误消息:
./test_n2.sh: line 13: [: Checking 1234
1234: integer expression expected
n is not an integrer
我很困惑:函数返回$ ?,在我的单行测试中使用grep将积分值正确设置为0。主块中的整数比较以[“$ retval”-eq 0]完成,AFAIK是测试整数的正确形式。
有人可以帮忙吗?
#!/usr/bin/env bash
function is_number {
number=$1
echo "Checking $number"
echo $number | /bin/egrep '^[0-9]+$'
return $?
}
n=1234
retval=`is_number $n`
if [ "$retval" -eq 0 ]; then
echo n is an integer
exit 0
fi
echo n is not an integrer
exit 1
答案 0 :(得分:2)
使用反引号或$(...)
分配变量时,它会获得命令的标准输出。命令的返回值放在变量$?
中。所以你应该这样做:
is_number $n
retval=$?
或者您可以简单地写一下:
if is_number $n; then
echo n is an integer
exit 0
fi
答案 1 :(得分:0)
你根本不需要grep
,bash自己会愉快地完成工作,并且更有效率:
is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}
然后您可以将其用作:
if is_number 123; then
echo "it's a number!"
else
echo "it's not a number!"
fi
使用以下警告:如果需要执行算术运算,请注意前导零将强制bash将字符串解释为基数8中的数字。因此以下是错误:
a=09
if is_number "$a"; then
echo $((a+1));
else
echo "Not a number"
fi
因此,您的代码段写得更好:
#!/usr/bin/env bash
shopt -s extglob
is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}
n=1234
if is_number "$n"; then
echo "n is an integer"
exit 0
else
echo "n is not an integer"
exit 1
fi
或者如果您需要保存函数is_number
的返回值:
#!/usr/bin/env bash
shopt -s extglob
is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}
n=1234
is_number "$n"
ret=$?
if ((ret==0)); then
echo "n is an integer"
else
echo "n is not an integer"
fi
exit "$ret"