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)
正如你可能已经猜到了$1是stage3-<arch>-<release>.tar.bz2.
改进:
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)
function关键字.$(...)而不是反引号.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)