Писать Bash Сценарии могут быть сложными, если вы не знаете причуды и льготы. На моем родном языке мы используем идишеское слово для причудов и льгот; Это называется «Штицим» (множественное число «Штик» ). Готовы ли вы узнать больше о Bash’s «Shtickim»?
Этот блог пост является частью серии, над тем, что я работаю, чтобы сохранить знания для будущего меня, что забывает вещи, чтобы помочь новым коллегам и побаловать себя программистами, как вы, кто хочет любить Bash, как я. Так что давайте начнем, будем ли мы?
Это язык сценариев
Важно помнить, что Bash — это Язык сценариев , что означает, что он не предлагает стандартных функциональных возможностей, которые A Язык программирования Должен предложить, например:
- Объектно-ориентированное программирование не поддерживается в результате
- Нет внешних библиотек, таких как Python’s Запросы или узел Axios. Хотя можно использовать внешние приложения, такие как скручивание
- Переменные, набрав не поддерживается, и все значения оцениваются как строки . Однако можно использовать цифры с помощью определенных команд, таких как Испытание равенства с -eq и увеличивать переменную с ((var_name + 1)) Отказ Тем не менее, есть «слабый» способ объявления переменных типа с Объявить команду Отказ
- Ассоциативный массив Bash как Python’s Дикт или JavaScript’s Объект поддерживается из версии Bash V4.4 , и важно помнить, что MacOS поставляется с Bash V3.2 (Мы доберемся до этого в будущем в блоге этой серии)
- Нет «Источника истины» для съездования именования. Например, как бы вы назвали глобальную переменную?
Pascal_case?Snake_Case?Screaming_snake_case?
Как вы уже догадались, «программисты 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»