首页 > 解决方案 > 循环遍历 json 文件并将值检索到 bash 变量中

问题描述

我有一个包含以下数据的 json 文件

{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}

我需要从 ID 中检索 S 值,从 no 中检索 N 值,并将它们作为参数放入查询中。查询如下所示:

query --table-name validation \
  --key-condition-expression "ID = :v1 AND no = :v2" \
  --expression-attribute-values '{":v1": {"S": "${ID}"},":v2": {"N": "${no}"}}' \
  --region us-east-1

我曾尝试使用 jq 但无法弄清楚如何读取 json 文件并将值作为参数检索。这是我第一次使用 jq。有人可以帮忙吗?

标签: jsonbashshellscriptingjq

解决方案


以下内容可能不完全是您所追求的,但确实显示了如何避免多次调用 jq,以及如何部分由 jq 构造命令。换句话说,假设 和 的模板--key-condition-expression--expression-attribute-values固定的,您应该能够根据您的需要调整以下内容:

假设一个 bash 或类似 bash 的 shell,并且 data.json 包含:

{"Item": {"ID": {"S": "4869949"},"no":{"N": "2"}}}

我们可以写:

ID=ID
no=no

< data.json jq --arg ID "$ID" --arg no "$no" -cr '
  .Item
  | .ID.S as $v1
  | .no.N as $v2
  | $v1, $v2, {($v1): {"S": $ID}, ($v2): {"N": $no}}
' | while read -r v1
do    
  read -r v2
  read -r query

  echo query --table-name validation \
  --key-condition-expression "\"ID = $v1 AND no = $v2\"" \
  --expression-attribute-values "'""$query""'" \
  --region us-east-1
done

jq 作为模板引擎

如果 Q 中带有 :v1 和 :v2 的模板是可变的,那么您可以通过使用 jq 作为模板引擎来调整上述内容,jq Cookbook 中涵盖了这个主题: https ://github.com/stedolan/jq /wiki/Cookbook#using-jq-as-a-template-engine


推荐阅读