AJ *_*idt 5 bash shell scripting curl
问题:
我正在编写一个执行多个HTTP请求的脚本,curl并且我想将标头添加到变量中CURL_HEADERS,这样我就不必经常输入它们了.当我CURL_HEADERS在curl命令中回显变量时,单引号出现在我不想要的地方.我怎么能阻止这个?(为清楚起见,下面的代码是简化的)
码
#!/usr/bin/env bash
AUTH_KEY='1234'
set -x
CURL_HEADERS='-H "Authorization: Basic '${AUTH_KEY}'" -H "Content-Type: application/json"'
echo "${CURL_HEADERS}"
curl -s $(echo "${CURL_HEADERS}") 'http://www.example.org' > /dev/null
set +x
Run Code Online (Sandbox Code Playgroud)
预期产出:
+ CURL_HEADERS='-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
+ echo '-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
-H "Authorization: Basic 1234" -H "Content-Type: application/json"
++ echo '-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
+ curl -s -H "Authorization: Basic 1234" -H "Content-Type: application/json" http://www.example.org
+ set +x
Run Code Online (Sandbox Code Playgroud)
实际产出
+ CURL_HEADERS='-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
+ echo '-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
-H "Authorization: Basic 1234" -H "Content-Type: application/json"
++ echo '-H "Authorization: Basic 1234" -H "Content-Type: application/json"'
+ curl -s -H '"Authorization:' Basic '1234"' -H '"Content-Type:' 'application/json"' http://www.example.org
+ set +x
Run Code Online (Sandbox Code Playgroud)
一个相当简单的解决方案是使用bash数组来存储您想要传递的四个参数:
CURL_HEADERS=(
'-H' "Authorization: Basic ${AUTH_KEY}"
'-H' 'Content-Type: application/json'
)
curl -s "${CURL_HEADERS[@]}" 'http://www.example.org' > /dev/null
Run Code Online (Sandbox Code Playgroud)
与标量变量不同,标量变量只是普通字符的普通字符串,无论它们可能包含多少引号,数组都是字符串列表,每个字符串彼此区分一个.从这个意义上说,bash就像几乎所有其他编程语言一样.
这个问题,以及我建议的解决方案以及其他几个问题,在Bash FAQ条目50中有详细描述(我试图将命令放在变量中,但复杂的情况总是失败!),这是值得的详细阅读.(链接取自@ John1024的评论.)