改良点:
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
ファイルの 2 行目を取得する代わりに、bash ビルトインを使用します"$1.DIGESTS"
。これにより、プロセスのスポーンとサブシェル (および 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
(フィールドがハイフンで区切られている)の2番目のフィールドに展開されます。次のこともできます。
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