Отредактируйте файл свойств JSON для использования в сценарии bash

У меня есть сценарий .sh и файл свойств .json для использования с AWS CLI v2 для создания стека CF. У меня есть файл параметров в формате JSON, в котором мне нужно заменить одно значение, но все пары ключ/значение одинаковы, и я не могу понять, как заставить его выбрать правильное значение, переменная MY_ENV определена в скрипте и строка ниже — это то, во что мне нужно передать отредактированный файл JSON. Я считаю, что вместо файла потребуется полный строковый объект, если это проще. Я пытался jq безуспешно, но, возможно, есть еще более простое решение

aws cloudformation create-stack --capabilities CAPABILITY_NAMED_IAM --stack-name $lambda-$env --template-url <url> --output json --parameter $property_file <-- file I am passing in

файл_свойства

[
  {"ParameterKey":"RuleState", "ParameterValue": "DISABLED"},
  {"ParameterKey":"LambdaSchedule", "ParameterValue":"rate(20 minutes)"},
  {"ParameterKey":"EnvironmentParam", "ParameterValue":"$MY_ENV"}, <-- the string I need changed
  {"ParameterKey":"Method", "ParameterValue":"POST"},
  {"ParameterKey":"LambdaName", "ParameterValue":"TestLambda"}
]

Кроме того: $ENV — это зарезервированное имя, оно меняет способ инициализации оболочек POSIX. Если вы хотите быть на 100 % уверены, что не перезаписываете случайно переменную среды, влияющую на поведение системы, используйте имена в нижнем регистре, как рекомендовано в pubs.opengroup.org/onlinepubs/9699919799.2016edition/basedef‌​s/…

Charles Duffy 10.06.2024 21:53

... имейте в виду, если бы вы просто пытались сослаться на реальную переменную среды с именем ENV, это было бы "ParameterValue":env.ENV в jq (но опять же, не используйте это имя).

Charles Duffy 10.06.2024 21:56

Это просто переменная с именем ENV — может быть что угодно. Обновлю вопрос, чтобы сделать его более ясным

Gandalf 10.06.2024 21:59
"ParameterValue": env.MY_ENV, затем в вашем jq-коде (при условии, что ваш файл свойств может быть записан как исходный код jq, а не как документ JSON; --parameter <(jq -n "$property_file") — это самый простой способ сделать это).
Charles Duffy 10.06.2024 22:05
envsubst < parameters.fileможет достичь желаемого.
Philippe 10.06.2024 23:19

Или envsubst '$MY_ENV' < "$property_file", если замена должна быть ограничена $MY_ENV.

pmf 11.06.2024 14:59
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
6
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы map над внешним массивом, select элемент, где .ParameterKey == "EnvironmentParam", и установите .ParameterValue = env.MY_ENV.

map(select(.ParameterKey == "EnvironmentParam").ParameterValue = env.MY_ENV)

Чтобы импортировать имя (а не значение) MY_ENV из оболочки, используйте флаг --arg:

jq --arg e MY_ENV 'map(select(…).ParameterValue = env[$e])'

Так как же мне использовать это в качестве аргумента команды?

Gandalf 11.06.2024 19:25

Вы можете перенаправить вывод jq в файл, используя jq … > filename, а затем сослаться на него, как в --parameter filename, или сделать все это встроенным, используя подстановку процесса, как в --parameter <(jq …).

pmf 11.06.2024 19:29

Отдаю должное вам за хороший ответ, но в конце концов я просто использовал sed

Gandalf 11.06.2024 19:59

Однако будьте осторожны, поскольку в случае текстового решения (т. е. не поддерживающего JSON) (например, sed или envsubst) вы можете столкнуться с проблемами, если шаблон поиска случайно совпадает с другим содержимым, включая компоненты структуры, что, возможно, также делает недействительной кодировку JSON. , о чем jq (или любой другой процессор JSON) позаботится автоматически.

pmf 11.06.2024 20:09

Другие вопросы по теме