/ / Bash: ¿cómo pasar elementos de matriz como opciones? - bash, curl

Bash: ¿cómo pasar elementos de matriz como opciones? - bash, curl

Estoy tratando de generar encabezados para curl basados ​​en una matriz:

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

Cuando especifico cada uno manualmente, funciona:

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

pero cuando intento generar automáticamente, Curl se queja:

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
...

He intentado varias citas de evasión y evasivos sin suerte. ¿Puede sugerir una manera de hacer que funcione?

Respuestas

6 para la respuesta № 1

Una solución simple y concisa, sin bucles:

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

La expresión de sustitución se realiza de forma independiente en cada elemento de la matriz, con el resultado insertado como una palabra por elemento de la matriz (igual que "${HEADERS[@]}"). los # en el patrón significa "reemplazar solo al principio. Escribir la opción de línea de comando usando -H en lugar de --header hace que sea mucho más fácil agregar el nombre de la opción a cada cadena, ya que Curl acepta -Hoption_value, mientras que la sintaxis de línea de comando normal --header=option_value La sintaxis no es aceptada por curl. (Gracias a @wfr por señalar que el rizo no se aceptará --header=....)


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

Ver también:


0 para la respuesta № 3

Me gustó la respuesta de wfr, pero para evitar crear una variable intermedia, se me ocurrió:

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

¡Gracias!