在for loop bash中使用yq

时间:2020-07-14 15:44:41

标签: bash yq

我有一个如下的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的值。 请让我知道如何解决此问题。

2 个答案:

答案 0 :(得分:1)

从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')

请注意,如果您使用的是the Python yq而不是the Go one,则可以删除yq -j read,而只需使用yq -r '...'代替jq -r '...'

答案 1 :(得分:-1)

我想通了..

16.300000000000000710542735760100185871124267578125