生成带引号的命令参数

生成带引号的命令参数

我正在使用一个 HTTP API,它需要一组非常特殊的签名标头 + JSON 正文。我真的很想卷曲它以进行调试和一般情况下的理智。

因此,我编写了一个小脚本,在给定主机名、路径和正文的情况下,执行所有修改,然后写出 cURL 命令行应该是什么。例如。

./sign example.com /api/v1/foo/bar '{"foo":"bar"}'
example.com/api/v1/foo/bar -H 'x-sign:XXXXX', -H ... --data-binary '{"foo":"bar","sign":"xxx"}'

(是的,看起来确实很复杂......)

我希望这可以很容易地进行 shell 处理(在 ZSH 中),因此:

curl -v $(./sign ...)

但这给了我各种各样的引用错误(或者尝试将标头内容卷曲为 URL,具体取决于我如何进行引用)。

唯一的工作方式感觉太笨重以至于不真实:

sh -c "curl -v $(./sign ...)"

我想我在这里错过了一些相当引用的选项。关于如何获得这个“好”的任何指示?

答案1

./sign输出 shell 代码,因此应该通过sh您的sh -cshell 或当前 shell对其进行评估eval

eval "curl -v $(sign...)"

zsh也可以仅解释其中的引用(不执行该 shell 代码可能执行的扩展):

curl -v "${(@Q)${(z)"$(sign)"}}"

where(z)解释引号,并(Q)删除引号(并且(@)引号内保留空元素)。

如果sign输出"foo bar" "$(echo test)",第一个将curl使用foo bartest作为参数进行调用,而第二个将使用curlfoo bar作为$(echo test)参数进行调用。

相关内容