bash: jq curl must be escaped

Напоминание как обходить стороной ошибку Invalid string: control characters from при передаче значений из curl в jq


parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 21, column 26

постановка вопроса

В чём сыр бор, в некоторых случаях можно при вызове curl на выходе получить json, который затем передать для парсинга в jq. И это отлично работает если использовать пайплайн, но в некоторых случаях перестаёт работать если сначала передать выход в переменную, как на примере:

response="$(
curl \
-s \
-H "X-Vault-Token: $1" \
-X POST \
-d "${payload}" \
"${vault_full_url}"
)"

certificate="$(echo "${response}" | jq -r '.data.certificate')"

решение

проблема в спецсимволах, конкретно по ошибке «U+0000» в символе новой строки «/n». Всё бы хорошо если бы мы сами генерировали эту строку, можно было экранировать как jq и просит, но она ж из запроса приходит.

почему-то яндекс в упор не хочет находить решение по ссылке https://github.com/jqlang/jq/issues/1049 упорно предлагая стаковерфлоу с непонятными конструкциями.

итак для posix.sh используем вместо echo printf:

printf "%s" '{ "name": ["hi\n", "there"] }' | jq .

для bash используем echo -E:

echo -E '{ "name": ["hi\n", "there"] }' | jq .

 

Алексей:
Related Post

This website uses cookies.