2016-05-23 3 views
2

Как я могу заставить команду ниже работать.Замена переменной оболочки в команде

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

Я получаю ошибку «причину»: «Непризнанной лексема„$ CURDATE“: ожидал» Как я получаю переменные подстановки правильно в коде выше

+0

одинарные кавычки будут блокировать расширение переменных оболочки. – karakfa

+1

В будущем кнопка «создать сниппет» предназначена только для HTML и JavaScript (они позволяют показывать код в браузере зрителя). Используйте кнопку '{}' в редакторе для форматирования кода на всех других языках. –

ответ

5

одинарных кавычек не будет расширять переменные, использовать двойные кавычки:

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

Я также добавил JSON котировки вокруг расширения, так что становится чем-то вроде:

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

Не нужно экспортировать переменную. И обычно только переменные среды пишут все шапки. И последнее, что я изменил подстановку команд $(...)

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

Также экспорт не был необходим здесь, и даже если бы это было необходимо, экспорт должен был быть сделан после назначения, чтобы избежать маскировки возвращаемых значений. – sjsam

+1

Возможно, стоит продемонстрировать использование 'jq' для генерации гарантированного действия JSON. –

0

Если вы собираетесь вручную написать JSON, то проще читать из стандартного ввода, чем пытаться встроить его в качестве аргумента:

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

Чтобы сгенерировать JSON для вас, вы должны использовать инструмент, например, jq.

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

или позволить json построили временную метку целиком на собственных

jq -n '{AlertType: "IDLE", "@timestamp": (now | strftime("%F"))}' | curl ... 
Смежные вопросы