Bash:如何将数组项作为选项传递?

时间:2015-02-24 20:34:22

标签: bash curl

我正在尝试基于数组为curl生成标题:

HEADERS=( "content-type: text/plain" "Authorization:  password" )

当我手动指定每一个时,它可以工作:

curl --header  "${HEADERS[0]}"  --header  "${HEADERS[1]}" http://httpbin.org/headers

但是当我尝试自动生成时,卷曲抱怨:

curl `for H in "${HEADERS[@]}";do echo --header $H ;done` http://httpbin.org/headers
curl: (6) Could not resolve host: text
curl: (6) Could not resolve host: password
...

我尝试了各种报价逃避和逃避,但没有运气。你能建议一种让它起作用的方法吗?

3 个答案:

答案 0 :(得分:6)

一个简单而简洁的解决方案,没有循环:

HEADERS=( "content-type: text/plain" "Authorization:  password" )
curl "${HEADERS[@]/#/-H}" http://httpbin.org/headers

替换表达式在每个数组元素上独立执行,结果作为每个数组元素的一个单词插入(与"${HEADERS[@]}"相同)。模式中的#表示“仅在开头替换。使用-H而不是--header编写命令行选项可以更容易地为每个字符串添加选项名称,因为curl接受-Hoption_value,而curl不接受正常的命令行语法--header=option_value语法。(感谢@wfr指出curl不接受--header=...。)

答案 1 :(得分:5)

parameters=()
for((i=0; i<${#HEADERS[@]}; i++)); do
    parameters+=("--header" "${HEADERS[$i]}");
done
curl "${parameters[@]}"

另见:

答案 2 :(得分:0)

我喜欢wfr的答案但是为了避免创建一个中间变量,我提出了:

for H in "${HEADERS[@]}"; do [[ "$HEADERS" == "-"* ]] || HEADERS=(); HEADERS+=("-H" "$H");done
curl "${HEADERS[@]}" http://httpbin.org/headers

谢谢!