Ваша проблема заключалась только в том, что скрипт, переданный в jq
, был указан неправильно.
В вашем конкретном случае, с использованием одного двойных кавычках со встроенными \
"
случаев убежал, вероятно, простейший:
jq -r ".global.name = \"$INPUT\"" "$CONF_FILE" > tmp.$$.json && mv tmp.$$.json "$CONF_FILE"
В целом, однако, chepner's helpful answer показывает более надежную альтернативу встраивания переменной оболочки ссылки непосредственно в сценарии: Использование --arg
варианта передать значение в качестве jq
переменной позволяет одинарного quotin g сценарий, который предпочтительнее, поскольку он позволяет избежать путаницы в отношении того, какие элементы расширены оболочкой вверх и устраняет необходимость экранирования $
экземпляров, которые должны быть переданы до jq
.
также:
- Просто
=
достаточно присвоить значение; в то время как операционный оператор |=
также работает так же, как и в случае с =
, поскольку RHS является литералом , а не выражением, ссылающимся на LHS - см. the manual.
- Вы должны регулярно дублировать ссылки на shell-переменные, и вам следует избегать использования имен переменных в верхнем регистре для avoid conflicts with environment variables and special shell variables.
Что касается , почему ваш процитировать не работал:
'.global.name |= '""$INPUT""
состоит из следующих лексем:
- Строка буквальным
.global.name |=
(из-за одного цитирую)
- Строковый литерал
""
- т.е.Пустая строка - котировки будут удалены оболочкой, прежде чем jq
видит сценарий
- An без кавычек ссылки на переменную
$INPUT
(что делает его стоимость, подлежащего софистика и подстановка).
- Другой экземпляр литерала
""
.
С вашим значением образца, jq
закончил видеть следующую строку в качестве сценария:
.global.name |= dsa
Как вы можете видеть, двойные кавычки не хватает, в результате чего jq
интерпретировать dsa
как имя функции, а не строковый литерал, и поскольку никакой аргумент не передавался (несуществующей) функции dsa
, сообщение об ошибке jq
ссылалось на него как dsa/0
- функция без аргументов (0
).
немного подсказка, не входите в систему как root, чтобы делать работу. – Kent