我想执行sha1sum file1
和sha1sum file2
并使用bash对它们执行按位OR运算。输出应该是可打印的,即53a23bc2e24d039 ...(160位)
我该怎么做?
我知道
echo $((0xa | 0xb))但是如何扩展到40个十六进制数字?
由于
答案 0 :(得分:2)
我认为你真的不想要160位包含OR,但如果你这样做:
split32 () {
x='s/\(........\)\(........\)\(........\)\(........\)\(........\)/'
x=$x'0x\1 0x\2 0x\3 0x\4 0x\5/'
sed -e "$x"
}
(sha1sum $1 | split32; sha1sum $2 | split32) | (
read a1 b1 c1 d1 e1 x1
read a2 b2 c2 d2 e2 x2
a=$(($a1 | $a2))
b=$(($b1 | $b2))
c=$(($c1 | $c2))
d=$(($d1 | $d2))
e=$(($e1 | $e2))
printf ' %08x%08x%08x%08x%08x\n' $a1 $b1 $c1 $d1 $e1
printf '+ %08x%08x%08x%08x%08x\n' $a2 $b2 $c2 $d2 $e2
printf '= %08x%08x%08x%08x%08x\n' $a $b $c $d $e
)
$ bash bigOr.sh fun.tar fun.tgz
e515d3813b17c36b9a7d29f7aea3e79e264449b7
+ 4f201513105c301944d0a0ba5864d9f07544ca76
= ef35d7933b5ff37bdefda9fffee7fffe7744cbf7
答案 1 :(得分:1)
试试这个:
val1=$(sha1sum file1)
val1=${val1% *}
val2=$(sha1sum file2)
val2=${val2% *}
val3=$(( 0x$val1 | 0x$val2 ))
printf "%x\n" $val3
答案 2 :(得分:0)
在我的机器上,bash可以使用带符号的64位值处理固定宽度的整数运算。这意味着,我可以一次按位OR七个字节。
一种选择是将你的校验和分成三部分,用你的OR进行分割。您可以稍后通过printf "%x" $val
实现“可打印输出”。
答案 3 :(得分:0)
你可以使用gawk
sha1sum file1 file2 | awk '{sh1=$1;getline;sh2=$1;print or(sh1,sh2);exit}'