改进:
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