可見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

相關內容