这2个变量将具有相同的可见内容
x_sign1="aabbccdd_and_somthing_else"
var1="...."
[........]
x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
echo $x_sign2
====>
aabbccdd_and_somthing_else -
注意最后的“-”。
但是,它们的长度会有所不同。即使x_sign2
不包含换行符号。为了确保这一点:
x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')
但:
echo ${#x_sign1}
====> 64
And:
和:
echo ${#x_sign2}
====> 67
echo ${#x_sign22}
====> 67
差别是 3 个符号。可见内容是相同的。
另外,当我通过curl向需要该签名值的REST API发出请求时,x_sign1
总是会成功,而x_sign2
不会——“签名错误”
为什么?如何解决这个问题?
答案1
$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
^^
请注意,有二输出中shasum
文件名之前的空格。当从标准输入获取输入时,shasum
打印破折号作为文件名。
如果你运行echo foo | shasum | od -c
你可以检查它,并在末尾看到换行符。但是,换行符是通过命令替换删除的,因此显式删除它tr
不会执行任何操作。 (看这里和这里)
两个空格和破折号是导致计数差异的三个字符。
为了仅获取哈希值,您可以使用参数扩展来删除第一个空格之后的任何内容,例如:
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
扩展${var%%pattern}
为 的值,var
并删除最长的后缀匹配pattern
。