防止bash将单引号添加到变量输出 [英] Prevent bash from adding single quotes to variable output
问题描述
问题:
我正在编写一个脚本,该脚本使用curl
执行多个HTTP请求,并且希望将标头添加到变量CURL_HEADERS
中,这样就不必不断地键入它们.当我在curl命令中回显CURL_HEADERS
变量时,单引号出现在不需要的地方.我该如何预防呢? (为清楚起见,下面的代码已简化)
Problem:
I'm writing a script that performs several HTTP requests with curl
and I want to add the headers to a variable, CURL_HEADERS
, so that I don't have to type them out constantly. When I echo the CURL_HEADERS
variable in the curl command, single quotations appear where I don't want them. How can I prevent this? (The code below is simplified for the sake of clarity)
代码
#!/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
推荐答案
一个相当简单的解决方案是使用bash数组存储您要传递的四个参数:
A reasonably straightforward solution is to use a bash array to store the four arguments you will want to pass:
CURL_HEADERS=(
'-H' "Authorization: Basic ${AUTH_KEY}"
'-H' 'Content-Type: application/json'
)
curl -s "${CURL_HEADERS[@]}" 'http://www.example.org' > /dev/null
与标量变量一样,标量变量只是普通的普通字符字符串,无论它们可能包含多少引号,数组都是字符串列表,每个字符串彼此区分.从这个意义上讲,bash与几乎所有其他编程语言一样.
Unlike scalar variables, which are just ordinary strings of ordinary characters no matter how many quotes they might contain, arrays are lists of strings, each one distinguished from each other one. In this sense, bash is just like almost every other programming language.
This problem, and the solution I suggest as well as several other ones, is well-described in the Bash FAQ entry 50 (I'm trying to put a command in a variable, but the complex cases always fail!), which is worth reading in detail. (Link taken from a comment by @John1024.)
这篇关于防止bash将单引号添加到变量输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!