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/bash
or #!/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}