我使用AWS ec2模板/实例的用户数据。 为此,我将文件转换为base64,以便于操作。
尽管如此,shell / bash并没有使用变量的值对其进行扩展。
在此示例中,我将其简化为一个简单变量。
JHtMRVNTT1BFTn0gIG9yICRMRVNTT1BFTg==
被解码为${LESSOPEN} or $LESSOPEN
export LESSOPEN=Hereishtevalue
echo JHtMRVNTT1BFTn0gIG9yICRMRVNTT1BFTg== | base64 --decode
结果:
>${LESSOPEN} or $LESSOPEN
(我不确定哪个应该工作)预期:
>Hereishtevalue or Hereishtevalue
为什么$LESSOPEN
和/或${LESSOPEN}
不能替换为值?
echo JHtMRVNTT1BFTn0gIG9yICRMRVNTT1BFTg== | base64 --decode > myfile.txt
如何解决?
base64文件将是一个文件模板,其值取决于EC2模板/实例的用户数据中定义的变量。
答案 0 :(得分:1)
在注释之后,已经发生了参数扩展,因此字符串实际上包含${LESSOPEN}
。
使用eval会导致安全问题,因为可以执行任意代码。例如,一种解决方法是检查字符串是否与模式匹配并使用变量间接寻址。
variable=123
input='${variable}'
if [[ $input =~ \${([_a-zA-Z][a-zA-Z0-9]*)} ]]; then
output=${!BASH_REMATCH[1]}
echo "${output}"
fi