Shell-Script

生成帶引號的命令參數

  • August 22, 2018

我正在使用一個 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"}'

(是的,它看起來確實很複雜……)

因此,我希望這很容易(在 ZSH 中)成為 shell:

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

但這給了我各種引用錯誤(或嘗試將標題內容捲曲為 URL,這取決於我如何進行引用)。

唯一的工作方式感覺太笨重而無法……真實:

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

我想我在這裡錯過了一些相當引用的選項。關於如何獲得這個“好”的任何指示?

您的./sign輸出 shell 程式碼,因此應該sh使用您的sh -c或目前的 shell來評估它eval

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

你也只能解釋其中的引用(zsh不做那個shell程式碼可能做的擴展):

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

Where(z)解釋引用,並(Q)刪除引號(並且(@)在引號內保留空元素)。

如果sign輸出"foo bar" "$(echo test)",第一個將curl使用foo bartest作為參數呼叫,而第二個將curl使用foo bar$(echo test)作為參數呼叫。

引用自:https://unix.stackexchange.com/questions/464125