Как найти длину или проверить, пуст ли список строк в квадратной скобке, используя bash? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть что-то вроде этого

VIEWERS=[]
EDITORS=[]
ADMINS='["abc@email.com","xyz@email.com"]'

, которые затем передаются в файл .yaml в виде списка. Я хочу добавить проверку, чтобы убедиться, что ни один из трех не задан, завершить и не двигаться дальше

Однако я не могу понять, как проверить, что список таких строк пуст или нет с помощью bash. Какой правильный синтаксис. Я не могу использовать круглые скобки для них из-за ограничений .yaml

Ответы [ 4 ]

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

Это должно быть простым сравнением их со строкой "[]". Обратите внимание, что, поскольку все, что содержит [ и ], выглядит как оболочка для имени файла, необходимо использовать соответствующие кавычки, чтобы не «услужливо» превращать их в списки совпадающих имен файлов. Это означает двойные кавычки вокруг ссылок на переменные и, возможно, одинарные кавычки вокруг литералов. Кроме того, я рекомендую использовать имена переменных в нижнем или смешанном регистре, чтобы избежать конфликтов со многими именами всех заглавных букв, которые имеют специальные значения / функции. Вот как то так:

viewers='[]'
editors='[]'
admins='["abc@email.com","xyz@email.com"]'

if [ "$viewers" = '[]' ] && [ "$editors" = '[]' ] && [ "$admins" = '[]' ]; then
    echo "They're all empty"
else
    echo "At least one array has contents"
fi
1 голос
/ 08 апреля 2020

Здесь есть две проблемы. Похоже, вы хотите определить массивы. Это делается так:

    VIEWERS=() or VIEWERS=(abc@email.com)

После того, как они были определены, вы можете проверить, являются ли ВСЕ из этих массивов пустыми, например:


VIEWERS=()
EDITORS=()
#ADMINS=()
ADMINS=(abc@email.com bcd@email.com)


if [ ${#VIEWERS[@]} -eq 0 ] && [ ${#EDITORS[@]} -eq 0 ] && [ ${#ADMINS[@]} -eq 0 ] ; then
    echo "all empty arrays"
else
    echo "non-empty array"
fi

Если вы запустите выше, вы будете get: непустой массив, поскольку ADMINS не является пустым.

Если, однако, вы закомментируете 2-ю строку ADMINS и раскомментируете первую строку ADMINS, вы получите: все пустые массивы.

Надеюсь, это поможет.

0 голосов
/ 08 апреля 2020

Я бы попробовал это так:

cat infile | cut -d"]" -f1 | cut -d"[" -f2 | sed -e /^$/d

(* ПРИМЕЧАНИЕ: мне все равно, я люблю иногда начинать с cat для удобства чтения).

Сначала мы кормим ввод с помощью cat, затем вырезать поле перед разделителем ']', затем из оставшегося бита мы вырезать после '['. Наконец, мы добавляем строку sed для удаления пустых строк, возвращаемых нулевыми результатами операций вырезания.

* Редактировать:

После сканирования вашего осиротевшего комментария в ветке здесь ... кажется, что вы, возможно, хотите сохранить скобки. Было бы полезно в будущем показать желаемый результат imho. может быть, это будет работать нормально?

cat infile| cut -d"=" -f2 | sed 's/[[]]//g' | sed -e /^$/d  

Сначала мы читаем в файле ... затем вырезаем после "=", затем с помощью sed удаляем все результаты с пустыми скобками. и, наконец, еще один sed для удаления пустых строк из результатов.

0 голосов
/ 08 апреля 2020

Нет, я не хочу использовать круглые скобки, так как я должен передать их в квадратных скобках для моего развертывания kubernetes далее. Есть ли способ, которым я могу сделать это с этим форматом?

ADMINS='[]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...