如何使用 jq 迭代 JSON 数组?

Mil*_*ini 24 bash json jq

我正在构建一个脚本来一次下载所有 CodeCommit 存储库。

REPOS=$(aws codecommit list-repositories)

echo $REPOS | jq -r '.[]' | while read name ; do
    git clone XXX
done
Run Code Online (Sandbox Code Playgroud)

在第一行中,我得到所有存储库 JSON,如下所示:

[
  {
    "repositoryName": "repo_a",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_b",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_c",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_d",
    "repositoryId": "XXXXXX"
  }
]

Run Code Online (Sandbox Code Playgroud)

我需要简单地迭代此 json,以获取属性repositoryName 并为每个存储库执行 git clone。

但在这个例子中,该命令jq -r '.[]'不起作用......这会在每次重复时返回整个 json。

Cyr*_*rus 24

echo "$REPOS" | jq '.[].repositoryName' | while read -r repo; do echo "do something with $repo"; done
Run Code Online (Sandbox Code Playgroud)

输出:

用“repo_a”做一些事情
用“repo_b”做一些事情
用“repo_c”做一些事情
用“repo_d”做一些事情

或者不带引号:

echo "$REPOS" | jq -r '.[].repositoryName' | while read -r repo; do echo "do something with $repo"; done
Run Code Online (Sandbox Code Playgroud)

输出:

用 repo_a 做一些事情
用 repo_b 做一些事情
用 repo_c 做一些事情
用 repo_d 做一些事情


dvl*_*ube 5

如果您想迭代 JSON 值而不是单个字段值,则可以使用该-c选项,这样您最终每行都会有一个 JSON 元素:

repositories='{
  "repositories": [
  {
    "repositoryName": "repo_a",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_b",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_c",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_d",
    "repositoryId": "XXXXXX"
  }
]
}'
Run Code Online (Sandbox Code Playgroud)
repositories='{
  "repositories": [
  {
    "repositoryName": "repo_a",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_b",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_c",
    "repositoryId": "XXXXXX"
  },
  {
    "repositoryName": "repo_d",
    "repositoryId": "XXXXXX"
  }
]
}'
Run Code Online (Sandbox Code Playgroud)