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

问题描述:

我在EC2 AWS-AMI Linux上作为脚本的一部分执行命令时遇到问题。为什么bash将单引号添加到转义命令的双引号中

作为命令的一部分我必须具有一定的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 

如何传递命令,以便双引号不会与单引号括起来。

UPDATE

按照下文评论,如果我呼应命令串,然后复制/粘贴在终端上运行则命令按预期执行。但是在脚本内部运行时会失败。 bash脚本是否可以向命令添加额外的字符,导致它失败?

感谢 艺术

单引号使用X跟踪的神器实际上不是参数的一部分。它们只是表明双引号实际上是参数的一部分,并不仅仅表明参数是单个单词。

+0

感谢@Ignacio,我注意到如果我回显命令然后复制/粘贴运行,命令按预期执行,但运行脚本时会失败。作为执行的一部分,bash是否可以添加一些额外的引号或租船人? – 2015-02-11 05:58:43

+0

你知道这意味着什么,对吧?你不需要双引号。由于shell在传递参数之前剥离它们。 – 2015-02-11 06:11:51

没有必要使用在你的变数逃脱引号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})