将bash函数的返回值评估为整数

时间:2014-06-13 16:23:29

标签: bash function testing comparison return

我一直在尝试编写一个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是测试整数的正确形式。

有人可以帮忙吗?

TIA。

#!/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

2 个答案:

答案 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"