使用不同数量的key:values解析yaml文件



长话短说,我将使用yq用bash解析目录中的yaml文件。我的yaml文件可能是这样的:

CLIENT_FIRST_NAME: bob
CLIENT_LAST_NAME: smith

CLIENT_FIRST_NAME: bob
CLIENT_LAST_NAME: smith
CLIENT_MIDDLE_NAME: michael

所以我用do循环遍历每个文件,并将变量设置为值例如:

for f in $FILES
do
FIRSTNAME=$(yq r $f CLIENT_FIRST_NAME)
LASTNAME=$(yq r $f CLIENT_LAST_NAME)
add client --firstname=${FIRSTNAME} --lastname=${LASTNAME}
done

但有时我会有中间名,我需要包括:

add client --firstname=${FIRSTNAME} --lastname=${LASTNAME} --middlename=${MIDDLENAME}

顺序无关紧要,我只需要能够说明可能出现在yaml中的额外字段,这些字段需要添加到"添加客户端"命令中。yaml中的每一行都将添加到命令中。添加的每个密钥都将是"添加客户端"命令的可行参数。我不必担心yaml中的键是否是有效的参数。他们会的。

好奇这里未知的最佳方式。谢谢

我假设yq如果找不到键,则不返回任何内容。

我可能会根据yq是否返回一些东西来制作整个标志,比如

for f in "${FILES[@]}"
do
FIRSTNAME=$(yq r "$f" CLIENT_FIRST_NAME)
MIDDLENAME=$(yq r "$f" CLIENT_MIDDLE_NAME)
LASTNAME=$(yq r "$f" CLIENT_LAST_NAME)
[[ -n $MIDDLENAME ]] && MIDDLENAME="--middlename=${MIDDLENAME}"
add client --firstname="${FIRSTNAME}" --lastname="${LASTNAME}" "${MIDDLENAME}"
done

如果每个输入文件只运行yq一次,而不是每个输入文件每个数据项运行一次,则此代码的效率会高得多。考虑:

for f in *.yml; do
{ read -r firstname; read -r middlename; read -r lastname; } < <(
yq -r '(.CLIENT_FIRST_NAME, .CLIENT_MIDDLE_NAME // "", .CLIENT_LAST_NAME)' "$f"
)
add client 
--firstname="$firstname" 
${middlename:+--middlename="$middlename"} 
--lastname="$lastname"
done

阅读时使用的一些注意事项:

  • bash中的每个read命令读取一行,而-d不用于修改这一行
  • 上述yq命令为每个数据项输出一行
  • 使用// ""会导致在未找到CLIENT_MIDDLE_NAME时使用空字符串,而不是null
  • 当且仅当foo被设置为非空值时,${foo:+...words here...}扩展为...words here...

最新更新