假设我有一个示例 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 命令:
如果您使用的是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