Если вы только начинаете разбираться в скриптах Bash, скорее всего, уже устали повторять одни и те же команды снова и снова. Но есть гораздо более удобный способ! Сейчас объясню, что значит принцип DRY и как функции помогут его воплотить.
Мой первый опыт программирования был на Windows: я написал батник на скорую руку, напихал туда кучу однотипных инструкций с GOTO и так часто всё копировал, что в конце концов сам перестал понимать, что к чему.
DRY расшифровывается как «Don’t Repeat Yourself», или по-простому — «не повторяйся». Именно для этого и нужны функции: чтобы больше не плодить дубли. Сейчас расскажу, как ими пользоваться.
HTG Wrapped 2025: 24 дня техники
24 дня любимых гаджетов, железа и технологий
Кратко о функциях в Bash
Я люблю, когда всё показано на примерах, так что начнём с самого простого:
«foo» — это название функции, так её и вызывают:
Заметили? Мы вызвали функцию два раза, и каждый раз вывод получился одинаковым! Вот в чём удобство: любой полезный кусок кода превращается в мини-команду, которую можно использовать везде и сколько угодно раз — никаких копирований.
Ещё вариант записи — через ключевое слово «function». Но такой подход может не работать в некоторых других оболочках.
Давайте посмотрим, чем функции реально могут быть вам полезны:
К примеру, вот простая функция, которая делает резервную копию файла «foo.txt», просто добавляя к имени слово «backup» и дату. В следующем разделе вы увидите, как сделать такую функцию универсальной для любых файлов.
Функции могут быть большими, состоять из нескольких строк и работать как мини-скрипты или ваши собственные команды, которые всегда под рукой.
Как передавать аргументы в функцию
Главное преимущество функций — им можно передавать значения, то есть аргументы. (Если кто-то скажет «параметры» — это почти одно и то же, но мы остановимся на слове «аргументы».)
Смотрите на примере:
Переменные «${1}» и «${2}» отвечают за первый и второй аргумент, которые получает функция «foo». Вот так:
Не забудьте про кавычки! Они нужны для того, чтобы Bash передал аргумент так, как вам требуется. Например, фраза с пробелами или знаками останется одной строкой, а не разобьётся.
Такие значения называют строками. У меня есть ещё отдельная статья о работе со строками в Bash.
К позиционным параметрам в Bash относятся и «${1}», и «${2}», и другие. Но для старта вполне хватит этих двух.
Теперь модернизируем вариант из прошлого раздела, чтобы функция стала ещё полезнее:
Вот улучшенный скрипт для бэкапа: теперь функция принимает в качестве аргумента имя любого файла — достаточно указать путь. Всё, универсальный бэкап готов!
Кстати, почему вокруг «${1}» — двойные кавычки? Потому что так Bash заменяет переменную на её значение. Если поставить одинарные кавычки — будет просто текст, без подстановки. Ниже расскажу об этом подробнее.
Я специально заменил команду «cp» на «echo», чтобы было наглядно видно, как Bash видит аргумент «${1}». Если обрамить его одинарными кавычками, всё останется текстом, переменные не подставятся. К теме переменных скоро ещё вернёмся.
И ещё один приём, чтобы ваш код был понятнее:
Вот так: «local file_path=${1}» — вы объявляете переменную и сохраняете туда аргумент функции. Это помогает сразу понять, что именно передаётся дальше по коду.
Давайте названия переменным, чтобы через месяц самому без подсказок разобраться, что и куда идёт. За это вы потом себя поблагодарите!
Как вернуть значение из функции
В Bash возвращать что-то из функции получается не так, как в других языках. По умолчанию возвращается только код завершения (целое число: обычно «0» — значит ок, любое другое — значит была ошибка). Вот пример:
Оператор «&&» запускает команду «echo success» только если функция «foo» завершилась успешным кодом (ноль).
Если функция вернёт ошибку (например, 1) — никаких дальнейших команд выполняться не будет:
Запомните: «return» в Bash передаёт только код выхода из функции. Ни строки, ни текст вернуть этим способом нельзя.
Но всё равно можно получить от функции то, что нужно!
Подпишитесь — и станьте мастером Bash!
Подпишитесь — и станьте мастером Bash!
Оформляя подписку, вы соглашаетесь получать письма и принимаете условия пользования сайтом и политику конфиденциальности. Отписаться можно в любой момент.
В Bash всё, что выводит команда — это просто строка! Любая команда что-то возвращает, и это «сообщение» можно использовать как результат. Точно так же и функции могут вернуть результат через «echo»:
Если команда (например, «echo») не сработает — Bash всё равно отдаст её код возврата. А вы всегда можете явно вернуть свой через «return».
Теперь покажу, как обработать результат функции с помощью другой команды — это классика Bash:
Команда «tr» сразу переводит результат работы функции «Hello, World!» в большие буквы. Через «echo» удобно возвращать строки — и тут же передавать их в любые другие команды!
А теперь усложним обработку результата:
Функция формирует текст, «tr» переводит его в верхний регистр, а с помощью «sed» уже вне функции меняем «WORLD» на «UNIVERSE». Получается полноценная цепочка преобразований!
3 секрета Bash, о которых должен знать каждый в Linux
Эти простые трюки откроют мощь Bash!
Функции Bash — это действительно мощный инструмент: с их помощью вы можете оборачивать любые цепочки команд, автоматизировать любые задачи и легко передавать параметры. В ответ они возвращают либо коды завершения, либо нужный результат через echo — как обычная команда.
В жизни функций Bash становится гораздо меньше рутины: вместо длинных запутанных команд вы просто вызываете свою функцию и подставляете нужные аргументы. Чаще всего такие функции удобно хранить в .bashrc — так они всегда под рукой, как родные встроенные команды. Или же добавьте их в отдельный скрипт, находящийся в вашем PATH.
Как получить быстрый справочник по любой команде в Linux
Иногда без маленькой «шпаргалки» никуда!
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru