如何解决在YAML Cloudformation上转义括号,反斜杠和双引号的问题
我正在努力将sed
命令放入YAML AWS CloudFormation模板中,该模板是从serverless模板处理的。
因此,我需要在AWS::CloudFormation::Init
块中执行的命令是:
sed -i.bak '/PRE_CLAsspATH=/c\PRE_CLAsspATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLAsspATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLAsspATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLAsspATHSEP}${PRE_CLAsspATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
首先,我遇到${Variables}
的问题,因为Serverless认为它们是它应该关注的变量。我使用!Join
函数以这种方式解决了该问题(this approach在无服务器上不起作用):
cmd03_01:
command: !Join
- ''
- - sed -i.bak '/PRE_CLAsspATH=
- '/c\PRE_CLAsspATH="'
- '$'
- '{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar'
- '$'
- '{CLAsspATHSEP}'
- '$'
- '{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar'
- '$'
- '{CLAsspATHSEP}'
- '$'
- '{WL_HOME}/modules/org.slf4j.slf4j-api.jar'
- '$'
- '{CLAsspATHSEP}'
- '$'
- '{PRE_CLAsspATH}"'
- ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'
由于某人(无服务器,CloudFormation或YAML解释器)对反斜杠和双引号进行了转义,因此这不会产生所需的输出。
我的结果是这样的:
sed -i.bak '/PRE_CLAsspATH=/c\\PRE_CLAsspATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLAsspATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLAsspATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLAsspATHSEP}${PRE_CLAsspATH}\" /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
我试图在YAML上转义该字符串以避免这种行为,但这是最糟糕的。
在YAML模板上使用文字命令有任何想法或建议吗?
谢谢
解决方法
好吧,我觉得看到这么多特殊字符让我有些头晕,我迷路了。
在/var/lib/cfn-init/data/metadata.json
,我看到的是这样的东西:
"cmd03_01":{
"command":"sed -i.bak '/PRE_CLASSPATH=/c\\PRE_CLASSPATH=\"${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}\"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh"
},
所以,我认为这是错误的,因为我看到了“ 和 \ 字符换行了。这是我的困惑。这可以,因为该JSON文件中的键是一个字符串,因此必须正确地转义字符串的内容。
这里,我在无服务器模板中留下了两种声明sed命令的方法,例如我的示例:
#1
cmd01:
command: sed -i.bak '/PRE_CLASSPATH=/c\PRE_CLASSPATH="${MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar${CLASSPATHSEP}${WL_HOME}/modules/net.shibboleth.utilities.java-support.jar${CLASSPATHSEP}${WL_HOME}/modules/org.slf4j.slf4j-api.jar${CLASSPATHSEP}${PRE_CLASSPATH}"' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh
#2
cmd03_02:
command: !Join
- ""
- - sed -i.bak '/PRE_CLASSPATH=/c
- "\\"
- PRE_CLASSPATH=
- "\""
- $
- "{MW_HOME}/bi/bifoundation/jdbc/jdk18/bijdbc.jar"
- $
- "{CLASSPATHSEP}"
- $
- "{WL_HOME}/modules/net.shibboleth.utilities.java-support.jar"
- $
- "{CLASSPATHSEP}"
- $
- "{WL_HOME}/modules/org.slf4j.slf4j-api.jar"
- $
- "{CLASSPATHSEP}"
- $
- "{PRE_CLASSPATH}"
- "\"'"
- ' /opt/oracle/config/domains/bi/bin/setDomainEnv.sh'
我希望这可以节省一些人的时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。