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 つのシンボルです。表示される内容は同じです。

また、署名の値を必要とするREST APIにcurl経由でリクエストを送信すると、x_sign1常に成功しますが、そうx_sign2でない場合は「署名が間違っています」というメッセージが表示されます。

なぜですか? どうすれば直せますか?

答え1

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

注意:出力内のshasumファイル名の前にスペースが挿入されます。入力が標準入力から取得される場合は、shasumファイル名としてダッシュが出力されます。

を実行すると、echo foo | shasum | od -cそれを確認できます。また、最後に改行も表示されます。ただし、改行はコマンド置換によって削除されるため、明示的に削除してもtr何も起こりません。(ここそしてここ

2 つのスペースとダッシュは、カウントに違いをもたらす 3 つの文字です。

ハッシュだけを取得するには、パラメータ展開を使用して最初のスペースの後の部分を削除します。例:

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

は、最長の接尾辞の一致が削除された${var%%pattern}の値に展開されます。varpattern

関連情報