2

我有一个如下的 yq 读取命令,

groups=$(yq read  generated/identity-mapping.yaml "iamIdentityMappings.[0].groups")

它从以下 yaml 读取 iamIdentityMappings:

iamIdentityMappings:
- groups:
  - Appdeployer
  - Moregroups

它存储组如下,

- Appdeployer
- Moregroups

但我想按如下方式存储组。(逗号分隔值)

groups="Appdeployer","Moregroups"

如何在 bash 中做到这一点?

4

4 回答 4

3

yq只是一个包装器jq,它支持 CSV 输出:

$ groups="$(yq -r '.iamIdentifyMappings[0].groups | @csv' generated/identity-mapping.yaml)"
$ echo "$groups"
"Appdeployer","Moregroups"

您问题中的yq调用只会导致错误。注意固定版本。

于 2020-07-16T02:53:06.540 回答
1

使用mapfileyq 并格式化一个空分隔列表:

mapfile -d '' -t groups < <(
  yq -j '.iamIdentityMappings[0].groups[]+"\u0000"' \
  generated/identity-mapping.yaml
)
typeset -p groups

输出:

declare -a groups=([0]="Appdeployer" [1]="Moregroups")

现在您可以完成问题的第二部分: Construct a command based on a count variable in bash

# Prepare eksctl's arguments into an array
declare -a eksctl_args=(create iamidentitymapping --cluster "$name" --region "$region" --arn "$rolearn" )

# Read the groups from the yml into an array
mapfile -d '' -t groups < <(
  yq -j '.iamIdentityMappings[0].groups[]+"\u0000"' \
  generated/identity-mapping.yaml
)

# Add arguments per group
for group in "${groups[@]}"; do
  eksctl_args+=(--group "$group")
done

# add username argument
eksctl_args+=(--username "$username")

# call eksctl with its arguments
eksctl "${eksctl_args[@]}"
于 2020-07-16T06:08:59.970 回答
0

yq 版本 3 现在已弃用,您可以使用版本 4 实现相同的输出

#!/bin/bash

while IFS= read -r value; do
    groups_array+=($value)
done < <(yq eval '.iamIdentityMappings.[0].groups.[]' generated/identity-mapping.yaml)

printf -v comma_seperated '%s,' "${groups_array[@]}"
echo "${comma_seperated%,}"

此代码根据需要打印逗号分隔值

于 2021-02-18T01:04:39.220 回答
0

yq4.16+ 现在有一个内置的 @csv 运算符:

yq e '.iamIdentityMappings.[0].groups | @csv' file.yaml

请注意,@csv 只会在需要时将值括在引号中(例如,它们有逗号)。

如果你想要引号,然后 sub 然后 in 并用逗号加入:

yq e '
   .iamIdentityMappings.[0].groups | 
   (.[] |= sub("(.*)", "\"${1}\"")) 
   | join(",")'

免责声明:我写了 yq。

于 2021-12-05T01:25:37.600 回答