curl: Zeichenfolge als Option in Bash hinzufügen

curl: Zeichenfolge als Option in Bash hinzufügen

Ich möchte eine variable Zeichenfolge an Befehlsoptionen in Curl übergeben.

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

Wenn Bild und Zusätzliches also nicht leer sind, sollte $APISTRING lauten:

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

Aber wenn ich curl anrufe

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

Es gibt einen Fehler wie

curl: Option --data-urlencode "picture=someinfo" --data-urlencode "additional_info=zusätzliche Infos hier": ist unbekannt

Hat jemand eine Idee, wie man damit umgehen soll?

Antwort1

Das Einbetten von Anführungszeichen in den Wert einer Variable, wie beispielsweise , APISTRING+="--data-urlencode \"picture=${picture}\" "funktioniert nicht richtig. Wenn Sie versuchen zu verwenden $APISTRING, analysiert Bash die Anführungszeichen, bevor der Wert der Variable erweitert wird, und sucht nach der Erweiterung nicht erneut nach „neuen“ Anführungszeichen. Daher werden die Anführungszeichen als Teil der Zeichenfolge behandelt und nicht als Trennzeichen um die Zeichenfolge.

Die beste Lösung für solche Dinge ist die Verwendung eines Arrays zum Speichern der Befehlsoptionen:

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[@]}"

Beachten Sie, dass Arrays nicht in allen POSIX-Shells verfügbar sind. Sie sollten dies daher nur in Skripten verwenden, für die Sie explizit Bash verwenden (d. h. ein Shebang aus entweder #!/bin/bashoder #!/usr/bin/env bash,nicht #!/bin/sh). Außerdem ist die Syntax sehr anspruchsvoll; lassen Sie keine der Klammern in den Zuweisungen, die Anführungszeichen oder beim [@]Erweitern des Arrays weg.

Übrigens gibt es noch eine andere Lösung. Anstatt die optionalen Optionen im Voraus anzusammeln, können Sie verwendenbedingte Erweiterungum sie sofort einzubinden:

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}"}

Hier :+weist die Erweiterung Bash an, zu prüfen, ob die Variable nicht leer ist, und wenn ja, diese nicht zu verwenden, sondern einen alternativen Wert: die in Anführungszeichen gesetzte Version der Variable mit dem entsprechenden Präfix.

Antwort2

Sie haben unnötige Anführungszeichen in „${APISTRING}“:

Fix:

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

verwandte Informationen