Wie verwendet man eine bash-Variable für den @ filepath in einem curl-Befehl?

577
medium

Ich versuche, ein Bash-Skript zu schreiben, um eine Reihe von Curl-Befehlen auszuführen. Der Befehl, den ich ausführen möchte, lautet wie folgt:

curl -XPUT $URL'/test/' -d @$DATA_DIR/index-settings.json 

Dies ist mein Bash-Skript

#!/bin/bash set -e  DATA_DIR="/usr/local/es" URL="http://localhost:9200"  curl -XPUT $URL'/test/' -d @$DATA_DIR/index-settings.json 

Ich habe bestätigt, dass der Befehl funktioniert, wenn ich ihn wie folgt manuell ausführen:

curl -XPUT 'http://localhost:9200/test/' -d @/usr/local/es/index-settings.json 

Das Problem stammt aus dem $ DATA_DIR. Wenn ich das Bash-Skript mit der Variablen $ DATA_DIR ausführen, erhalte ich diesen Fehler:

Warning: Couldn't read data from file  Warning: "/usr/local/es/index-settings.json", this makes  Warning: an empty POST. 

Ist es möglich, eine Variable innerhalb eines curl-Befehls zu verwenden, der -d @ -Argumente verwendet?

0
Der Warntext erwähnte den richtigen Weg, nicht wahr? `Curl` hat es also verstanden, die Variable wurde richtig erweitert. Scheinbar, weil die Variable und / oder der Befehl im Skript nicht druckbare Zeichen enthält. Überprüfen Sie das Skript mit `xxd -g 1 yourscript`. Gibt es ein Byte, das mit "0" beginnt und nicht "0a" ist? Gibt es vielleicht '0d'? // Führen Sie das Skript als anderer Benutzer aus? Ist `/ usr / local / es / index-settings.json` für den Benutzer lesbar, der das Skript ausführt? Kamil Maciorowski vor 6 Jahren 3
Wenn Sie `set -x` vor diesem Abschnitt des Skripts ausführen, wird möglicherweise auch darauf hingewiesen, was los ist - es werden die Befehle (oder deren Entsprechung) ausgegeben, während sie ausgeführt werden, wobei nicht druckbare Zeichen in sichtbarer Form angezeigt werden. Übrigens, es ist im Allgemeinen eine gute Idee, doppelte Anführungszeichen um variable Referenzen (und Strings, die diese enthalten) zu setzen, wie in `curl -XPUT" $ URL / test / "-d" @ $ DATA_DIR / index-settings.json "` Gordon Davisson vor 6 Jahren 1
@ KamilMaciorowski Danke das hat den Trick gemacht! Es gab ein Byte, das mit 0 begann. medium vor 6 Jahren 0
Sie sollten `/ usr / local / es / index-settings.json` und sicherstellen, dass es nicht leer ist. Sie sollten auch doppelte Anführungszeichen für Variablen verwenden, wie zum Beispiel `curl -XPUT" $ URL / test / "...`. Siehe auch [So verwenden Sie Shellcheck] (http://github.com/koalaman/shellcheck), [So debuggen Sie ein Bash-Skript?] (Http://unix.stackexchange.com/q/155551/56041) (U & L .SE), [So debuggen Sie ein Bash-Skript?] (Http://stackoverflow.com/q/951336/608639) (SO), [Wie debuggen Sie ein Bash-Skript?] (Http://askubuntu.com/q.) / 21136) (AskU), [Debuggen von Bash-Skripts] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html) usw. jww vor 6 Jahren 0

0 Antworten auf die Frage