В трубе bash примите вывод предыдущей команды как переменную для следующей команды (например, оператор if) - PullRequest
2 голосов
/ 11 марта 2020

Я хотел написать команду для сравнения ха sh файла. Я написал следующую однострочную команду. Хотел понять, как я могу взять выходные данные предыдущей команды в качестве переменной для текущей команды в конвейере.

Например. В приведенной ниже команде я хотел сравнить выходные данные 1-й команды «Вычисленные га sh» с исходной ха sh. В последней команде я хотел сослаться на вывод предыдущей команды. Как мне это сделать в операторе if? (Вместо $0)

sha256sum abc.txt | awk '{print $1}' | if [ "$0" = "8237491082roieuwr0r9812734iur" ]; then
    echo "match"
fi

Ответы [ 2 ]

5 голосов
/ 11 марта 2020

После того, как ваш узкий запрос выглядит следующим образом:

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

... as cat без аргументов считывает стандартный ввод команды, а в конвейере содержимое, созданное на предыдущих этапах, передается в их преемники.

Альтернативно:

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

... где мы read только одна строка из stdin вместо использования cat. (Вместо l oop по всем строкам, указанным в stdin, см. BashFAQ # 1 ).


Однако я настоятельно рекомендовал бы написать это вместо этого:

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

... который, помимо прочего, сохраняет вашу логику c вне конвейера, поэтому ваш оператор if может устанавливать переменные, которые остаются установленными после выхода из конвейера. См. BashFAQ # 24 для более подробной информации о проблемах, присущих выполнению кода в конвейерах.

2 голосов
/ 11 марта 2020

Попробуйте использовать режим проверки sha256sum. Если вы сохраните вывод sha256sum в файл, вы можете проверить его с помощью sha256sum -c.

$ echo foo > file        
$ sha256sum file > hash.txt
$ cat hash.txt
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  file
$ sha256sum -c hash.txt
file: OK
$ if sha256sum -c --quiet hash.txt; then echo "match"; fi

Если вы не хотите сохранять хеши в файл, вы можете передать их через здесь-строка :

if sha256sum -c --quiet <<< 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  file'; then
    echo "match"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...