Функции

Тема дорожной карты · Bash

Функции в Bash инкапсулируют многократно используемую логику в именованные блоки, вызываемые как funcname arg1 arg2, что позволяет shell-скриптам избегать повторений и структурировать сложную автоматизацию Linux в читаемые и тестируемые единицы. Внутри функции Bash $1$9 (а также $@ для всех аргументов) ссылаются на собственные аргументы функции, а не на позиционные параметры скрипта, что обеспечивает чистую передачу аргументов независимо от контекста вызова. Возвращаемые значения из функций Bash — это целочисленные коды завершения через return N, тогда как строковые результаты передаются путём записи в stdout и захвата через result=$(funcname) — шаблон, центральный для проектирования компонуемых shell-скриптов. Объявление переменных как local внутри функций предотвращает перезапись ими глобальных переменных — это критически важная практика для предотвращения трудноуловимых ошибок в крупных Bash-скриптах автоматизации. Функции в Bash также могут храниться в библиотечных файлах и загружаться в скрипты с помощью source ./lib.sh, обеспечивая совместное использование общих утилит shell-скриптов Linux по всей кодовой базе.

Как это работает

Функции: 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 (тяжело тестировать).

Связанные понятия

Полезные ресурсы