Рубрики
Uncategorized

Писать сценарии Bash, как Pro — Часть 1 — Руководство по стилю

Письменные сценарии Bash могут быть сложными, если вы не знаете овладений и льгот. На моем родном языке … с меткой Bash, программирование, учебник, DevOps.

Писать Bash Сценарии могут быть сложными, если вы не знаете причуды и льготы. На моем родном языке мы используем идишеское слово для причудов и льгот; Это называется «Штицим» (множественное число «Штик» ). Готовы ли вы узнать больше о Bash’s «Shtickim»?

Этот блог пост является частью серии, над тем, что я работаю, чтобы сохранить знания для будущего меня, что забывает вещи, чтобы помочь новым коллегам и побаловать себя программистами, как вы, кто хочет любить Bash, как я. Так что давайте начнем, будем ли мы?

Это язык сценариев

Важно помнить, что Bash — это Язык сценариев , что означает, что он не предлагает стандартных функциональных возможностей, которые A Язык программирования Должен предложить, например:

Как вы уже догадались, «программисты Bash» (если есть такая вещь) лицом много проблем. Вышеуказанный список — просто вершина айсберга.

Вот отличные сообщения в блоге, которые разделяют те же чувства, что и я делаю:

Теперь, когда мы охватывали тот факт, что я влюблен в Bash, я хочу поделиться этим чувством с вами; вот оно.

Переменные Наобщений Конвенция

Вот как я называю переменные в моих сценариях Bash

Окружающая обстановка Глобальный My_variable.
Глобальный Глобальный _My_variable.
Местный Функция my_variable.

У моих старых сценариев Bash имена переменных были трудно интерпретировать. Изменение этой конвенции о именовании помогло мне понять объем переменных и их цели.

Хорошие вибрации приложения

И, конечно, мы должны увидеть практический пример, поэтому вот как я реализую вышеуказанную конвенцию именования в моем good_vibes.sh применение.

good_vibes.sh

#!/usr/bin/env bash
# ^ This is called a Shebang
# I'll cover it in future blog posts


# Global variables are initialized by Env Vars.
# I'm setting a default value with "${VAR_NAME:-"DEFAULT_VALUE"}"
_USER_NAME="${USER_NAME:-"$USER"}"
_USER_AGE="${USER_AGE:-""}"


complement_name(){
  local name="$1"
  echo "Wow, ${name}, you have a beautiful name!"
}


complement_age(){
  local name="$1"
  local age="$2"
  if [[ "$age" -gt "30" ]]; then
    echo "Seriously ${name}? I thought you were $((age-7))"
  else
    echo "Such a weird age, are you sure it's a number?"
  fi
}


main(){
  # The only function that is not "pure"
  # This function is tightly coupled to the script
  complement_name "$_USER_NAME"
  complement_age "$_USER_NAME" "$_USER_AGE"
}


# Invokes the main function
main

good_vibes.sh — исполнение и вывод

export USER_NAME="Julia" USER_AGE="36" && \
bash good_vibes.sh

# Output
Wow, Julia, you have a beautiful name!
Seriously Julia? I thought you were 29

Давайте сломаем good_vibes.sh Приложение к «набору правил», которые могут быть реализованы в ваших сценариях.

Меж промежуток блока кода

Два (2) пустые строки между каждым блоком кода делают скрипт более читаемым.

Отступ

Я использую два (2) пробела, хотя это полностью нормально использовать четыре (4) пробелы для отступа. Просто убедитесь, что вы не смешиваете между ними.

Фигурные скобки

Если это $ {Переменная} объединяется со строкой Используйте фигурные брекеты, так как это облегчает чтение.

В случае, если это «$ Lonely_Variabian» Там нет необходимости в этом, как это поможет вам реализовать быстрее, если это «одинокое» или нет.

Основная цель для фигурных скобок предназначена для выполнения Расширение параметра оболочки Как продемонстрировано в глобальной партии инициализации переменных.

Квадратные скобки

Использование Двойной [[]] Квадратные скобки облегчают чтение условных блоков кода. Однако отметьте, что использование двойных квадратных скобок не поддерживается в Shell Sh. ; Вместо этого вы должны использовать отдельные скобки [ ] .

