Видимое содержимое двух переменных в bash одинаковое, но длина разная

Видимое содержимое двух переменных в bash одинаковое, но длина разная

Эти 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.

Связанный контент