2

以下のようにOpenWrtでスクリプトシェルを開発しましたが、スクリプトの最後にあるコメントに示されているように、奇妙な動作(「リターン」)に気づきました。9003の代わりに43、9005の代わりに45が返されますが、この動作について何か説明がありますか?

#!/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として解釈されます。9003mod256は43であり、9005 mod 256は45であるため、それぞれこれらの戻り値を取得します。

于 2012-11-14T19:59:36.853 に答える
1

POSIX互換システムの戻り値は、1バイト=8ビット=255の可能な値のみです。それ以上をサポートする奇妙なシステムを見つけない限り、別の値のセットを選択する必要があります。

戻りコード標準の詳細については、この質問を参照してください

于 2012-11-14T20:03:57.847 に答える
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

于 2012-11-14T20:02:23.903 に答える