
這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
。