返回字符串比较结果 - bash

时间:2012-12-28 22:50:24

标签: linux bash scripting gentoo

我正在编写一个小函数来比较两个文件的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
}

您可能已经猜到$1stage3-<arch>-<release>.tar.bz2

3 个答案:

答案 0 :(得分:5)

改进:

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关键字。
  • 使用$(...)代替反对。
  • 使用bash builtins而不是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

答案 1 :(得分:0)

我不确定你是否可以按照你的方式返回比较结果。 您很可能会遇到语法错误。

但您可以尝试以下语法:

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

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

如果您决定采用这种方法,请确保比较语句是您函数中的最后一个语句。

答案 2 :(得分:0)

除了整数值之外,您不能返回任何内容。您可以使用Ashish的suggestion并在函数调用后从$?检索退出代码,也可以通过用if ; then围绕它来评估字符串比较表达式,然后只需echo任何表示两个哈希值相同或不相同的值。