2

我在 OpenWrt 中开发了一个脚本外壳,如下所示,我注意到一个奇怪的行为(“返回”),如我在脚本末尾的评论中所示。它返回 43 而不是 9003 和 45 而不是 9005,你对这种行为有什么解释吗?

#!/bin/sh

get_value() {
case "$1" in
    aa)
    if [ "$2" = "1" ]; then
        return 9003
    fi
# function fn1 to execute
    fn1
    return 0
    ;;
    bb)
    if [ "$2" = "1" ]; then
        return 9003
    fi
# function fn2 to execute
    fn2
    return 0
    ;;
    cc)
    if [ "$2" = "1" ]; then
        return 9003
    fi
# function fn3 to execute
    fn3
    return 0
    ;;
esac
return 9005
}
# when a call get_value
get_value aa 0
echo $?
# result 0
get_value aa 1
echo $?
# result 43 (not 9003)
get_value dd 1
echo $?
# result 45 (not 9005)
4

3 回答 3

3

在大多数 Unix 系统上,返回值被解释为模 256。由于 9003 mod 256 是 43,并且 9005 mod 256 等于 45,因此您分别得到这些返回值。

于 2012-11-14T19:59:36.853 回答
1

POSIX 兼容系统中的返回值只有 1 字节 = 8 位 = 255 个可能的值。除非你找到一个支持更多的奇怪系统,否则你应该选择一组不同的值。

请参阅问题以获取有关返回代码标准的更多详细信息

于 2012-11-14T20:03:57.847 回答
1

H2CO3 已经解释了这种行为背后的原因。

我可以建议一个解决方法:将需要从函数返回的数字打印到标准输出,然后通过命令替换捕获它。

即,用从

return 9003

echo "9003"
return 0

并通过以下方式捕获它:

retVal=$(get_value aa 1)

所以你的代码应该是这样的:

#!/bin/sh

get_value() {
case "$1" in
    aa)
    if [ "$2" = "1" ]; then
        echo "9003"
        return 0
    fi
# function fn1 to execute
    fn1
    echo "0"
    return 0
    ;;
    bb)
    if [ "$2" = "1" ]; then
        echo "9003"
        return 0
    fi
# function fn2 to execute
    fn2
    echo "0"
    return 0
    ;;
    cc)
    if [ "$2" = "1" ]; then
        echo "9003"
        return 0
    fi
# function fn3 to execute
    fn3
    echo "0"
    return  0
    ;;
esac
echo "9005"
return 0
}

retVal=$(get_value aa 0)
echo "$retVal"

retVal=$(get_value aa 1)
echo "$retVal"

retVal=$(get_value dd 1)
echo "$retVal"

只要记住将您不希望返回到 retVal 的任何内容重定向到/dev/stderr

于 2012-11-14T20:02:23.903 回答