如何解决Shell执行terraform plan时cat命令返回内容带反斜杠的问题
问题根因
该问题由Shell的引号解析顺序和单词拆分规则导致,并非cat输出内容真实携带反斜杠:错误信息中的反斜杠是Terraform打印报错时对引号做的转义显示。
手动执行命令时,Shell会先解析命令中的引号,将-var="db_ebs_volume_size=16"识别为单个参数、并剥离外层引号传递给Terraform,后者实际收到的参数为-var=db_ebs_volume_size=16。
但通过$(cat temp.txt)读取内容时,Shell不会再解析文本内的引号,仅按空格拆分参数,引号会作为参数内容的一部分传递给Terraform,导致Terraform识别到的变量名前缀携带双引号,触发未声明变量报错。你此前的sed操作无法生效,是因为没有真实的反斜杠需要替换,你处理的是报错信息中的转义显示字符,并非实际存在的内容。
解决方案
方案1:使用Bash数组存储参数(最推荐,无安全风险)
完全规避字符串拼接和引号解析问题,支持变量值带空格等特殊字符:
- 声明空数组存储Terraform参数
tf_args=()
- 判定变量存在时往数组追加元素,无需额外加引号
# 示例:判定db_ebs_volume_size变量非空时追加参数 if [ -n "$db_ebs_volume_size" ]; then tf_args+=("-var=db_ebs_volume_size=$db_ebs_volume_size") fi # 其他变量同理追加 if [ -n "$db_dns_ttl" ]; then tf_args+=("-var=db_dns_ttl=$db_dns_ttl") fi
- 直接传入数组执行命令
terraform plan "${tf_args[@]}"
方案2:仍需使用临时文件时调整存储格式
不要在临时文件中存储引号,每个参数单独占一行,内容示例:
-var=db_ebs_volume_size=16 -var=db_dns_ttl=9999
读取执行命令:
mapfile -t tf_args < temp.txt terraform plan "${tf_args[@]}"
也可以直接用xargs执行:
xargs terraform plan < temp.txt
方案3:强制解析引号(仅适用于完全可控的变量场景)
如果无法修改上游拼接逻辑,可以用eval强制重新解析命令字符串,注意:eval存在命令注入风险,仅当你100%控制所有变量内容时使用:
eval "terraform plan $(cat temp.txt)"
内容的提问来源于stack exchange,提问作者Ashish Sharma
相关产品推荐
相关产品推荐

