Bash 展开字符串的ENV变量,运行命令并存储在变量中?

Bash 展开字符串的ENV变量,运行命令并存储在变量中?,bash,shell,Bash,Shell,如何展开变量、运行该命令并将输出存储到变量 通常你会这样做 var="$(echo string)" 但是我想要这个 envString='echo $stringToEcho' stringToEcho="hello world" var="$(${envString})"` 但里面的美元符号并没有扩大。我需要运行存储在变量中的命令,并将输出存储到另一个变量 如果您的字符串包含写为eval安全的内容: envString="echo string" var=$(eval "$envStr

如何展开变量、运行该命令并将输出存储到变量

通常你会这样做

var="$(echo string)"
但是我想要这个

envString='echo $stringToEcho'
stringToEcho="hello world"
var="$(${envString})"` 

但里面的美元符号并没有扩大。我需要运行存储在变量中的命令,并将输出存储到另一个变量

如果您的字符串包含写为
eval
安全的内容:

envString="echo string"
var=$(eval "$envString")
…如果引用正确,即使它包含变量引用,也会起作用:

envString='echo "$someVar"'  # use single-quotes here to avoid premature expansion!
someVar='hello world'
var=$(eval "$envString")
但是,如果字符串包含通过展开变量而生成的内容,而不使用
printf%q
安全地转义包含的任何变量,则不要执行此操作


参考资料:

  • (“我试图将命令放入变量中,但复杂的情况总是失败!”)
  • (“评估指挥和安全问题”)

此外,运行存储在标量变量(与数组相反)中的命令是非常糟糕的做法,而且本身就有缺陷(没有
eval
),或者容易出现安全故障(有
eval
)。请参见BashFAQ#50:要计算变量,需要
var=$($envString)
。但请看@CharlesDuffy关于不良行为的评论。我已根据评论中对您实际问题的澄清编辑了此评论。如果您想谈谈这种编辑是否合适/符合目标,我们将不胜感激。@chrisayock,
var=$($envString)
跳过字符串拆分之前的所有解析步骤,因此它不会进行参数扩展(或引用/重定向等);因此,它在这里呼应了
$stringToEcho
,而不是
hello world
。当然,OP第一次写问题的方式并不清楚这是否是他们的实际问题。是的,它也会使用字符串中的变量生成命令内容。i、 e envString=“echo${stringToEcho}”当您使用双引号时,会导致扩展在分配时发生,而不是在计算时……因此,当您运行
envString=“echo${stringToEcho}”时,而不是在运行
eval“$envString”时,您会看到
stringToEcho
的值
。需要我指出的是,如果这是您的实际bug,您的问题中实际上没有包含复制它的代码吗?代码是敏感的,这就是为什么我没有这样做的原因,所以我将其替换为一个示例