【问题标题】:How to pass current date to a curl query using shell script?如何使用 shell 脚本将当前日期传递给 curl 查询?
【发布时间】:2015-05-19 13:59:56
【问题描述】:

我正在使用 CURL 将数据插入到弹性搜索中,当我使用固定数据插入时它工作正常。我正在尝试获取当前日期时间并分配给一个变量并与我要插入的对象一起使用。

这是我的脚本,

while true;
do

echo $i

number=$RANDOM;
let "number %= 9";
let "number = number + 1";
range=10;
for i in {1..18}; do
  r=$RANDOM;
  let "r %= $range";
  number="$number""$r";
done;

curl -XPUT 'http://localhost:9200/nondomain_order/orders/'+$number+'' -d '{
  "CustType": null,
  "tag": "OrderType:Postpaid",
  "GUDeviceID": "0",
  "IsAvailable": false,
  "GUOrderID": "123",
  "OrderID": "3",
  "OrderDate": "2015-01-06T15:23:42.7198285+05:30",
  "GUAccountID": "15010615234251403",
  "CreateUser": "admin",
  "CreateDate": "2015-01-01T15:23:42",
  "CancelledDate": "1899-01-01T00:00:00",
  "CancelledUser": null,
  "GUTranID": "15010615234271604",
  "TenentID": 39,
  "CompanyID": 42,
  "ViewObjectID": 0,
  "ObjectID": null,
  "Status": 2,
  "OrderDetails": [
    {
      "GUPromtionID": "15010519341113508",
      "GUOrderID": "15010615234271703",
      "ChangeID": 0,
      "GUPackageID": "14100112243589402",
      "startdate": "2015-01-06T00:00:00" 
    }
]

我需要获取当前的 DateTime 并分配给 CreateDate。我该怎么做?

【问题讨论】:

    标签: shell unix curl elasticsearch


    【解决方案1】:

    在你的字符串中,改变

    "CreateDate": "2015-01-01T15:23:42",
    

    "CreateDate": "'"$(date +%Y-%m-%dT%H:%M:%S)"'",
    

    在那里,我终止了' 字符串并开始了一个" 字符串,其中包含$(date)。否则,它不会被执行,而只是作为字符串传递给curl

    你也可以事先将它赋值给一个变量,然后像这样使用它:

    now=$(date +%Y-%m-%dT%H:%M:%S)
    
    ...
    
    "CreateDate": "'"$now"'",
    

    其他问题

    改变

    curl -XPUT 'http://localhost:9200/nondomain_order/orders/'+$number+'' -d '{
    

    进入

    curl -XPUT 'http://localhost:9200/nondomain_order/orders/'"$number" -d '{
    

    Bash 连接只是一个接一个的两个字符串,它们之间没有空格。否则,它将查询像 http://localhost:9200/nondomain_order/orders/+0123456789+ 这样的 URL,而不是 http://localhost:9200/nondomain_order/orders/0123456789

    (在这里,我用双引号保护numbervariable 不被扩展,以确保它发生变化时的安全性)

    【讨论】:

    • 这如何回答我的问题?
    • 对不起,我希望数字是日期。这是答案,使用 @Val 的日期格式。
    【解决方案2】:

    我建议不要在引号内使用引号,而是使用 here-doc 来摆脱所有魔法引用。像这样使用curl

    number=10
    dt="$(date --iso-8601=seconds)"
    
    curl -XPUT 'http://localhost:9200/nondomain_order/orders/'$number -d@- <<EOF
    {
      "CustType": null,
      "tag": "OrderType:Postpaid",
      "GUDeviceID": "0",
      "IsAvailable": false,
      "GUOrderID": "123",
      "OrderID": "3",
      "OrderDate": "2015-01-06T15:23:42.7198285+05:30",
      "GUAccountID": "15010615234251403",
      "CreateUser": "admin",
      "CreateDate": "$dt",
      "CancelledDate": "1899-01-01T00:00:00",
      "CancelledUser": null,
      "GUTranID": "15010615234271604",
      "TenentID": 39,
      "CompanyID": 42,
      "ViewObjectID": 0,
      "ObjectID": null,
      "Status": 2,
      "OrderDetails": [
        {
          "GUPromtionID": "15010519341113508",
          "GUOrderID": "15010615234271703",
          "ChangeID": 0,
          "GUPackageID": "14100112243589402",
          "startdate": "2015-01-06T00:00:00"
        }
      ]
    }
    EOF
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      DATE_ISO=$(date +"%Y-%m-%dT%H:%M:%S")
      ...
      curl -XPUT 'http://localhost:9200/nondomain_order/orders/'+$number+'' -d '{
      ...
         "CreateDate": "'"$DATE_ISO"'",
      ...
      }'
      

      【讨论】:

      • 这不起作用,$DATE_ISO 不会在单引号字符串中展开。你应该使用"CreateDate": "'"$DATE_ISO"'",
      • 你是对的。根据@Camusensei 的评论编辑,谢谢!
      • 另外,将变量/常量写成大写是不好的做法,因为它可能会覆盖 bash 内部变量。在这里,DATA_ISO 没有被覆盖,但如果你继续测试你的运气,总有一天你可能会有一个不好的惊喜:D
      • 是的,好吧...好吧;-)
      • 在模拟器中对我不起作用:stackoverflow.com/questions/47836652/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多