问题:
我正在编写一个使用
curl
执行多个 HTTP 请求的脚本,我想将请求头添加到变量 CURL_HEADERS
中,以便不必经常输入它们。但是当我在 curl 命令中回显 CURL_HEADERS
变量时,单引号出现在我不想要它们的地方。如何防止这种情况?(为了更清晰起见,下面的代码进行了简化)
代码:
#!/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
期望输出:
+ 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
实际输出
+ 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
+
开头的行会在 shell 处理后打印出命令吗?单引号不会出现在输出中。手册对此并没有详细说明,但我认为这是 shell 表示“这是一个逐字字符串,不会再进行扩展或分割”的方式。而且,双引号的存在表明了这一点(它们是字符串的一部分,而不是字符串定界符(至少对于 shell 是这样的))。 - Peter - Reinstate Monicaset -x
的作用。此外,他正确地识别了他失败的curl命令的原因,然后明确地询问如何防止它。只需运行OP的代码即可复制。这些单引号可能对shell不可见,但它们确实显示了shell如何读取它们。 - Will Barnwell"$(echo "${CURL_HEADERS}")"
,在命令替换中引用参数以及整体结果。双引号已正确配对,并且外部双引号(而不是始终允许在双引号周围使用的单引号)仍使参数变量成为可扩展的对象。 - Peter - Reinstate Monica