Рекомендации по написанию скриптов и статический анализ
Изучите соглашения о написании кода, комментирование и инструменты вроде ShellCheck, чтобы создавать чистые, понятные скрипты Bash без ошибок.
«Рекомендации по написанию скриптов и статический анализ» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Зачем нужны лучшие практики написания скриптов?
Написание скриптов Bash даёт большие возможности, но без полезных привычек скрипты может быть трудно понимать, поддерживать и отлаживать.
Лучшие практики — это рекомендации, которые помогают писать чистый, надёжный и понятный код. Благодаря им ваши скрипты становятся:
- Более понятными: для вас и других пользователей.
- Более удобными в сопровождении: их проще обновлять и исправлять.
- Менее подверженными ошибкам: распространённые ошибки предотвращаются.
- Более удобными для совместной работы: внешний вид и поведение кода стандартизируются.
Комментарии для ясности
Комментарии крайне важны для объяснения того, почему код выполняет какое-либо действие, а не только что он делает. Они служат заметками для вас в будущем или для других разработчиков.
Используйте комментарии, чтобы:
- в начале описать общее назначение скрипта;
- объяснить сложную логику или запутанные разделы;
- документировать функции: их назначение, аргументы и возвращаемые значения.
Начинайте комментарий с символа # (решётки).
#!/bin/bash
# This script demonstrates commenting best practices.
# Author: CoddyKit
# Date: 2023-10-27
# Function: greet_user
# Description: Prints a greeting message to the console.
# Arguments:
# $1 - The name of the user to greet.
greet_user() {
local name="$1" # Store the first argument in a local variable.
echo "Hello, ${name}!" # Output the greeting message.
}
# Main script execution starts here.
echo "Script execution started."
greet_user "CoddyKit Learner" # Call the function with a specific name.
echo "Script execution finished."Понятные соглашения об именовании
Осмысленные имена упрощают понимание скрипта. Избегайте переменных, состоящих из одной буквы, за исключением распространённых счётчиков циклов (например, i или j).
Общие соглашения:
- Переменные: используйте описательные имена (например,
user_name,log_file). Для переменных окружения или глобальных констант используйтеUPPERCASE. Для локальных переменных скрипта используйтеlowercase_with_underscores. - Функции: используйте
lowercase_with_underscores, часто начиная имя с глагола (например,process_data,check_status). - Скрипты: используйте
lowercase_with_hyphens(например,backup-script.sh).
Единообразное форматирование и отступы
Единообразное форматирование, включая отступы и пробелы, значительно повышает читаемость. Представьте, каково читать книгу с непоследовательными отступами абзацев!
Основные рекомендации:
- Используйте для отступов 2 или 4 пробела (табуляция часто не рекомендуется).
- Делайте строки короткими (для терминалов хорошее практическое правило — не более 80 символов).
- Используйте пустые строки для разделения логических блоков кода.
- Выравнивайте связанные элементы, когда это уместно.
Единообразие важнее конкретного выбранного стиля.
Надёжность: «set -u» (nounset)
Параметр set -u (или set -o nounset) помогает предотвращать ошибки, вызванные опечатками или случайно не установленными переменными. Если скрипт пытается использовать переменную, которой не присвоено значение, set -u немедленно завершит скрипт с ошибкой.
Это помогает обнаруживать ошибки на раннем этапе и предотвращать неожиданное поведение дальше в скрипте.
Попробуйте выполнить приведённый ниже код. Он должен завершиться раньше времени, поскольку UNSET_NAME не определена.
#!/bin/bash
# Demonstrating 'set -u' (nounset)
set -u # Exit if an unset variable is used
MY_GREETING="Hello"
echo "${MY_GREETING}, CoddyKit!"
# This variable is NOT set. With 'set -u', the script will exit here.
echo "Your name is: ${UNSET_NAME}"
echo "This line will NOT be reached if 'set -u' is active and UNSET_NAME is indeed unset."Надёжность: «set -o pipefail»
Когда вы объединяете команды в конвейер (например, cmd1 | cmd2 | cmd3), Bash обычно сообщает только статус завершения последней команды в конвейере. Поэтому, если cmd1 завершится с ошибкой, а cmd2 и cmd3 успешно выполнятся, конвейер всё равно может сообщить об успехе!
set -o pipefail изменяет это поведение. Если любая команда в конвейере завершится с ошибкой (вернёт ненулевой статус завершения), статусом завершения всего конвейера станет это ненулевое значение.
Благодаря этому конвейеры становятся надёжнее: о сбое ранней команды сообщается сразу.
#!/bin/bash
# Demonstrating 'set -o pipefail'
set -o pipefail # Ensures pipe's exit status is the last non-zero command
echo "Running a failing command in a pipe:"
echo "---"
# 'false' command always fails (exit status 1).
# 'cat /dev/null' always succeeds (exit status 0).
# With 'set -o pipefail', the pipe's overall exit status will be 1 from 'false'.
false | cat /dev/null
# This line will only be reached if the pipe above succeeds.
echo "---"
echo "Script finished successfully (this line won't show if pipe failed with set -o pipefail)."Знакомство с ShellCheck
Даже при соблюдении лучших практик легко не заметить небольшие синтаксические ошибки или распространённые проблемы. Здесь на помощь приходит ShellCheck!
ShellCheck — это инструмент статического анализа (так называемый «линтер») для скриптов оболочки. Он читает ваш скрипт и указывает на:
- синтаксические ошибки;
- распространённые ошибки начинающих;
- скрытые проблемы смысла программы;
- проблемы переносимости между разными оболочками.
Он предлагает полезные исправления и часто предоставляет ссылки на более подробные объяснения.
ShellCheck в действии: плохой скрипт
Посмотрим на скрипт с несколькими распространёнными проблемами. Они могут не привести к немедленному сбою скрипта, но являются плохими практиками или потенциальными ошибками.
Представьте, что этот скрипт сохранён в файле bad_script.sh. Чтобы запустить для него ShellCheck, введите: shellcheck bad_script.sh
Попробуйте найти проблемы до запуска ShellCheck!
#!/bin/bash
# A script with some common issues
MY_NAME=coddykit # Variable assignment needs no space, but quoting is good for values
echo "Hello $MY_NAME!" # Missing quotes around variable expansion
if [ $1 = "admin" ]; then # Missing quotes around $1
echo "Welcome, administrator."
fi
# A simple loop with potential issues
for file in *.txt; do # Unquoted glob could expand to multiple arguments
echo File: $file # Missing quotes around $file
doneИсправление предупреждений ShellCheck
ShellCheck может вывести примерно такое сообщение: SC2086: Double quotes missing around "$MY_NAME". Часто он указывает конкретный код (например, SC2086), по которому можно найти подробности.
Вот предыдущий скрипт, исправленный согласно рекомендациям ShellCheck и общим передовым практикам:
Обратите внимание на двойные кавычки "" вокруг раскрытия переменных и подстановок команд: они предотвращают разбиение слов и раскрытие шаблонов, которые часто становятся источниками ошибок.
#!/bin/bash
# A script with issues fixed by ShellCheck
MY_NAME="CoddyKit" # Quote variable assignment values
echo "Hello ${MY_NAME}!" # Always quote variable expansions
if [ "$1" = "admin" ]; then # Quote positional parameters like $1
echo "Welcome, administrator."
fi
# A simple loop with corrected quoting
for file in *.txt; do
echo "File: ${file}" # Quote variable expansions, especially in loops
doneПроверка передовых практик
Какие из перечисленных ниже подходов считаются хорошими практиками при написании скриптов Bash?
Итоги: профессиональные скрипты
Поздравляем! Вы научились превращать скрипты Bash из просто работающих в профессиональные.
Мы рассмотрели:
- важность передовых практик для удобства чтения и сопровождения;
- использование комментариев и соглашений об именовании для ясности;
- повышение надёжности скриптов с помощью
set -uиset -o pipefail; - возможности ShellCheck для автоматического поиска проблем и улучшения кода.
Применяя эти принципы, вы будете писать более надёжные и понятные скрипты Bash, над которыми удобно работать вместе. Продолжайте практиковаться!
Часто задаваемые вопросы
Урок «Рекомендации по написанию скриптов и статический анализ» бесплатный?
Да — полный текст урока «Рекомендации по написанию скриптов и статический анализ» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Рекомендации по написанию скриптов и статический анализ»?
Изучите соглашения о написании кода, комментирование и инструменты вроде ShellCheck, чтобы создавать чистые, понятные скрипты Bash без ошибок. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Рекомендации по написанию скриптов и статический анализ»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Отладка скриптов Bash (set -x, trap)
- Обработка ошибок и статус выхода
- Рекомендации по написанию скриптов и статический анализ
- Тестирование скриптов Bash с помощью Bats