2016-05-23 15 views
2

Wie kann ich den folgenden Befehl funktioniert.Shell Variable Substitution in Befehl

export CURDATE=`date +%Y-%m-%d` 
curl -XPOST "http://localhost:9200/test/type" \ 
    -d ' { "AlertType": "IDLE", "@timestamp": $CURDATE }' 

Ich erhalte Fehler „Grund“: „Nicht erkannte Zeichen‚$ CURDATE‘: erwartete“ Wie ich oben

+0

Apostrophe wird Expansion von Shell-Variablen blockieren. – karakfa

+1

Der "create snippet" -Button wird in Zukunft nur für HTML und JavaScript verwendet (sie ermöglichen die Anzeige von Code im Browser des Betrachters). Verwenden Sie im Editor die Schaltfläche '{}' für die Codeformatierung in allen anderen Sprachen. –

Antwort

5

Einfache Anführungszeichen die Variablensubstitution in der Code korrekt erhalten Sie wird nicht Variablen erweitern, doppelte Anführungszeichen verwenden:

curdate=$(date +'%Y-%m-%d') 
curl -XPOST "http://localhost:9200/test/type" \ 
    -d '{"AlertType": "IDLE", "@timestamp": "'"$curdate"'"}' 

ich habe auch JSON um die Expansion zitiert, so wird es so etwas wie:

{"AlertType": "IDLE", "@timestamp": "2016-05-23"} 

Es sollte nicht notwendig sein, die Variable zu exportieren. Und normalerweise werden nur Umgebungsvariablen in Großbuchstaben geschrieben. Und last ich den Befehl Substitution $(...) geändert

'{"AlertType": "IDLE", "@timestamp": "'"$curdate"'"}' 
#         ^^ 
#         |End singlequotes 
#         JSON quote 
+1

Auch hier war kein Export notwendig und selbst wenn es nötig wäre, sollte der Export nach der Zuweisung erfolgen, um eine Maskierung der Rückgabewerte zu vermeiden. – sjsam

+1

Es könnte sich lohnen, mit 'jq' zu demonstrieren, dass garantiert-gültiges JSON generiert wird. –

0

Wenn Sie vorhaben, Ihre JSON Hand-schreiben, ist es einfacher, sie von der Standardeingabe zu lesen, als versuchen, es einzubetten in ein Argument:

curl -XPOST [email protected] "$URL" <<EOF 
{ "AlertType": "IDLE", 
    "@timestamp": "$CURDATE" 
} 
EOF 

Sie sollten jedoch ein Tool wie jq verwenden, um den JSON für Sie zu generieren.

date +%F | jq -R '{AlertType: "IDLE", "@timestamp": .}' | curl -XPOST [email protected] "$URL" 

oder lassen json gebaut, um den Zeitstempel ganz auf seine eigene

jq -n '{AlertType: "IDLE", "@timestamp": (now | strftime("%F"))}' | curl ...