
Эти 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
перед именем файла. Когда ввод берется из stdin, shasum
печатает тире в качестве имени файла.
Если вы запустите, echo foo | shasum | od -c
вы можете это проверить и увидеть новую строку в конце. Однако новая строка удаляется подстановкой команды, поэтому ее явное удаление с помощью tr
ничего не даст. (см.здесьиздесь)
Два пробела и тире — это три символа, которые и обуславливают разницу в ваших подсчетах.
Чтобы получить только хэш, можно использовать расширение параметров, чтобы удалить все после первого пробела, например:
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
Значение ${var%%pattern}
расширяется до значения var
с удалением самого длинного совпадающего суффикса pattern
.