作为一个有趣的业余项目,我正在 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")