我正在编写一个小函数来比较两个文件的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
。
答案 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
关键字。$(...)
代替反对。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
任何表示两个哈希值相同或不相同的值。