【发布时间】:2021-12-14 23:24:07
【问题描述】:
在编写 bash 脚本时,我想将整个 curl 命令存储在 heredoc 中以获得更好的布局。以下工作正常:
#/bin/bash
read -r -d '' command1 <<- MULTI_STRING_SCOPE
curl -v www.stackoverflow.com
MULTI_STRING_SCOPE
但是当使用-d 选项添加一些json数据时,该命令的执行很奇怪。例如:
#/bin/bash
read -r -d '' command2 <<- MULTI_STRING_SCOPE
curl -v www.stackoverflow.com
-d '{
"hello":"world"
}'
MULTI_STRING_SCOPE
response2=$(${command2})
来自终端的错误日志:
curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched close brace/bracket in URL position 1:
}'
而且似乎 curl 将 }' 行作为单独的 url,因此 json 数据没有作为一个单元发送。
如何解决问题?任何建议都将受到高度赞赏。
【问题讨论】:
-
将命令存储为字符串是个坏主意;它可能会使布局更好,但解析是一团糟。基本上,变量用于存储数据,而不是可执行代码。请参阅BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail! 在这种情况下,我强烈建议使用函数而不是变量。 (注意:有些人推荐
eval来处理这样的事情,但这只会引发新的解析混乱。这样会带来疯狂和非常奇怪的错误。) -
@GordonDavisson 这真的很重要。我曾经了解过
data and command的故事,但我只是不知道自己陷入了这种境地。谢谢你的提示。