我想在我的UNIX变种
上的命令行上执行类似的操作if (shasum httpd-2.4.7.tar.bz2 == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e) echo 'good to go'
我不想写一个单独的脚本文本页面来检查这个 上面的内容显示语法错误。 但必须有一个光滑的方式来解决这个问题?
怎么做?
答案 0 :(得分:13)
shasum httpd-2.4.7.tar.bz2 |
awk '$1=="19asdasdasd56462e44d61a093ea57e964cf0af05c0e"{print"good to go"}'
通常你会从shasum
获得这个输出19asdasdasd56462e44d61a093ea57e964cf0af05c0e *httpd-2.4.7.tar.bz2
我的命令是采用第一个字段$1
,并将其与之进行比较
你的字符串。如果字符串匹配,则awk打印出“好去”。
答案 1 :(得分:7)
echo "19asdasdasd56462e44d61a093ea57e964cf0af05c0e httpd-2.4.7.tar.bz2" \
| shasum -c
答案 2 :(得分:4)
尝试类似:
shasum httpd-2.4.7.tar.bz2 |
while read -r sum _ ; do
[[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"
done
test
运算符包含在[ .. ]
中,正确的语法为if; then; fi
,但您可以使用&&
和||
运算符来模拟它。
<~/temp>$ touch httpd-2.4.7.tar.bz2
<~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum == 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
bad
<~/temp>$ shasum httpd-2.4.7.tar.bz2 | while read -r sum _ ; do [[ $sum != 19asdasdasd56462e44d61a093ea57e964cf0af05c0e ]] && echo "good" || echo "bad"; done
good
<~/temp>$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
答案 3 :(得分:3)
我使用上一个/上一个命令的退出代码:
如果校验和有效,则上次执行的命令的退出代码为0
:
> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
> echo $?
0
如果校验和不正确,则退出代码不同而不是0
:
> export PROMETHEUS_CHECKSUM='some garbage'
> echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
prometheus-2.0.0.linux-arm64.tar.gz: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
> echo $?
1
以下是if
语句的完整示例:
#!/bin/bash
...
echo "${PROMETHEUS_CHECKSUM} prometheus-${PROMETHEUS_VERSION}.linux-arm64.tar.gz" | sha256sum -c
if [ $? != 0 ]; then
echo 'Prometheus checksum is not valid'
exit 1
fi
答案 4 :(得分:3)
我认为仅使用grep
将是最好的方法。我想做的是
> shasum httpd-2.4.7.tar.bz2 | grep 19ed9ee56462e44d61a093ea57e964cf0af05c0e
当校验和正确时,校验和将突出显示:
并且当校验和不正确时,什么也不显示。如果为您提供了大写的校验和,请使用grep -i <CHECKSUM>
。
答案 5 :(得分:2)
我做了一个bash脚本,可以防止人们不断思考它:
https://github.com/dtonhofer/muh_linux_tomfoolery/blob/master/verify_checksum.sh
检查:
verify_checksum file.tgz [SHA1, SHA256, MD5 checksum]
...或者您可以交换参数,因为您再次忘记了文件是第一个还是最后一个:
verify_checksum [SHA1, SHA256, MD5 checksum] file.tgz
...或者您可以计算文件的各种校验和(全部列出):
verify_checksum file.tgz
...或者您可以比较两个文件:
verify_checkusm file1.tgz file2.tgz
答案 6 :(得分:1)
使用shasum获取哈希值,然后写test <copy-1> = <copy-2> && echo a || echo b
,如果哈希值相同,你会看到a
,否则b
。
如果你很懒,你可以放弃|| echo b
部分,如果哈希值相同,你会看到a
,否则什么都没有。如果你更懒惰,你甚至不能写回声并依赖command not found
消息的存在与否。
答案 7 :(得分:1)
shasum <file_to_check> | diff <checksum_file> -
如果将校验和保存在文件中,则可能会容易一些
在管道的左侧,将计算文件的校验和,然后将其输送到diff
以将其与校验和(由文件作者提供)进行比较。使用管道-
时,stdin
替换了|
答案 8 :(得分:1)
POSIX版本
sha256sum httpd-2.4.7.tar.bz2 | cut -d ' ' -f 1 | grep -xq '^19asdasdasd56462e44d61a093ea57e964cf0af05c0e$'; if test $? -eq 0; then echo "good to go"; fi;
答案 9 :(得分:0)
使用类似
的内容myhash=$(sha256sum httpd-2.4.7.tar.bz2 | cut -d' ' -f1)
if [ $myhash = "19asdasdasd56462e44d61a093ea57e964cf0af05c0e" ] ; then echo "foobar" ; fi
说明:sha256sum
产生校验和和文件名,用空格分隔。我们cut
只能产生校验和。
答案 10 :(得分:0)
我只需要这样做,这就是我所做的:
s=`shasum myfile.dat`
a=( $s )
chk=${a[0]}
echo "The checksum is [$chk]"
某种程度上,我觉得更简单,更干净...