返回字符串比较结果 - bash

use*_*526 2 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
}
Run Code Online (Sandbox Code Playgroud)

正如你可能已经猜到了$1stage3-<arch>-<release>.tar.bz2.

gni*_*urf 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
}
Run Code Online (Sandbox Code Playgroud)
  • 使用小写变量名称.
  • 不使用deprecated function关键字.
  • 使用$(...)而不是反引号.
  • 使用bash builtins而不是sed获取第二行文件"$1.DIGESTS".这样可以节省进程生成和子shell(以及对cat的无用使用).
  • return 它自己将返回前一个语句的返回码,这里是test语句.
  • 一次声明所有局部变量.

如果您不关心$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
}
Run Code Online (Sandbox Code Playgroud)

现在,"${1:7:5}"将根据我的理解,扩展到第二个字段stage3-<arch>-<release>.tar.bz2(其中字段用连字符分隔).你也可以这样做:

IFS=- read _ arch _ <<< "$1"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的功能将是:

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
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

然后,用作:

if TestStage "stage3-<arch>-<release>.tar.bz2"; then
    # return value is true, proceed accordingly
else
    # return value is false, proceed accordingly
fi
Run Code Online (Sandbox Code Playgroud)