Чтобы продемонстрировать читабельность, вот «сложный» блок условного кода:

if [[ "$USER_NAME" = "Julia" || "$USER_NAME" = "Willy" ]] \
   && [[ "$USER_AGE" -gt "30" ]]; then
  echo "Easy to read right?"
fi

# Mind that `||` is replaced with `-o`, see https://acloudguru.com/blog/engineering/conditions-in-bash-scripting-if-statements
# Thank you William Pursell
if [ "$USER_NAME" = "Julia" -o "$USER_NAME" = "Willy" ] \
   && [ "$USER_AGE" -gt "30" ]; then
  echo "No idea why but I feel lost with single brackets."
fi

Если вы не заметили, вы только что узнали, что обозначает Или и && обозначает И Отказ И коротким -gt выражение означает больше чем при использовании номеров. Наконец, \ персонаж позволяет ломающиеся ряды

Shtick : Использование \ с дополнительным пространством \ <- Дополнительное пространство может привести к странным ошибкам. Убедитесь, что после этого нет конечных пробелов. \ Отказ

Я предполагаю, что используя [[]] Чувствуется более интуитивно понятным, так как большинство условных команд удвоится &&

Переменная инициализация

Глобальные переменные инициализируются с переменными среды и устанавливаются со значениями по умолчанию в случае пустых переменных среды.

Как уже упоминалось в good_vibes.sh Комментарии, я устанавливаю значение по умолчанию с

"${VAR_NAME:-"DEFAULT_VALUE"}"

В приведенном выше фрагменте текст Default_Value Харкодируется, и можно заменить его переменной. Например

_USER_NAME="${USER_NAME:-"$USER"}"

Функции и локальные функции переменные

Имена функций и Местный Имена переменных функций — Snake_Cased . Возможно, вы захотите изменить имена функций в нижний камелчан И, конечно, это ваш звонок.

Соединение Функции к скрипту является распространенной ошибкой, хотя я хочу время от времени, и вы увидите переменные в области глобальных/окружающей среды в моих функциях, но это происходит, когда я знаю, что «этот кусок кода не изменится много».

О, и убедитесь, что вы не используете $ 1 или любой другой аргумент напрямую; Всегда используйте Местный Отказ

_USER_NAME="${USER_NAME:-"$USER"}"

# Bad - coupled
coupled_username(){
  echo "_USER_NAME = ${_USER_NAME}"
}

# Good - decoupled
decoupled_username(){
  local name="$1"
  echo "name = ${name}" 
}

# Usage
coupled_username  
decoupled_username "$_USER_NAME"

Функциональное программирование

Эта тема относится к Функции и локальные функции Переменные , где функции являются как можно более «чистыми». Как вы можете видеть в good_vibes.sh почти все обернуто в функцию, кроме Инициализация глобальных переменных .

Я не вижу смысла написания init_vars Функция, чья цель состоит в том, чтобы иметь дело с глобальными переменными. Тем не менее, я нахожусь, добавляю Validate_vars Функция время от времени, которая проходит через глобальные переменные и подтверждает их значения. Я уверен, что есть место для обсуждения здесь, поэтому не стесняйтесь комментировать свои мысли.

Окончательные слова

«Хорошее приложение Vibes» в основном покрывает, как написать читаемый сценарий Bash, следующий за Функциональное программирование парадигма.

Если вы чувствуете, что есть необходимость изменить, как вы называете переменные и функции, идите на это! Пока легко понять ваш код, вы на правильном пути.

Следующие сообщения в блоге в этой серии будут охватывать следующие темы:

  • Обработка ошибок
  • Получение данных JSON с конечной точки HTTP
  • Фоновые работы и смотрите файл для изменений с овладеть
  • Git Repository Структура — добавление сценариев Bash в существующие репозитории или создание нового хранилища с помощью приложения Bash CLI
  • Публикация Bash CLI как Докер изображение

И больше, и больше … Я просто собираюсь выдвинуть все в блоге. Не стесняйтесь комментировать вопросы или предложения для моих следующих сообщений блога.

Оригинал: «https://dev.to/unfor19/writing-bash-scripts-like-a-pro-part-1-styling-guide-4bin»