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