在 AWS CLI 命令中,添加 ISO 8601 日期时间

在 AWS CLI 命令中,添加 ISO 8601 日期时间

作为一个有趣的业余项目,我正在 AWS 上构建一个无服务器 Todo 应用程序。我在终端做了很多工作,但我的知识很基础。

通过 AWS CLI (v2.3.4) 将某些内容添加到我的 DynamoDB 表中的命令如下:

aws dynamodb put-item \
    --table-name tasks \
    --item \
        '{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": "2022-09-09T12:51:05Z"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
    --profile personal

请注意,created_at我手动输入 ISO-8601 日期作为字符串。

现在我知道在 Linux 上,为了获取 ISO-8601 格式的 UTC 日期时间,我需要运行:

date -u +"%Y-%m-%dT%H:%M:%SZ"

我的问题是,如何将其放入我的 DynamoDBput-item命令中,以便我自动/动态地created_at从我的 Linux 系统获取。

我尝试过的:

我尝试简单地将date命令插入到我的 DynamoDB 命令中,其中created_at值如下所示:

aws dynamodb put-item \
    --table-name tasks \
    --item \
        '{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": date -u +"%Y-%m-%dT%H:%M:%SZ"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
    --profile personal

但这是行不通的。该命令出错并返回:

Error parsing parameter '--item': Invalid JSON: Expecting value: line 1 column 138 (char 137)
JSON received: {"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": date -u +"%Y-%m-%dT%H:%M:%SZ"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}

更新:

我刚刚尝试了$(command)Marcus 建议的方法,但仍然收到无效的 JSON 错误。

aws dynamodb put-item \
    --table-name tasks \
    --item \
        '{"task_id": {"S": "3495353e-726f-4e0e-b290-8014c03be971"}, "user_id": {"S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"}, "created_at": {"S": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"}, "content": {"S": "Clean car"}, "is_done": {"BOOL": false}}' \
    --profile personal

答案1

您可以使用jq将日期插入 json 对象:

aws dynamodb put-item \
    --table-name tasks \
    --item "$(
      jq -c '.created_at.S=(now|todate)' << 'EOF'
        {
          "task_id": {
            "S": "3495353e-726f-4e0e-b290-8014c03be971"
          },
          "user_id": {
            "S": "aae30f8e-aabe-4e38-918f-0f5a2223f589"
          },
          "created_at": {"S":""},
          "content": {
            "S": "Clean car"
          },
          "is_done": {
            "BOOL": false
          }
        }
EOF
     )" --profile personal

另请注意,您可以在 zsh 中格式化日期,而无需调用date

${(%):-%D{%FT%TZ}}扩展为该格式的当前时间,但您必须设置TZ=UTC0为获取实际的祖鲁时间。模块strftime中还有一个内置函数zsh/datetime

答案2

正如错误消息突出显示的那样,JSON 无效。

因此,正如所料,您想要执行的命令从未被执行过——shell 如何知道您想要不加改变地传递命令行的哪些部分,以及您想要执行哪些部分?

如果您想替换命令的输出,请使用$(command),例如,$(date -u +"%Y-%m-%dT%H:%M:%SZ")

相关内容