2012-11-14 193 views
2

我在OpenWrt中開發了一個腳本shell,如下所示,我注意到腳本結尾處的註釋中顯示了一個奇怪的行爲(「返回」)。它返回43而不是9003和45而不是9005,你對這種行爲有任何解釋嗎?在shell腳本中返回命令

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

回答

3

在大多數Unix系統中,返回值被解釋爲模256自9003 MOD 256是43,而9005 MOD 256等於45,你分別得到這些返回值。

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

1

在POSIX兼容的系統返回的值只有1個字節= 8位= 255倍可能的值。除非你發現一個支持更多的奇怪系統,否則你應該選擇一組不同的值。

Se this問題有關返回代碼標準的更多詳細信息