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에 컬을 통해 요청하면 x_sign1항상 성공하지만 x_sign2그렇지 않습니다. "잘못된 서명"

왜? 문제를 해결하는 방법은 무엇입니까?

답변1

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

참고하세요shasum파일 이름 앞 의 출력에 공백이 있습니다 . stdin에서 입력을 가져오면 shasum파일 이름으로 대시를 인쇄합니다.

실행하면 echo foo | shasum | od -c이를 확인할 수 있고 끝에 개행 문자도 표시됩니다. 그러나 개행 문자는 명령 대체에 의해 제거되므로 명시적으로 제거해도 tr아무 작업도 수행되지 않습니다. (보다여기그리고여기)

두 개의 공백과 대시는 카운트에 차이를 일으키는 세 개의 문자입니다.

해시만 얻으려면 매개변수 확장을 사용하여 첫 번째 공백 뒤의 모든 항목을 제거할 수 있습니다. 예:

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

일치하는 가장 긴 접미사가 제거된 ${var%%pattern}값으로 확장 됩니다 .varpattern

관련 정보