可见bash中2个变量内容相同,但长度不同

可见bash中2个变量内容相同,但长度不同

这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

相关内容