如何在 bash 函数中将 bash 变量替换为 yq 命令

问题描述 投票:0回答:1

假设我有一个示例 YAML 文件,example.yaml:

services:
test:
  item0:
  item1:
  item2:
  item3:

我有以下 bash 函数来递归 YAML 级别:

function readYAML {
    local yaml="$1"
    declare -a arr
    readarray -t arr <<< "$(echo "$yaml" | yq -r '. |select(.) |  keys | .[]' )"
    echo "array -> $arr arr ${arr[@]}"
    for item in "${arr[@]}"; do
        if [$item != ""]; then
            echo $("'.$item'")
            yq -r "$("'.$item'")" | readYAML;
        fi
    done
}

跑步后

readYAML "$(cat example.yaml)" 

我得到一个像

'.test': command not found

这样的yq错误

我怎样才能调整

yq -r $("'.$item'") | readYAML;
线,以便我最终得到一个包含
arr
...
item0
的数组
item3

我认为 yq 将

$("'.$item'") 
解释为命令而不是过滤指令。所以我以某种方式错误地进行了变量替换。


注意

我。我知道

arr
被覆盖(只是删除数组命名以简化问题)。

二。我正在使用 Go yq(Mike Farrah v4.31.2)

还有类似的问题。但是我发现没有一个像这个问题那样将 bash 变量替换为 bash 函数中的 yq 命令:

在 yq 中传递 bash 变量

bash yaml substitution yq
1个回答
1
投票

您使用 yq 的哪个实现

如果您使用的是kislyuk/yq,您可以使用

stedolan/jq
(在后台使用)中的@sh内置函数来正确转义shell的导出字符串,以及
declare
你的数组立即:

$ unset arr; declare -a arr="($(yq -r '.test | keys_unsorted | @sh' example.yaml))"
$ echo "${arr[1]}"
item1

mikefarah/yq 还在最新版本 v4.31.1 中实现了一个

@sh
编码器,所以现在你可以这样做:

$ unset arr; declare -a arr="($(yq -r '.test | keys | .[] | @sh' example.yaml))"
$ echo "${arr[1]}"
item1
© www.soinside.com 2019 - 2024. All rights reserved.