У меня есть фрагмент JSON.
Следующее не работает:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}
PERSON
echo -n "$VALUE" | python -m json.tool
Результат:
Ни один объект JSON не может быть декодирован
Делать то же самое с jq
, т.е.
echo -n "$VALUE" | jq '.'
Нет выхода.
Существует то же самое поведение для следующего:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Отклик:
Ни один объект JSON не может быть декодирован
Но работает следующее:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "jim@gmail.com"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
без... | jq
будет информативным.Ответы:
Нет вывода.
Документ здесь - это перенаправление , вы не можете перенаправить в переменную.
Когда командная строка анализируется, перенаправления обрабатываются на отдельном шаге от назначения переменных. Поэтому ваша команда эквивалентна (обратите внимание на пробел)
То есть он назначает пустую строку вашей переменной, затем перенаправляет стандартный ввод из строки here в команду (но команды нет, поэтому ничего не происходит).
Обратите внимание, что
действителен, как есть
Просто нет команды, чей стандартный поток ввода может быть установлен для хранения данных, поэтому она просто теряется.
Это будет работать, хотя:
Здесь команда, которая получает здесь-документ
cat
, и копирует его в свой стандартный вывод. Это то, что присваивается переменной с помощью подстановки команд.В вашем случае вы могли бы вместо этого использовать
без дополнительных действий по сохранению данных в переменной.
источник
PERSON="
с новой строкой и многострочными данными, а затем еще один"
в конце.PERSON='
, Это если ОП не хочет интерполировать переменные позже.Потому что переменная не устанавливается вашим heredoc:
Если вы хотите использовать heredoc для присвоения значения переменной, вам нужно что-то вроде:
источник
<< \PERSON
защиту от$
s на входе и обратной косой черты на концах строк.$(cat <<EOF ... EOF)
странная конструкция: запустить subshell, а затем отправить heredoc в cat, чтобы он отправил его в STDOUT, а затем присвоить результат этого subshell переменной? Я хотел бы, чтобы люди думали о том, что они говорят о своих мыслительных процессах. Присвоение heredoc переменной с помощьюread
сравнения, является нормальным.$(cat << EOF
... (данные) ...EOF
)
странно. Это неловко и запутанно, но такread -d … << EOF
- особенноread -d '' << EOF
. Я ценю ответ Тердона, потому что он использует только встроенные функции, а не программы. Но, что еще более важно,$(cat << EOF
... (данные) ...EOF
)
завершается неудачей, если какие-либо строки заканчиваются\
(обратная косая черта) - см. Комментарии под ответом Кусалананды .Это потому, что вы определили способ, которым вы определили Here-Doc для использования с JSON. Вы должны использовать его как
и выполнение
printf "$VALUE"
должно сбросить JSON, как и ожидалось.источник
Heredocs и переменные не смешиваются хорошо или, по крайней мере, не так. Вы также можете…
Передайте heredoc в качестве стандартного ввода приложения
или…
Хранить многострочный текст в переменной оболочки
Я использовал одинарные кавычки, чтобы избежать необходимости избегать внутренних двойных кавычек. Конечно, вы также можете использовать двойные кавычки, например, если вам нужно расширить параметры:
Затем вы можете использовать значение переменной позже.
источник