Ожидание имени свойства, заключенного в двойные кавычки - ошибка aws cli

Я запускаю приведенную ниже команду awscli в сценарии bash на этапе teamcity

 #!/bin/bash 
  repo=%env.RepoName%
  echo "repo is ${repo}"
  tags=%env.Tags%
  echo "tags are ${tags}"
  aws ecr create-repository --repository-name ${repo} --tags '${tags}'

где %env.RepoName% и %env.Tags% - переменные teamcity со значениями sample-repo и [{"Key":"env","Value":"dev"},{"Key":"dept","Value":"finance"}] соответственно. Однако, когда команда aws cli запускается, она выдает ошибку со следующей ошибкой

Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

Однако, если я передам значение %env.Tags% как '[{"Key":"env","Value":"dev"},{"Key":"dept","Value":"finance"}]' с одинарными кавычками и исключу '' из свойства tags в команде aws cli, он будет работать без проблем.

Что мне не хватает, и есть ли рекомендуемый способ исправить это?


person vkr    schedule 04.09.2020    source источник
comment
Одиночные кавычки подавляют раскрытие, поэтому вы буквально отправляете ${tags}, а не его содержимое.   -  person Benjamin W.    schedule 04.09.2020
comment
Отвечает ли это на ваш вопрос? Разница между одинарными и двойными кавычками в Bash   -  person Aserre    schedule 04.09.2020
comment
@Aserre и Бенджамин Спасибо. Ссылка выше объясняет, почему это не работает. Но я все еще не уверен, как бы исправить мою конкретную проблему. Есть мысли, пожалуйста?   -  person vkr    schedule 04.09.2020
comment
Другими словами, есть ли способ исключить ' ' при передаче ввода и при этом заставить команду aws-cli работать в сценарии bash?   -  person vkr    schedule 04.09.2020


Ответы (1)


Один из способов - сохранить двойные кавычки, экранировав их с помощью \. Для этого вам может потребоваться написать sed:

tags="[{\"Key\":\"env\",\"Value\":\"dev\"},\"Key\":\"dept\",\"Value\":\"finance\"}]"

Как только это будет сделано, проверьте команду с помощью echo, чтобы проверить, сохранены ли кавычки.

echo aws ecr create-repository --repository-name ${repo} --tags "${tags}"                         
aws ecr create-repository --repository-name sample-repo --tags [{"Key":"env","Value":"dev"},{"Key":"dept","Value":"finance"}]

Другой способ - использовать сокращенный синтаксис. Если вы можете получить ключи / значения тегов по отдельности, этот синтаксис кажется более чистым.

aws ecr create-repository --repository-name ${repo} --tags Key=env,Value=dev Key=dept,Value=finance
person ryandam    schedule 07.09.2020