Bash 在字符串中进行Shell替换吗

Bash 在字符串中进行Shell替换吗,bash,shell,Bash,Shell,我在内存中有一个字符串,分配给一个bash变量,其中有占位符。我想在环境中使用变量来执行替换 比如说 #/bin/bash MYSTRING='Hello,${FOO}' export FOO=“世界!” 替换=$(如何?${MYSTRING}) 回显“${replacement}” #应该回你好,世界! 我需要的是这部分$(如何?${MYSTRING}) (我是唯一一个使用此脚本的人,坏角色没有机会注入恶意代码。)您可以使用gettext工具中的envsubst 您可以使用eval,但是可能

我在内存中有一个字符串,分配给一个bash变量,其中有占位符。我想在环境中使用变量来执行替换

比如说

#/bin/bash
MYSTRING='Hello,${FOO}'
export FOO=“世界!”
替换=$(如何?${MYSTRING})
回显“${replacement}”
#应该回你好,世界!
我需要的是这部分
$(如何?${MYSTRING})


(我是唯一一个使用此脚本的人,坏角色没有机会注入恶意代码。)

您可以使用gettext工具中的
envsubst

您可以使用
eval
,但是可能会从字符串中执行不需要的语句

至少,
envsubt
只会将环境变量扩展到它们的值,仅此而已,没有其他内容,没有命令求值,甚至没有字符串替换

见:

#/usr/bin/env bash
MYSTRING=$'你好,${FOO}'
FOO=“世界!”
替换=”$(
#envsubt需要将变量导出到其环境中。
#由于这是一个子shell,因此环境范围
#这是子壳。
#它有助于处理您不想要的局部变量
#导出到主外壳的环境。
#FOO的值继承自父shell,
#并导出到此子外壳的环境中。
出口食品
#将MYSTRING作为stdinhere字符串传递给envsubt

envsubt在第一行中查看模式替换运算符
${FOO}
将计算为空字符串(如果导出尚未设置)。@XBlueCode否,因为它是一个单引号字符串,所以它将是一个文本
${FOO}
。当您觉得有必要使用此模式时,99.9999%的情况下它是一个糟糕的设计。我建议您重新考虑您的方法。
替换=$(eval“echo$MYSTRING”)
,在您真正需要它的情况下,将适用于百万分之一的情况。@MatthewJamesBriggs,这就是为什么在$MYSTRING前面有一个echo