0

长话短说,我将使用 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 中的键是否是有效参数。他们会。

对这里未知的最佳方法感到好奇。谢谢!

4

2 回答 2

1

我假设 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
于 2020-04-28T18:18:34.080 回答
1

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命令每个数据项输出一行。
  • Using导致在找到no 时使用// ""空字符串,而不是。nullCLIENT_MIDDLE_NAME
  • ${foo:+...words here...}扩展为...words here...if-and-only-iffoo设置为非空值。
于 2020-04-28T18:26:17.043 回答