#bash #sed #yaml #yq
#bash #sed #yaml #yq
Вопрос:
У меня есть скрипт bash, который обновляет файл yaml helm с помощью artifacthub.аннотации ввода-вывода. Однако мой скрипт использует переменные, которые, я полагаю, требуют, чтобы команда использовала двойные кавычки вместо одинарных кавычек. Кроме того, artifacthub.io
возникают проблемы, связанные с разделением артефакта и ввода-вывода. Какую yq
команду я могу использовать для обновления changes
images
аннотации and? Я также пытался использовать sed
безрезультатно.
annotations:
artifacthub.io/changes: |
- Fixed linting issues.
artifacthub.io/images: |
- name: transmission
image: ghcr.io/linuxserver/transmission:3.00-r0-ls75
Я попробовал что-то вроде приведенного ниже, но безуспешно.
image=foo
yq e ".annotations."artifacthub.io/images"="${image}"" -i "${chart_file_path}"
Комментарии:
1. Поля
name
иimage
являются не отдельными записями, а частью многострочной строки — «блочного» литерала в мире YAML. См. — yaml-multiline.info2. Вы не сможете напрямую управлять этими полями, но сформируете многострочную строку с требуемым значением. Бегите
yq e '.. style="double"' yaml
, чтобы увидеть сами
Ответ №1:
Чтобы сделать запрос yq максимально читаемым, я стараюсь избегать экранирования двойных кавычек. Используя одинарные кавычки вокруг запроса yq, двойные кавычки не нужно экранировать. Кроме того, одинарные кавычки можно закрывать и снова открывать, чтобы объединить переменную bash с запросом.
Что касается ключей со специальными символами, вам нужно заключить их в двойные кавычки и скобки : .annotations.["artifacthub.io/images"]
Учитывая файл:
# file.yml
annotations:
artifacthub.io/changes: |
- Fixed linting issues.
artifacthub.io/images: |
- name: transmission
image: ghcr.io/linuxserver/transmission:3.00-r0-ls75
Выполнение этого скрипта:
image="foo"
yq eval '.annotations.["artifacthub.io/images"] = "'${image}'"' file.yml
# | | | || |||
# | | | || ||└> (a.1) close yq query
# | | | || |└> (c) end string value
# | | | || └> (a.2) open yq query (end concatenation)
# | | | |└> (a.2) close yq query (start concatenation)
# | | | └> (c) start string value
# | | └> (b) end key w/ special chars
# | └> (b) start key w/ special chars
# └> (a.1) open yq query
Генерирует этот вывод:
annotations:
artifacthub.io/changes: |
- Fixed linting issues.
artifacthub.io/images: |-
foo
Комментарии:
1. Спасибо за публикацию этого. Я протестирую это и посмотрю, как это работает.