Shell-Script
生成帶引號的命令參數
我正在使用一個 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 bar
和test
作為參數呼叫,而第二個將curl
使用foo bar
和$(echo test)
作為參數呼叫。