我正在尝试编写一个逐行运行文件的基本脚本,使用sha256对每一行进行加密,然后将其与固定测试进行比较以获得匹配结果。
Row
file.txt
我的代码:
foo
bar
bazz
password
结果:
#!/bin/bash
file="./file.txt"
while IFS='' read -r line || [[ -n "$line" ]] ; do
password="5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
echo "Testing $line: "
try=$line | sha256sum
if [[ "$try" == "$password" ]] ; then
echo "match"
else
echo "no match"
fi
done <"$file"
我认为testing foo
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
no match
testing bar
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
no match
testing bazz
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
no match
testing password
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
no match
是问题所在,因为如果我使用try=$line | sha256sum
中的示例单独运行它:
file.txt
将foo | sha256sum
foo: command not found
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
放入&#34;&#34;不会改变上面的结果
我能够正确处理管道的唯一方法是在前面放置一个foo
:
echo
这不是理想的结果,因为我不想打印每个sha256sum我只是想对该行进行编码然后检查它。如果匹配则打印匹配,否则不匹配。
预期结果:
echo -n foo | sha256sum
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae
答案 0 :(得分:3)
打印该行以将其传送到sha256
将不会将其打印到屏幕上。但是,如果要捕获sha256
的输出,则需要使用命令替换而不是仅运行命令。
那一行应该是:
try="$(printf '%s' "$line" | sha256sum | cut -f1 -d' ')"
我们将使用printf
instead of echo
然后从管道中捕获stdout
并将其存储在变量try
中。此外,sha256sum
会打印正在阅读的文件,包括stdin
,因此我们将使用cut
来删除该部分。