2017-08-29 251 views
1

简短版本: 为什么shell脚本会在其生成的字符串中产生转义字符()嵌入(但不可见)?Shell脚本产生逃逸字符()与逃脱双重qoutes

详细版本:

我有产生Terraform命令并执行它的脚本。命令生成涉及使用变量来取代如下计算值:

... 
AWS_VM_NUMBER=1 
types="{" 
array_limit=$((AWS_VM_NUMBER - 1)) 
for ((i = 0; i <= $array_limit; i++)); 
do 
    var=AWS_INSTANCE_TYPE_${i+1} 
    types=${types}"\"$i\"=\"${!var}\"," 
done 
instance_types_array=${types%,}"}" 

echo $instance_types_array ## prints {"0"="t2.small"} which is the correct fromat 

... 
# Now, executing a terraform command like this (please ignore the other variables as they exist else where in the code) 

terraform apply -var \'access_key=$AWS_ACCESS_KEY\' \ 
-var \'secret_key=$AWS_SECRET_KEY\' \ 
-var \'instance_count=$AWS_VM_NUMBER\' \ 
-var \'region=$AWS_REGION\' \ 
-var \'instance_types=$instance_types_array\' 

当执行terraform命令时,得到下面的错误:

invalid value "'instance_types={\"0\"=\"t2.small\"}'" for flag -var: Cannot parse value for variable ("{\"0\"=\"t2.small\"}'") as valid HCL: At 1:21: illegal char

如果我把该命令在一个变量和回声它,它打印没有反斜杠。但是,如果我复制它并在终端中手动执行它,我会得到相同的错误。它只会在我删除双引号并手工输入时才起作用!

+0

是的,谢谢:) – Sami

回答

1

在传递给terraform命令之前,您还需要转义封闭的双括号({})。为避免手动转义字符,可以将其保留为函数bash,该函数可以执行所需的转义序列。

命令与-v到脱离做应用到一个新的变量,并传递给terraform命令

printf -v esc_instance_types "%q" "${instance_types_array}" 

现在,当作为

printf "%s\n" "${esc_instances_types}" 
\{\"0\"=\"t2.small\"\} 

您打印的esc_instances_types将有一个价值现在可以将这个变量传递给你需要的命令。有关更多信息,请参见printf() - Format Strings