Добавить в корзинуПозвонить
Найти в Дзене
Герман Геншин

Я больше не «копирую и вставляю»: одна хитрость в Bash избавила меня от рутинных повторов навсегда!

Если вы только начинаете разбираться в скриптах Bash, скорее всего, уже устали повторять одни и те же команды снова и снова. Но есть гораздо более удобный способ! Сейчас объясню, что значит принцип DRY и как функции помогут его воплотить. Мой первый опыт программирования был на Windows: я написал батник на скорую руку, напихал туда кучу однотипных инструкций с GOTO и так часто всё копировал, что в конце концов сам перестал понимать, что к чему. DRY расшифровывается как «Don’t Repeat Yourself», или по-простому — «не повторяйся». Именно для этого и нужны функции: чтобы больше не плодить дубли. Сейчас расскажу, как ими пользоваться. HTG Wrapped 2025: 24 дня техники 24 дня любимых гаджетов, железа и технологий Я люблю, когда всё показано на примерах, так что начнём с самого простого: «foo» — это название функции, так её и вызывают: Заметили? Мы вызвали функцию два раза, и каждый раз вывод получился одинаковым! Вот в чём удобство: любой полезный кусок кода превращается в мини-команду, кото
Оглавление

Если вы только начинаете разбираться в скриптах Bash, скорее всего, уже устали повторять одни и те же команды снова и снова. Но есть гораздо более удобный способ! Сейчас объясню, что значит принцип DRY и как функции помогут его воплотить.

Мой первый опыт программирования был на Windows: я написал батник на скорую руку, напихал туда кучу однотипных инструкций с GOTO и так часто всё копировал, что в конце концов сам перестал понимать, что к чему.

DRY расшифровывается как «Don’t Repeat Yourself», или по-простому — «не повторяйся». Именно для этого и нужны функции: чтобы больше не плодить дубли. Сейчас расскажу, как ими пользоваться.

-2

HTG Wrapped 2025: 24 дня техники

24 дня любимых гаджетов, железа и технологий

Кратко о функциях в Bash

Я люблю, когда всё показано на примерах, так что начнём с самого простого:

«foo» — это название функции, так её и вызывают:

-3

Заметили? Мы вызвали функцию два раза, и каждый раз вывод получился одинаковым! Вот в чём удобство: любой полезный кусок кода превращается в мини-команду, которую можно использовать везде и сколько угодно раз — никаких копирований.

Ещё вариант записи — через ключевое слово «function». Но такой подход может не работать в некоторых других оболочках.

Давайте посмотрим, чем функции реально могут быть вам полезны:

К примеру, вот простая функция, которая делает резервную копию файла «foo.txt», просто добавляя к имени слово «backup» и дату. В следующем разделе вы увидите, как сделать такую функцию универсальной для любых файлов.

-4

Функции могут быть большими, состоять из нескольких строк и работать как мини-скрипты или ваши собственные команды, которые всегда под рукой.

Как передавать аргументы в функцию

Главное преимущество функций — им можно передавать значения, то есть аргументы. (Если кто-то скажет «параметры» — это почти одно и то же, но мы остановимся на слове «аргументы».)

Смотрите на примере:

Переменные «${1}» и «${2}» отвечают за первый и второй аргумент, которые получает функция «foo». Вот так:

Не забудьте про кавычки! Они нужны для того, чтобы Bash передал аргумент так, как вам требуется. Например, фраза с пробелами или знаками останется одной строкой, а не разобьётся.

Такие значения называют строками. У меня есть ещё отдельная статья о работе со строками в Bash.

К позиционным параметрам в Bash относятся и «${1}», и «${2}», и другие. Но для старта вполне хватит этих двух.

Теперь модернизируем вариант из прошлого раздела, чтобы функция стала ещё полезнее:

Вот улучшенный скрипт для бэкапа: теперь функция принимает в качестве аргумента имя любого файла — достаточно указать путь. Всё, универсальный бэкап готов!

Кстати, почему вокруг «${1}» — двойные кавычки? Потому что так Bash заменяет переменную на её значение. Если поставить одинарные кавычки — будет просто текст, без подстановки. Ниже расскажу об этом подробнее.

-5

Я специально заменил команду «cp» на «echo», чтобы было наглядно видно, как Bash видит аргумент «${1}». Если обрамить его одинарными кавычками, всё останется текстом, переменные не подставятся. К теме переменных скоро ещё вернёмся.

И ещё один приём, чтобы ваш код был понятнее:

Вот так: «local file_path=${1}» — вы объявляете переменную и сохраняете туда аргумент функции. Это помогает сразу понять, что именно передаётся дальше по коду.

Давайте названия переменным, чтобы через месяц самому без подсказок разобраться, что и куда идёт. За это вы потом себя поблагодарите!

Как вернуть значение из функции

В Bash возвращать что-то из функции получается не так, как в других языках. По умолчанию возвращается только код завершения (целое число: обычно «0» — значит ок, любое другое — значит была ошибка). Вот пример:

-6

Оператор «&&» запускает команду «echo success» только если функция «foo» завершилась успешным кодом (ноль).

Если функция вернёт ошибку (например, 1) — никаких дальнейших команд выполняться не будет:

Запомните: «return» в Bash передаёт только код выхода из функции. Ни строки, ни текст вернуть этим способом нельзя.

Но всё равно можно получить от функции то, что нужно!

Подпишитесь — и станьте мастером Bash!

Подпишитесь — и станьте мастером Bash!

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

В Bash всё, что выводит команда — это просто строка! Любая команда что-то возвращает, и это «сообщение» можно использовать как результат. Точно так же и функции могут вернуть результат через «echo»:

-7

Если команда (например, «echo») не сработает — Bash всё равно отдаст её код возврата. А вы всегда можете явно вернуть свой через «return».

Теперь покажу, как обработать результат функции с помощью другой команды — это классика Bash:

-8

Команда «tr» сразу переводит результат работы функции «Hello, World!» в большие буквы. Через «echo» удобно возвращать строки — и тут же передавать их в любые другие команды!

А теперь усложним обработку результата:

-9

Функция формирует текст, «tr» переводит его в верхний регистр, а с помощью «sed» уже вне функции меняем «WORLD» на «UNIVERSE». Получается полноценная цепочка преобразований!

-10

3 секрета Bash, о которых должен знать каждый в Linux

Эти простые трюки откроют мощь Bash!

Функции Bash — это действительно мощный инструмент: с их помощью вы можете оборачивать любые цепочки команд, автоматизировать любые задачи и легко передавать параметры. В ответ они возвращают либо коды завершения, либо нужный результат через echo — как обычная команда.

В жизни функций Bash становится гораздо меньше рутины: вместо длинных запутанных команд вы просто вызываете свою функцию и подставляете нужные аргументы. Чаще всего такие функции удобно хранить в .bashrc — так они всегда под рукой, как родные встроенные команды. Или же добавьте их в отдельный скрипт, находящийся в вашем PATH.

-11

Как получить быстрый справочник по любой команде в Linux

Иногда без маленькой «шпаргалки» никуда!

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: