评估存储在环境变量中的命令

评估存储在环境变量中的命令

我修改的能力有限或无法修改的 bash 脚本使用如下环境变量:

"${SERVER_ADDRESS}"

实际的 SERVER_ADDRESS 值只能在运行时动态确定,因此我想将 SERVER_ADDRESS 设置为查找 IP 的curl 命令。就像是:

SERVER_ADDRESS='curl -s http://lookup.api.com'

让这变得更加复杂的是,实际的查找只会返回必要地址的一部分,所以我真正需要的是某种串联:

SERVER_ADDRESS='$(curl -s http://lookup.api.com).restofaddress.com'

这意味着当将字符串分配给环境变量时,将运行并评估curl命令,但是,我需要在脚本运行时在脚本中进行评估。

我已经尝试了所有可能的方法来格式化该环境变量中的文本,以便仅包含“${SERVER_ADDRESS}”的脚本最终会得到正确的值,但我被难住了。也许如果不向接收脚本添加更多的复杂性,这是不可能的。

答案1

使用双引号代替单引号:

SERVER_ADDRESS="$(curl -s http://lookup.api.com).restofaddress.com"

插值和扩展(例如,变量扩展或命令扩展,如此处的情况)在双引号字符串内执行,但不在单引号字符串内执行。

答案2

正如 jayhendren 所说,当您想要插入变量时,应该使用双引号。但是,如果变量名称紧邻有效的变量名称字符,则需要通过将名称括在大括号中来告诉 bash 变量名称的开始和结束位置。当您用看起来像代码但未执行以给出所需结果(或产生非常奇特的 fqdn)的内容描述您的问题时,很难弄清楚您的意思,但我认为您应该做类似的事情。 ..

ADDR="http://lookup.api.com/"
export ADDR
...
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

或者你的意思是你真正想要检索的url是由from返回的片段组成的http://lookup.api.com?如果是这样的话,你就去找根大棒,用它反复殴打写API的人,同时喊“302!302!302!”。如果他们比你大很多或者有枪,你可能会考虑 jayhedren 建议的方法,但是虽然优雅简洁,但这并不是一个特别强大的解决方案。请考虑:

FRAG=`curl -s -o "${ADDR}some/path" | tr -d '\040\011\012\015'`
curl -s -o "${OUTPUTFILE}" "${ADDR}some/path"

相关内容