почему bash добавляет одинарные кавычки в экранированные двойные кавычки для команды

У меня возникли проблемы с выполнением команды как части сценария в EC2 AWS-AMI Linux.

Как часть команды, я должен передать несколько переменных в CLI, включая кавычки, такие как --subnet-ids "subnet-c123456" "subnet-b123456" "subnet-a123456", поэтому я создал блок кода как

#!/bin/sh
set -x
......
MySubnetA="subnet-a123456"
MySubnetB="subnet-b123456"
MySubnetC="subnet-c123456"
$(aws --profile myProfile --region myRegion rds create-db-subnet-group --db-subnet-group-name ${!1} --db-subnet-group-description ${!1} --subnet-ids \"${MySubnetA}\" \"${MySubnetB}\" \"${MySubnetC}\"  --tags Key=Name,Value=${!1})

Когда я запускаю скрипт, вывод показывает команду с одинарными кавычками вокруг экранированных двойных кавычек, это приводит к сбою интерфейса командной строки.

++ aws --profile myProfile --region us-west-1 rds create-db-subnet-group --db-subnet-group-name myDBgroup --db-subnet-group-description myDBgroup --subnet-ids '"subnet-a123456"' '"subnet-b123456"' '"subnet-c123456"' --tags Key=Name,Value=myDBgroup

Как передать команду, чтобы двойные кавычки не заключались в одинарные.

ОБНОВЛЕНИЕ

В соответствии с комментарием ниже, если я повторяю командную строку, а затем копирую / вставляю запуск в терминале, команда выполняется, как ожидалось. Но при запуске внутри скрипта он терпит неудачу. Может ли сценарий bash добавлять дополнительные символы к команде, вызывая ее сбой?

спасибо Арт


person art vanderlay    schedule 11.02.2015    source источник


Ответы (2)


Одиночные кавычки являются артефактом использования xtrace и фактически не являются частью аргумента. Они просто указывают на то, что двойные кавычки на самом деле являются частью аргумента, а не просто указывают на то, что аргумент является одним словом.

person Ignacio Vazquez-Abrams    schedule 11.02.2015
comment
спасибо @Ignacio, я заметил, что если я повторю команду, а затем скопирую / вставлю запуск, команда будет выполняться, как ожидалось, но при запуске скрипта она не работает. Может ли bash добавить дополнительные кавычки или фрахтователей как часть исполнения? - person art vanderlay; 11.02.2015
comment
ты знаешь что это значит, верно? Что вам не нужны двойные кавычки. Поскольку оболочка удаляет их перед передачей аргументов. - person Ignacio Vazquez-Abrams; 11.02.2015

Нет необходимости использовать экранированные кавычки вокруг ваших переменных внутри команды aws, используйте их как:

$(aws --profile myProfile --region myRegion rds create-db-subnet-group --db-subnet-group-name ${!1} --db-subnet-group-description ${!1} --subnet-ids ${MySubnetA} ${MySubnetB} ${MySubnetC} --tags Key=Name,Value=${!1})

Или процитируйте их, не убегая:

$(aws --profile myProfile --region myRegion rds create-db-subnet-group --db-subnet-group-name ${!1} --db-subnet-group-description ${!1} --subnet-ids "$MySubnetA" "$MySubnetB" "$MySubnetC" --tags Key=Name,Value=${!1})

person anubhava    schedule 11.02.2015