命令中的Shell变量替换

时间:2016-05-23 18:43:23

标签: bash scripting

如何让以下命令正常工作。

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

我收到错误“原因”:“无法识别的令牌'$ CURDATE':期待” 如何在上面的代码中正确地获得变量替换

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果您要手写JSON,从标准输入中读取它比将其嵌入参数中更简单:

curl -XPOST -d@- "$URL" <<EOF
{ "AlertType": "IDLE",
  "@timestamp": "$CURDATE"
}
EOF

您应该使用像jq这样的工具为您生成JSON。

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

或让json完全依靠自己构建时间戳

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