Функции в скриптах Bash
Организуйте код с помощью функций, повышая его повторное использование и делая скрипты более понятными и удобными в сопровождении.
«Функции в скриптах Bash» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Что такое функции Bash?
В сценариях Bash функция — это блок кода, выполняющий определённую задачу. Представьте её как небольшой сценарий внутри основного сценария.
Функции помогают:
- Повторно использовать код: написать фрагмент логики один раз и вызывать его многократно.
- Организовать сценарии: разбивать сложные задачи на небольшие, удобные для управления части.
- Повысить читаемость: сделать сценарий более понятным и удобным для сопровождения.
Определение простой функции
В Bash есть два распространённых способа определить функцию. Оба дают один и тот же результат. Чаще всего используется первый синтаксис.
Попробуйте запустить этот пример. Он определяет функции, но пока ещё не вызывает их!
#!/bin/bash
# Method 1: The most common way
my_first_func () {
echo "Hello from my_first_func!"
}
# Method 2: Using the 'function' keyword
function my_second_func {
echo "Hello from my_second_func!"
}
echo "Functions defined, but not called."Вызов функций
Определение функции не приводит к её выполнению. Чтобы запустить код внутри функции, достаточно вызвать её по имени, как любую другую команду.
Посмотрите, как после определения вызывается my_function:
#!/bin/bash
my_function () {
echo "This message is from inside the function."
}
echo "Script started."
my_function # Call the function here
echo "Script finished."Локальные переменные в функциях
По умолчанию переменные, определённые внутри функции Bash, являются глобальными, то есть обращаться к ним и изменять их можно из любой части сценария.
Чтобы избежать непреднамеренных побочных эффектов и сохранить функции изолированными, используйте ключевое слово local, объявляя переменную локальной. Локальные переменные существуют только внутри этой функции.
#!/bin/bash
global_message="I'm a global message"
my_function () {
local func_message="I'm a local message"
global_message="I've been changed by the function!"
echo "Inside func: $func_message"
echo "Inside func: $global_message"
}
echo "Before func: $global_message"
my_function
echo "After func: $global_message"
echo "After func: $func_message (This will be empty)"Передача аргументов функциям
В функции можно передавать информацию с помощью аргументов, как и обычным командам оболочки. Внутри функции к этим аргументам обращаются через специальные переменные:
$1,$2,$3...: отдельные аргументы$#: общее количество аргументов$@: все аргументы в виде отдельных строк
#!/bin/bash
greet_user () {
echo "Hello, $1!"
echo "You are $2 years old."
echo "Total arguments received: $#"
echo "All arguments: $@"
}
echo "Calling greet_user with two arguments:"
greet_user "Alice" 30
echo "\nCalling greet_user with one argument:"
greet_user "Bob"Код состояния завершения функции (возврат)
Функция, как и любая команда, возвращает код состояния завершения. По соглашению значение 0 означает успешное выполнение, а любое ненулевое значение указывает на ошибку.
Для установки этого кода состояния используется ключевое слово return. Затем его можно проверить с помощью специальной переменной $? сразу после вызова функции.
#!/bin/bash
check_age () {
local age=$1
if [ "$age" -ge 18 ]; then
return 0 # Success: 18 or older
else
return 1 # Failure: under 18
fi
}
check_age 25
echo "Exit status for 25: $?"
check_age 16
echo "Exit status for 16: $?"
if check_age 20; then
echo "User is an adult."
else
echo "User is a minor."
fiПолучение вывода функции
Команда return передаёт код состояния завершения. Если же функция должна вернуть «значение», которое можно сохранить в переменной, ей следует вывести это значение в стандартный вывод с помощью echo.
Затем этот вывод можно получить с помощью подстановки команды, заключив вызов функции в $(...).
#!/bin/bash
get_full_name () {
local first_name=$1
local last_name=$2
echo "$first_name $last_name" # Echo the full name
}
name="$(get_full_name "John" "Doe")"
echo "Full name captured: $name"
calculate_area () {
local length=$1
local width=$2
echo $((length * width))
}
area=$(calculate_area 10 5)
echo "Calculated area: $area"Практический пример: ведение журнала
Рассмотрим практический пример повторно используемой функции — простого средства ведения журнала. Эту функцию можно вызывать в любом месте сценария, чтобы выводить сообщения с отметкой времени и упростить отладку и отслеживание работы.
#!/bin/bash
log_message () {
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
local message="$1"
echo "[$timestamp] $message"
}
log_message "Script execution started."
sleep 1 # Simulate some work
log_message "Processing user data..."
sleep 1
log_message "Operation completed successfully."Рекомендации по работе с функциями
Чтобы писать понятные и удобные для сопровождения сценарии с функциями, воспользуйтесь следующими рекомендациями:
- Сохраняйте простоту: каждая функция должна хорошо выполнять одну задачу.
- Выбирайте понятные имена: используйте описательные имена, например
validate_inputилиcreate_backup. - Используйте
local: всегда объявляйте переменные внутри функций с помощьюlocal, чтобы избежать конфликтов. - Добавляйте комментарии: объясняйте, что делает функция, какие у неё аргументы и что она возвращает.
- Проверяйте ввод: если функция ожидает определённые аргументы, проверяйте их.
Проверка аргументов функции
Проверьте, насколько хорошо Вы понимаете передачу аргументов функциям Bash и обращение к ним внутри функций.
Функции: повторение и следующие шаги
Отличная работа! Вы освоили функции Bash.
Мы рассмотрели:
- определение и вызов функций;
- использование
localдля ограничения области видимости переменных; - передачу аргументов с помощью
$1,$#,$@; - установку кода состояния завершения с помощью
return; - получение вывода с помощью
echoи подстановки команды.
Функции необходимы для написания модульных, повторно используемых и удобных для сопровождения сценариев Bash. Продолжайте практиковаться, чтобы сделать свои сценарии более мощными и организованными!
Часто задаваемые вопросы
Урок «Функции в скриптах Bash» бесплатный?
Да — полный текст урока «Функции в скриптах Bash» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Функции в скриптах Bash»?
Организуйте код с помощью функций, повышая его повторное использование и делая скрипты более понятными и удобными в сопровождении. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Функции в скриптах Bash»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Циклические конструкции (for, while)
- Функции в скриптах Bash
- Аргументы и параметры скрипта ($@, $#, getopts)
- Оператор case и сопоставление с шаблонами