在 bash 管道中,将上一个命令的输出作为下一个命令的变量(例如 if 语句)

Thu*_*olt 2 bash if-statement pipe conditional-statements

我想写一个命令来比较文件的哈希值。我写了下面的单行命令。想了解如何在管道中将上一个命令的输出作为当前命令的变量。

例如。下面的命令我想将第一个命令“计算散列”的输出与原始散列进行比较。在上一条命令中,我想参考上一条命令的输出。我如何在 if 语句中做到这一点?(而不是$0

sha256sum abc.txt | awk '{print $1}' | if [ "$0" = "8237491082roieuwr0r9812734iur" ]; then
    echo "match"
fi
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

遵循您的狭窄请求如下所示:

sha256sum abc.txt  |
  awk '{print $1}' |
  if [ "$(cat)" = "8237491082roieuwr0r9812734iur" ]; then echo "match"; fi
Run Code Online (Sandbox Code Playgroud)

...因为cat没有参数读取命令的标准输入,并且在管道中,从先前阶段生成的内容被流式传输到它们的后继阶段。

交替:

sha256sum abc.txt  |
  awk '{print $1}' |
  if read -r line && [ "$line" = "8237491082roieuwr0r9812734iur" ]; then echo "match"; fi
Run Code Online (Sandbox Code Playgroud)

...其中我们read只有来自 stdin 的一行,而不是使用cat. (要改为遍历 stdin 上给出的所有行,请参阅BashFAQ #1)。


但是,我强烈建议将其写为:

if [ "$(sha256sum abc.txt | awk '{print $1}')" = "8237491082roieuwr0r9812734iur" ]; then
  echo "match"
fi
Run Code Online (Sandbox Code Playgroud)

...其中,除其他外,将您的逻辑保留在管道之外,因此您的if语句可以设置在管道退出后保持设置的变量。有关在管道中运行代码所固有的问题的更多详细信息,请参阅BashFAQ #24