curl: agrega cadena como opción en bash

curl: agrega cadena como opción en bash

Me gustaría pasar una cadena variable para ordenar opciones en curl.

if [ ! -z ${picture} ]; then APISTRING+="--data-urlencode \"picture=${picture}\" ";fi
if [ ! -z ${additional} ]; then APISTRING+="--data-urlencode \"additional_info="${additional}"\" ";fi

Entonces, si la imagen y el contenido adicional no están vacíos, $APISTRING debería ser:

--data-urlencode "picture=someinfo"  --data-urlencode "additional_info=additional infos here"

Pero cuando llamo a curl

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING}"

Me da un error como

curl: opción --data-urlencode "imagen=alguna información" --data-urlencode "additional_info=información adicional aquí": es desconocida

¿Alguien tiene una idea de cómo manejar esto?

Respuesta1

Incrustar comillas en el valor de una variable, como APISTRING+="--data-urlencode \"picture=${picture}\" "no funciona bien. Cuando intenta utilizar $APISTRING, bash analiza las comillas antes de expandir el valor de la variable y no vuelve a buscar "nuevas" comillas después de la expansión. Como resultado, las comillas se tratan como parte de la cadena, en lugar de como delimitadores alrededor de la cadena.

La mejor solución para cosas como esta es usar una matriz para almacenar las opciones del comando:

APISTRING=()
if [ ! -z ${picture} ]; then APISTRING+=(--data-urlencode "picture=${picture}");fi
if [ ! -z ${additional} ]; then APISTRING+=(--data-urlencode "additional_info=${additional}");fi
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING[@]}"

Tenga en cuenta que las matrices no están disponibles en todos los shells POSIX, por lo que solo debe usar esto en scripts para los que usa bash explícitamente (es decir, un shebang de #!/bin/bashor #!/usr/bin/env bash,no #!/bin/sh). Además, la sintaxis es muy exigente; no omita ninguno de los paréntesis en las asignaciones, las comillas dobles o al [@]expandir la matriz.

Por cierto, existe otra posible solución. En lugar de acumular las opciones opcionales de antemano, puede utilizarexpansión condicionalpara incluirlos en el acto:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
    ${picture:+ --data-urlencode "picture=${picture}"} \
    ${additional:+ --data-urlencode "additional_info=${additional}"}

Aquí, la :+expansión le dice a bash que verifique si la variable no está en blanco y, si es así, que no la use, sino un valor alternativo: la versión citada de la variable con el prefijo apropiado.

Respuesta2

Tienes comillas innecesarias en "${APISTRING}":

arreglar:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" ${APISTRING}

información relacionada