1

我有一个如下所示的 yaml 数组,

identitymappings:
- arn: "arn:aws:iam::12345567:role/AdmRole"
  group: "system:masters"
  user: "user1"
- arn: "arn:aws:iam::12345567:role/TestRole"
  group: "system:masters"
  user: "user2"

我正在尝试使用 for 循环和 yq 在 bash 脚本中解析这个 yaml。

 for identityMapping in $(yq read test.yaml "identitymappings[*]"); do
      roleArn=$identityMapping["arn"]
      group=$identityMapping.group
      user=$identityMapping.user
done

但我没有得到预期的结果,比如无法获取 roleArn、group、user 的值。请让我知道如何解决这个问题。

4

5 回答 5

2

从 jq 或 yq 读取到 bash 的最简单方法是使用BashFAQ #1 while read循环来处理面向行的数据;在下面,我们使用@tsv生成面向行的输出:

while IFS=$'\t' read -r roleArn group user _; do
  echo "Role:  $roleArn"
  echo "Group: $group"
  echo "User:  $user"
done < <(yq -j read test.yaml \
         | jq -r '.identitymappings[] | [.arn, .group, .user] | @tsv')

请注意,如果您使用的是 Pythonyq而不是Go,您可以删除yq -j read并使用yq -r '...'.jq -r '...'

于 2020-07-14T16:29:39.200 回答
2

我会这样做的方式是:

# load array into a bash array
# need to output each entry as a single line
readarray identityMappings < <(yq e -o=j -I=0 '.identitymappings[]' test.yml )

for identityMapping in "${identityMappings[@]}"; do
    # identity mapping is a yaml snippet representing a single entry
    roleArn=$(echo "$identityMapping" | yq e '.arn' -)
    echo "roleArn: $roleArn"
done

输出:

roleArn: arn:aws:iam::12345567:role/AdmRole
roleArn: arn:aws:iam::12345567:role/TestRole

免责声明:我写了 yq

于 2021-11-29T22:58:30.347 回答
1

@Rad4 的答案对我有用。

您可以使用 latestyqjqvia 巧妙地循环:

for im in $(yq eval -o=j test.yaml | jq -cr '.identitymappings[]'); do
      arn=$(echo $im | jq -r '.arn' -)
      group=$(echo $im | jq -r '.group' -)
      user=$(echo $im | jq -r '.user' -)
      echo $arn $group $user
done

这会循环通过有效的在线 jsons,这使得它jq仍然可以在循环内工作。

于 2021-10-10T12:42:11.773 回答
1

我无法评论查尔斯达菲的正确答案,但这适用于 yq v4 而不使用 jq ......

while IFS=$'\t' read -r roleArn group user _; do
  echo "Role:  $roleArn"
  echo "Group: $group"
  echo "User:  $user"
done < <(yq e '.identitymappings[] | [.arn, .group, .user] | @tsv' test.yaml)
于 2022-01-25T00:02:55.807 回答
-1

我想通了..

for identityMapping in $(yq read test.yaml -j "identitymappings[*]"); do
      echo $identityMapping
      roleArn= echo $identityMapping | jq -r '.arn'
      echo $roleArn
      group= echo $identityMapping | jq -r '.group'
      echo $group
      user= echo $identityMapping | jq -r '.user'
      echo $user
于 2020-07-14T16:22:12.730 回答