Объявление функции
Тема дорожной карты · Bash
Для определения функций в Bash используется либо синтаксис с ключевым словом function name { ... }, либо переносимая форма name() { ...; } — оба варианта создают многократно используемые блоки логики shell-скриптов, вызываемые по имени из любого места скрипта. Функции Bash принимают аргументы через позиционные параметры $1, $2, $@ и $# — аналогично тому, как работают аргументы командной строки для скриптов, — и возвращают целочисленный код завершения через оператор return, который вызывающий код проверяет через $?. Хорошо определённая функция Bash объявляет все внутренние переменные как local, чтобы избежать побочных эффектов, делая shell-скрипты модульными и тестируемыми так же, как функции в языках высокого уровня. Функции в Bash могут быть экспортированы в дочерние процессы с помощью declare -x -f funcname, что позволяет фреймворкам автоматизации Linux совместно использовать вспомогательные функции в скриптах, подключаемых из общего библиотечного файла. Освоение определения функций в Bash — ключ к написанию организованных, не повторяющихся shell-скриптов, масштабируемых от небольших задач автоматизации до многосотстрочных производственных инструментов командной строки.
Как это работает
Объявление функции: function_name() { commands; } определяет функцию. Аргументы — $1, $2, …, $@. Возвращаемые значения — через exit-код (return N); для реальных данных echo в stdout + захват через $(func). Локальные переменные: local var=value. Функции не first-class — нельзя передавать, нет closures (shell не язык программирования в этом смысле).
Когда применять
Выносите функцию, когда (а) блок повторяется, (б) у него есть осмысленное имя. local для всех внутренних переменных функции (иначе утекают в caller). Echo данных + захват лучше установки глобальных vars + чтения. Не используйте функции для "скорости" — bash-вызовы функций дороги vs C; для горячих циклов перепишите на настоящем языке.
Типичные ошибки
Ловушки Объявление функции: забыли local и случайно модифицируют caller's $i (переменная цикла утекает); return "string" (return принимает только exit-код 0-255); функция зависит от cwd / глобального state без явного input (тяжело тестировать).