Разобрать файл yaml с различным количеством ключей: значений
Короче говоря, я буду анализировать файлы 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 и устанавливаю переменные в значения. Например:
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 ответа
Я предполагаю, что 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
Некоторые примечания для чтения:
- Каждый
read
команда в bash читает одну строку, когда-d
не используется для изменения этого. - Над
yq
команда выводит по одной строке для каждого элемента данных. - С помощью
// ""
вызывает пустую строку вместоnull
, чтобы использоваться, когда нетCLIENT_MIDDLE_NAME
найден. ${foo:+...words here...}
расширяется до...words here...
если и только еслиfoo
установлено непустое значение.