首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for loop bash中使用yq

在for loop bash中使用yq
EN

Stack Overflow用户
提问于 2020-07-14 23:44:41
回答 5查看 3.1K关注 0票数 1

我有一个类似下面的yaml数组,

代码语言:javascript
复制
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 loop和yq在bash脚本中解析这个yaml。

代码语言:javascript
复制
 for identityMapping in $(yq read test.yaml "identitymappings[*]"); do
      roleArn=$identityMapping["arn"]
      group=$identityMapping.group
      user=$identityMapping.user
done

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

EN

回答 5

Stack Overflow用户

发布于 2020-07-15 00:29:39

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

代码语言:javascript
复制
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 '...'

票数 2
EN

Stack Overflow用户

发布于 2021-11-29 22:58:30

我这样做的方式是:

代码语言:javascript
复制
# 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

输出:

代码语言:javascript
复制
roleArn: arn:aws:iam::12345567:role/AdmRole
roleArn: arn:aws:iam::12345567:role/TestRole

免责声明:我写了yq

票数 2
EN

Stack Overflow用户

发布于 2021-10-10 12:42:12

@Rad4的答案有一个改进,对我有效。

您可以通过以下方式灵活地循环使用最新的yqjq

代码语言:javascript
复制
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仍然在循环中工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62898925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档