2

2つのファイルのmd512sumsを比較する小さな関数を書いています。私はbashが得意だとは言えませんが、コメントされた部分が長いコードであるという単純な結果を返す必要があります。削減をお願いします。

ちなみに、誰かが私のコードを改善するためのアイデアを持っているなら、私は感謝します。

function TestStage()
{
    local URL="distfiles.gentoo.org/releases/${1:7:5}/current-stage3/${1}"
    wget -q ${URL}.DIGESTS
    local SUM_WEB=`cat ${1}.DIGESTS | sed '2q;d'`
    local SUM_LOC=`openssl dgst -r -sha512 ${1}`
    ####### time to return
    return [[ "${SUM_WEB:0:128}" == "${SUM_LOC:0:128}" ]]

    #if [ "${SUM_WEB:0:128}" == "${SUM_LOC:0:128}" ]
    #then
    #    rm ${1}.DIGESTS
    #    return 0
    #else
    #    rm ${1}.DIGESTS
    #    return 1
    #fi
}

ご想像のとおり$1ですstage3-<arch>-<release>.tar.bz2

4

3 に答える 3

6

改良点:

TestStage() {
    local url sum_web sum_loc
    url="distfiles.gentoo.org/releases/${1:7:5}/current-stage3/${1}"
    wget -q "$url.DIGESTS"
    { read; read -r sum_web; } < "$1.DIGESTS"
    sum_loc=$(openssl dgst -r -sha512 "$1")
    ####### time to return
    [[ "${sum_web:0:128}" = "${sum_loc:0:128}" ]]
    return
}
  • 小文字の変数名の使用。
  • 非推奨のfunctionキーワードは使用しないでください。
  • $(...)バッククォートの代わりに使用します。
  • sedファイルの 2 行目を取得する代わりに、bash ビルトインを使用します"$1.DIGESTS"。これにより、プロセスのスポーンとサブシェル (および cat の無駄な使用) が節約されます。
  • return単独で、前のステートメント (ここではテスト ステートメント) のリターン コードを返します。
  • 一度にすべてのローカル変数を宣言します。

保存されるファイルを気にしない場合は$1.DIGESTS、次のこともできます。

TestStage() {
    local url sum_web sum_loc
    url="distfiles.gentoo.org/releases/${1:7:5}/current-stage3/${1}"
    { read; read -r sum_web; } < <(wget -q -O- "$url.DIGESTS")
    sum_loc=$(openssl dgst -r -sha512 "$1")
    ####### time to return
    [[ "${sum_web:0:128}" = "${sum_loc:0:128}" ]]
    return
}

さて、"${1:7:5}"私が理解しているように、stage3-<arch>-<release>.tar.bz2(フィールドがハイフンで区切られている)の2番目のフィールドに展開されます。次のこともできます。

IFS=- read _ arch _ <<< "$1"

この場合、関数は次のようになります。

TestStage() {
    local arch url sum_web sum_loc
    IFS=- read _ arch _ <<< "$1"
    url="distfiles.gentoo.org/releases/$arch/current-stage3/${1}"
    { read; read -r sum_web; } < <(wget -q -O- "$url.DIGESTS")
    sum_loc=$(openssl dgst -r -sha512 "$1")
    ####### time to return
    [[ "${sum_web:0:128}" = "${sum_loc:0:128}" ]]
    return
}

お役に立てれば。

次に、次のように使用します。

if TestStage "stage3-<arch>-<release>.tar.bz2"; then
    # return value is true, proceed accordingly
else
    # return value is false, proceed accordingly
fi
于 2012-12-29T11:10:17.803 に答える
1

あなたが行った方法のように比較結果を返すことができるかどうかはわかりません。ほとんどの場合、構文エラーが発生します。

ただし、次の構文を試すことができます。

myfunction()
{
    [ "test" = "test" ]
}

myfunction
echo $?    # here if you get 0 that means strings are equal otherwise 1

このアプローチに従うことにした場合は、比較ステートメントが関数の最後のステートメントであることを確認してください。

于 2012-12-28T23:45:15.043 に答える
0

整数値以外を返すことはできません。Ashish の提案に従って、関数呼び出しの後に終了コードを取得する$?か、文字列比較式を で囲み、2 つのハッシュが同一かどうかを示す任意の値で評価することができif ; thenます。echo

于 2012-12-29T00:29:27.590 に答える