2017-07-09 4 views
1

Verwenden von Bash v4.3.48 (1) auf Ubuntu 16.04.2 LTS und Bash v3.2.57 auf MacOS Sierra 10.12.5 Ich habe diesen Code, in dem JSON-Daten POST gespeichert eine Variable:cURL wirft Globbing-Fehler, wenn JSON-Daten in Variable ein Leerzeichen enthält

#1  
JSON_DATA="Test"; \ 
curl -X POST "https://www.techotaku.com/json.php" \ 
    -H "Content-Type: application/json" \ 
    -d '{"data":"'$JSON_DATA'"}' 

Das gibt:

Array 
(
    [data] => Test 
) 

wenn jedoch $ JSON_DATA ein Leerzeichen enthält ...

#2 
JSON_DATA="A Test"; \ 
curl -X POST "https://www.techotaku.com/json.php" \ 
    -H "Content-Type: application/json" \ 
    -d '{"data":"'$JSON_DATA'"}' 

... es wirft einen Fehler:

curl: (3) [globbing] unmatched close brace/bracket in column 6 

Ich dachte, das durch falsche Verwendung von Zitaten sein könnte, aber wenn ich die JSON-Daten echo ...

echo '{"data":"'$JSON_DATA'"}' 

... es scheint gut gebildet:

{"data":"A Test"} 

auch wenn ich die JSON-Daten als String und keine Variable enthalten, es funktioniert.

#3 
curl -X POST "https://www.techotaku.com/json.php" \ 
    -H "Content-Type: application/json" \ 
    -d '{"data":"A Test"}' 

Die einzige Art, wie ich es bekommen kann zu arbeiten, wenn die Variable einen Raum enthält, ist die JSON-Daten in doppelten Anführungszeichen und entfliehen Sie dem wörtlichen doppelten Anführungszeichen in der Zeichenfolge einzuschließen:

#4  
JSON_DATA="A Test"; \ 
curl -X POST "https://www.techotaku.com/json.php" \ 
    -H "Content-Type: application/json" \ 
    -d "{\"data\":\"$JSON_DATA\"}" 

Ich hätte gedacht, dass alle 4 Beispiele funktioniert hätten. Kann also irgendwer darauf eingehen, warum nur die Beispiele 1,3 und 4 funktionieren und Beispiel 2 nicht?

Vielen Dank, Steve.

Antwort

2

Sie sollten Ihre Variablen angeben, um eine Worttrennung nach Shell zu verhindern. Ihr zweites Beispiel:

'{"data":"'$JSON_DATA'"}' 

funktioniert nicht, weil es durch bash zwei Worte erweitert Sein:

{"data":"A Test"} 

so -d Option erhält 2 Argument ({"data":"A und Test"}). Wenn JSON_DATA Globbing-Metazeichen enthielt, würde dies zu einer Dateinamenerweiterung führen.

es zu beheben, Zitat es:

'{"data":"'"$JSON_DATA"'"}' 

Beachten Sie die Verwendung von einfachen und doppelten Anführungszeichen abwechseln. Dies wird zu einem einzigen Wort erweitert werden:

{"data":"A Test"} 

a more detailed answer Hier schrieb ich vor einiger Zeit, die auch eine weitere komfortable Möglichkeit erwähnt, die Verwendung einer hier Dokument.

+0

Vielen Dank @randomir. Diese Zitate haben mir den Kopf verdreht, aber jetzt haben Sie es einfach erklärt. –

+0

Sie sind herzlich willkommen! – randomir

Verwandte Themen