为什么bash为命令的转义双引号添加单引号

时间:2015-02-11 05:52:41

标签: bash escaping aws-cli

我无法在EC2 AWS-AMI Linux上执行命令作为脚本的一部分。

作为命令的一部分,我必须将一些vars传递给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})

当我运行脚本时,输出显示带有转义双引号的单引号的命令,这会导致CLI失败。

++ 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脚本是否可以在命令中添加额外的字符,导致其失败?

感谢 领域

2 个答案:

答案 0 :(得分:1)

单引号是使用xtrace的工件,实际上并不是参数的一部分。它们只是表明双引号实际上是参数的一部分,并不仅仅表明该参数只是一个单词。

答案 1 :(得分:0)

不需要在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})