Передача переменной в aws cli встроенный json

Я написал скрипт для создания ресурса sqs в локальном стеке. Я хотел передать значение, которое я получаю от одной команды cli, к другой, но внутри встроенного json. Ниже приведен раздел рассматриваемого сценария.

arn=$(aws --endpoint-url=http://localhost:4576 sqs get-queue-attributes \
--queue-url http://localhost:4576/my_dead_letter_queue_url \
--query 'Attributes.QueueArn' \
--output text)

aws --endpoint-url=http://localhost:4576 sqs create-queue \
--queue-name my_queue \
--attributes \
'{"RedrivePolicy":"{\"deadLetterTargetArn\":\"$arn\", \"maxReceiveCount\":\"5\"}"}'

Итак, я пытаюсь передать эту переменную «arn», но cli принимает ее как строку и пытается найти sqs с URL-адресом «$arn» и терпит неудачу. Я также попытался удалить цитату. В этом случае ошибка представляет собой искаженную строку.

Вместо переменной arn, если я использую значение arn в качестве строки, это работает.

Может кто-нибудь показать мне, как передать эту переменную внутри этого встроенного json, если это возможно?

Спасибо за чтение :)

Шахед


person Shahed    schedule 11.04.2020    source источник
comment
Это похоже на другой вопрос, ответ на который здесь: stackoverflow.com/a/36778045/3121039 Попробуйте эти предложения по использованию здесь документ. (Вы также можете просто повторить строку, чтобы увидеть, что $arn не расширяется при заключении в одинарные кавычки.)   -  person Eric Bolinger    schedule 11.04.2020
comment
Я попробую, спасибо.   -  person Shahed    schedule 11.04.2020


Ответы (2)


Я смог сделать следующее с успешными результатами, допустим, он не обрабатывает json (для этого я просто заменяю токены через sed), но я обновил свой пример и протестировал его, по крайней мере, в bash с тем, что я делал :

#!/bin/bash
export awscmd="aws --region us-east-1 iam"
function setArn() {
  ${awscmd} list-policies --query 'Policies[?PolicyName==`'${1}'`].{ARN:Arn}' --output text
}

arn=$(setArn "some-policy-name")
echo '{"RedrivePolicy":"{"deadLetterTargetArn":"'$arn'", "maxReceiveCount":"5"}"}'

$ ./somearntest.sh
{"RedrivePolicy":"{"deadLetterTargetArn":"arn:aws:iam::############:policy/some-policy-name", "maxReceiveCount":"5"}"}

Обратите внимание на использование одиночных меток для объединения выходного результата вне строки. Это в bash 4, и я удалил экранированные \s, так как думаю, что они были добавлены по ошибке; ммв.

person Pavman    schedule 21.07.2020
comment
Спасибо за пример. Я попробую, я чувствую, что это сработает для меня. Спасибо еще раз - person Shahed; 11.09.2020

Проблема здесь в том, что вы пытаетесь расширить переменную bash внутри одинарных кавычек. Подобные одинарные кавычки обычно используются для передачи набора строк и вещей, которые нельзя кавычить, в качестве одного аргумента. Если вы не можете заменить их двойными кавычками, вам придется прибегнуть к грязным eval хакам, которые я не рекомендую.

Вот пример:

$ arn=foobar
$ echo '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"$arn\", \"maxReceiveCount\":\"5\"}"}'
{"RedrivePolicy":"{\"deadLetterTargetArn\":\"$arn\", \"maxReceiveCount\":\"5\"}"}
$ eval echo '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"$arn\", \"maxReceiveCount\":\"5\"}"}'
{RedrivePolicy:{"deadLetterTargetArn":"foobar", "maxReceiveCount":"5"}}

Для получения дополнительной информации я предлагаю проверить как работает eval и Раскрытие переменных внутри одинарных кавычек

person morbeo    schedule 12.04.2020
comment
Спасибо. Я проведу небольшое исследование и посмотрю, что я узнаю об этом. Еще раз спасибо за указание на это. - person Shahed; 14.04.2020