シェルスクリプトの単一クエリに複数の出力がある場合、各出力をどのように宣言しますか?

シェルスクリプトの単一クエリに複数の出力がある場合、各出力をどのように宣言しますか?

出力が一致したら、次のコマンドを実行して条件を作成したいと思います。

diff -is <(echo 'curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256') \
         <(shasum -a 256 teleport-v9.3.4-linux-amd64-bin.tar.gz)

上記のコマンドの出力は次のとおりです。

< 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15 teleport-v9.3.4-linux-amd64-bin.tar.gz
> 15c7fabe609513fdba95ff68ccc59f29502f32f4d20c163bd9ff47770b554d15  teleport-v9.3.4-linux-amd64-bin.tar.gz

この場合、チェックサムは一致するため、条件に追加する各出力をどのように宣言できますか?例:出力a = =出力bの場合、チェックサムは一致します。誰でも助けてもらえればいいでしょう。

回答ありがとうございます。次の答えを試してみましたが、要求された操作を実行できました。

答え1

私はshasumがその出力をdiff-ingする代わりに、独自の組み込みの「チェック」オプション()を使用するようにします。*.sha256shasumshasum -c

実行中:

$ echo "This is a file" > file1
$ echo "This is another file" > file2
$ shasum -a 256 file* | tee files.sha256
0b7d91193b9c0f5cc01d40332a10cf1ed338a41640bd7f045f1087628c1d7a9b  file1
0290013ed1662eda102bee144a282ffe03d226b4dd9134c251c6b3be6d69d6ec  file2


$ shasum -c files.sha256
file1: OK
file2: OK
$ echo $?
0

$ echo "damaged file" > file1

$ shasum -c files.sha256
file1: FAILED
file2: OK
shasum: WARNING: 1 computed checksum did NOT match
$ echo $?
1

このスクリプトを作成すると、shasum -cの終了コードを使用して検証が成功したかどうかを確認できます。

したがって、お客様の場合は、次のことを行います。

wget https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
shasum -c teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256
rm teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256

または

shasum -c <(curl https://get.gravitational.com/teleport-v9.3.4-linux-amd64-bin.tar.gz.sha256)

答え2

URLとファイル名を変更した後に実際に実行するコマンドは次のとおりです。

diff -is <(echo `curl "$url"`)  <(shasum -a 256 "$file")
                ^           ^

これはecho `curl...`投稿(*)などの一重引用符ではなくバックティックです。引用符なしのコマンド置換を介しcurlて渡される出力は、2つの別々の引数を提供し、スペースechoで連結してトークン化を適用します。ファイルの二重スペースを単一のスペースに効果的に変更します。

curl https://...(*一重引用符を使用すると、コマンドで実行されずに出力されます)

望むより:

これが出力が提供される理由でもありますdiff。行は単一の空白と同じです。

無駄なコマンド置換を削除して実行すると

diff -is <(curl "$url")  <(shasum -a 256 "$file")

代わりに、ファイルを同じと認識して-s。その後、diff印刷された出力を気にせずに終了ステータスを直接使用できます。

if diff -iq <(curl "$url")  <(shasum -a 256 "$file") > /dev/null; then
    echo "hashes are the same"
else
    echo "hashes differ"
fi

diff大文字と小文字を無視する機能以外には必要ありませんが、必ずしも必要ではないと思います。出力をシェル変数に保存して比較できます。

their=$(curl "$url")
mine=$(shasum -a 256 "$file")
if [[ "$their" == "$mine" ]]; then
    echo "hashes match"
else
    echo "hashes do not match"
fi

または、最初の部分をハッシュと比較したい場合:

their=$(curl "$url")
their=${their%% *}
mine=$(shasum -a 256 "$file")
mine=${mine%% *}
if [[ "$their" == "$mine" ]]; then
    ...

それとも同じ

read -r hash1 filename1 < <(curl "$url")
etc.

出力の2つのフィールドを別々の変数として読み込みます。

関連情報