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

AXE*_*abs 1 bash curl

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

HEADERS=( "content-type: text/plain" "Authorization:  password" )
Run Code Online (Sandbox Code Playgroud)

当我手动指定每一个时,它的工作原理是:

curl --header  "${HEADERS[0]}"  --header  "${HEADERS[1]}" http://httpbin.org/headers
Run Code Online (Sandbox Code Playgroud)

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

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
...
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 6

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

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

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


wfr*_*wfr 5

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

也可以看看:

  • 或者可能是"$ {HEADERS [@]}"中的标题 parameters + =(" - header""$ header"); 完成了吗? (3认同)