Вопрос или проблема
Может кто-то очистить эту часть скрипта bin bash для меня? Я чувствую, что могу написать это намного чище.
В основном, что я хочу сделать:
- Если
$pluginexcl2
определен, тогда будут использоваться 2 разныхgrep -v
- Если
$pluginexcl1
определен, то будет использоваться только 1grep -v
- Если оба не определены, не использовать
grep -v
.
Помощь будет оценена.
# Улучшаем код curl
curl_url=$(curl -s https://api.github.com/repos/${pluginrepo}/releases/latest)
# Фильтруем grep :D
if [ -n "${pluginexcl1}" ] && [ -n "${pluginexcl2}" ]; then
echo "$curl_url" | grep -wo "$plugingrep" | grep -v "$pluginexcl1" | grep -v "$pluginexcl2" | wget -qi - -O "${pluginfile}"
elif [ -n "${pluginexcl1}" ]; then
echo "$curl_url" | grep -wo "$plugingrep" | grep -v "$pluginexcl1" | wget -qi - -O "${pluginfile}"
else
echo "$curl_url" | grep -wo "$plugingrep" | wget -qi - -O "${pluginfile}"
fi
Попробуйте это..
curl_url=$(curl -s https://api.github.com/repos/${pluginrepo}/releases/latest)
grep_command="grep -wo \"$plugingrep\""
[ -n "${pluginexcl1}" ] && grep_command+=" | grep -v \"$pluginexcl1\""
[ -n "${pluginexcl2}" ] && grep_command+=" | grep -v \"$pluginexcl2\""
echo "$curl_url" | eval "$grep_command" | wget -qi - -O "${pluginfile}"
Я не тестировал весь скрипт, но не вижу в нем никаких секретов или монстров. Ха-ха
Надеюсь, это поможет!
Консолидируйте два условных оператора grep -v
в одну операцию с использованием -E
xtended regex, в сочетании с подстановкой параметра бессмысленной строки, если переменные не заполнены.
Одна идея заменить весь блок if/elif/else/fi
:
echo "$curl_url" | grep -wo "$plugingrep" | grep -Ev "${pluginexcl1:-XXXX}|${pluginexcl2:-XXXX}" | wget -qi - -O "${pluginfile}"
Замените XXXX
строкой, которая, как вы уверены, не встречается в содержимом $curl_url
.
ЗАМЕТКИ:
- Я предполагаю, что текущий код OP работает как ожидается.
- Я (очевидно) не могу протестировать это, так как нам не предоставлены образцы содержимого упомянутых переменных.
Ответ или решение
Чтобы улучшить читаемость и чистоту Bash-скрипта, необходимо оптимизировать логику фильтрации с использованием grep
. Из предоставленной информации ясно, что наша цель состоит в том, чтобы использовать grep -v
в зависимости от наличия определённых переменных. В результате мы можем применить регулярные выражения и параметры подстановки для упрощения кода.
Оптимизированный код
Вот переработанная версия вашего скрипта, которая улучшает его читаемость и уменьшает количество условных операторов:
# Получаем данные с API
curl_url=$(curl -s https://api.github.com/repos/${pluginrepo}/releases/latest)
# Используем grep с условной фильтрацией
exclude_pattern="${pluginexcl1:-XXXX}|${pluginexcl2:-XXXX}"
# Выполняем фильтрацию и загрузку
echo "$curl_url" | grep -wo "$plugingrep" | grep -Ev "$exclude_pattern" | wget -qi - -O "${pluginfile}"
Пояснение проведенных изменений
-
Объединение условий: Вместо использования нескольких условных операторов, мы сформировали переменную
exclude_pattern
, которая содержит шаблоны дляgrep -v
. Если переменная не определена, мы используем строкуXXXX
, которая гарантированно не встречается в содержимом$curl_url
. -
Упрощение логики: Отказавшись от условных операторов, мы сделали код более лаконичным и легким для понимания. Логика обработки данных остается той же, но становится более структурированной.
-
Поддержка расширенных регулярных выражений: Используя
grep -E
, мы можем включать несколько шаблонов в одну строку. Это значительно упрощает процесс фильтрации. -
Чистота и читаемость: Код стал более читабельным. Теперь проще увидеть, что происходит, когда вы читаете его.
Заключение
Этот стиль кода не только облегчает понимание, но и способствует дальнейшему сопровождению скрипта. Оптимизация таких участков имеет важное значение при работе с Bash, так как они могут улучшить производительность и качество кода.
Если у вас есть дополнительные вопросы или требуется дальнейшее пояснение, пожалуйста, не стесняйтесь обращаться.