Разобрать файл yaml с переменным количеством ключ: значения - PullRequest
0 голосов
/ 28 апреля 2020

Короче говоря, я буду анализировать файлы yaml в каталоге с bash, используя yq. Мои файлы yaml могут выглядеть так:

CLIENT_FIRST_NAME: bob
CLIENT_LAST_NAME: smith

Или

CLIENT_FIRST_NAME: bob
CLIENT_LAST_NAME: smith
CLIENT_MIDDLE_NAME: michael

Так что я перебираю каждый файл с помощью do l oop и устанавливаю переменные в значения Например:

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 допустимым параметром. Они БУДУТ.

Любопытно, как лучше подойти к неизвестному здесь. Спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Этот код был бы намного эффективнее, если бы вы запускали 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

Некоторые примечания, которые можно использовать при чтении этого:

  • Каждая команда read в bash читает одну строку, когда -d не используется для изменения this.
  • Приведенная выше команда yq выводит одну строку на элемент данных.
  • Использование // "" приводит к тому, что вместо null появляется пустая строка используется, когда CLIENT_MIDDLE_NAME не найдено.
  • ${foo:+...words here...} расширяется до ...words here... если-и-только-если foo установлено в непустое значение.
1 голос
/ 28 апреля 2020

Я предполагаю, что 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
...