如果 shell 脚本中的单个查询中有多个输出,如何声明每个输出?

如果 shell 脚本中的单个查询中有多个输出,如何声明每个输出?

如果输出匹配,我想通过执行以下命令来编写一个条件。

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*.sha256和 的输出。shasumshasum -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会应用分词,为 提供两个不同的参数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虽然除了忽略大小写的功能之外你不需要那里,但我认为这是没有必要的。您可以将输出存储在 shell 变量中并比较它们:

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.

将输出中的两个字段读取到单独的变量中。

相关内容