我在OpenWrt中开发了一个脚本shell,如下所示,我注意到一个奇怪的行为(“返回”),如我在脚本末尾的注释中所示。它返回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)
答案 0 :(得分:3)
在大多数Unix系统上,返回值被解释为模256.由于9003 mod 256为43,9005 mod 256等于45,因此分别得到这些返回值。
答案 1 :(得分:1)
H2CO3已经解释了这种行为背后的原因。
我可以建议一个解决方法:将需要从函数返回的数字打印到stdout,然后通过命令替换来捕获它。
即,改变来自
的地方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
答案 2 :(得分:1)
POSIX兼容系统中的返回值仅为1个字节= 8位= 255个可能的值。除非你发现一个支持更多的奇怪系统,你应该选择一组不同的值。
关于返回代码标准的详细信息,请查看this