O conteúdo visível de 2 variáveis ​​​​no bash é o mesmo, mas o comprimento é diferente

O conteúdo visível de 2 variáveis ​​​​no bash é o mesmo, mas o comprimento é diferente

Estas 2 variáveis ​​terão o mesmo conteúdo visível

  x_sign1="aabbccdd_and_somthing_else"

  var1="...."
  [........]
  x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
  echo $x_sign2

  ====> 
  aabbccdd_and_somthing_else -

Observe o "-" no final.

No entanto, os seus comprimentos serão diferentes. Mesmo que x_sign2não contenha um símbolo de nova linha. Para garantir isso:

  x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')

Mas:

  echo ${#x_sign1}
  ====> 64
  And:

E:

  echo ${#x_sign2}

  ====> 67

  echo ${#x_sign22}

  ====> 67

A diferença é de 3 símbolos. O conteúdo visível é idêntico.

Além disso, quando faço uma solicitação via curl para uma API REST que precisa desse valor de assinatura, x_sign1sempre é bem-sucedida, mas x_sign2não - "assinatura errada"

Por que? Como consertar isso?

Responder1

$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -    
                                                                ^^

Observe que existemdoisespaços na saída shasumantes do nome do arquivo. Quando a entrada é obtida de stdin, shasumimprime um travessão como nome do arquivo.

Se você executar, echo foo | shasum | od -cpoderá verificar isso e ver também a nova linha no final. A nova linha, no entanto, é removida pela substituição do comando, portanto, removê-la explicitamente trnão faz nada. (veraquieaqui)

Os dois espaços e o travessão são três caracteres que causam a diferença nas suas contagens.

Para obter apenas o hash, você pode usar expansões de parâmetros para remover qualquer coisa após o primeiro espaço, por exemplo:

$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<

O ${var%%pattern}expande para o valor de varcom a correspondência de sufixo mais longa patternremovida.

informação relacionada