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关键字。
  • 使用 of$(...)代替反引号。
  • 使用 bash 内置函数而不是sed获取文件的第二行"$1.DIGESTS"。这节省了进程生成和子shell(以及对 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(字段由连字符分隔)。你也可以这样做:

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 的建议并在函数调用之后检索退出代码,$?或者您可以通过将字符串比较表达式包围起来来评估您的字符串比较表达式,if ; then然后只使用echo任何值来指示两个哈希是否相同。

于 2012-12-29T00:29:27.590 回答