0Pricing
DevOps Bootcamp · Урок

Рекомендации по написанию скриптов и статический анализ

Изучите соглашения о написании кода, комментирование и инструменты вроде 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 — локальная установка не требуется.

Все уроки этого курса

  1. Отладка скриптов Bash (set -x, trap)
  2. Обработка ошибок и статус выхода
  3. Рекомендации по написанию скриптов и статический анализ
  4. Тестирование скриптов Bash с помощью Bats
← Назад к DevOps Bootcamp