Наверное, всем известно, что у оболочки Bash есть встроенные команды, которых нет в папках /bin или /usr/bin. Они встроены в оболочку и выполняются в виде функций. В одной из предыдущих статей мы рассматривали написание скриптов на Bash. Мы обговорили там почти все, как должны выглядеть скрипты, использование условий, циклов, переменных, но не останавливались на функциях.
В сегодняшней статье мы исправим этот недостаток. Как и в любом языке программирования, в Bash есть функции их может быть очень полезно использовать. Мы рассмотрим использование функций bash, как их писать и даже как создавать библиотеки из этих функций.
Содержание статьи
Написание функций Bash
Сначала нужно понять что такое функция в нашем контексте. Функция - это набор команд, объединенных одним именем, которые выполняют определенную задачу. Функция вызывается по ее имени, может принимать параметры и возвращать результат работы. Одним словом, функции Bash работают так же, как и в других языках программирования.
Синтаксис создания функции очень прост:
имя_функции() { список_команд }
Имя функции не должно совпадать ни с одной из существующих команд или функций, а все команды в теле функции пишутся с новой строки.
Простая функция
Давайте напишем небольшую функцию, которая будет выводить строку на экран:
vi function.sh
#!/bin/bash
#...
printstr(){ echo "hello world" } printstr
Вызов функции bash выполняется указанием ее имени, как для любой другой команды. Запустите наш скрипт на выполнение, не забывайте, что перед этим нужно дать ему права на выполнение:
chmod u+x function.sh
./function.sh

Все работает, теперь усложним задачу, попробуем передать функции аргументы.
Аргументы функции
Аргументы функции нужно передавать при вызове, а читаются они точно так же, как и аргументы скрипта. Синтаксис вызова функции с параметрами bash такой:
имя_функции аргумент1 аргумент2 ... аргументN
Как видите, все достаточно просто. Параметры разделяются пробелом. Теперь улучшим нашу функцию, чтобы она выводила заданную нами строку:
vi function.sh
#!/bin/bash
#...
printstr(){
echo $1
}
#...
printstr "Hello world"
Можно сделать, чтобы параметров было несколько:
#!/bin/bash
#...
printstr(){
echo $1
echo $2
echo $3
echo $5
}
#...
printstr "arg1" "arg2" "arg3" "arg4" "arg5"
./function.sh

Есть и другой способ извлекать аргументы, как в Си, с помощью стека. Мы извлекаем первый аргумент, затем сдвигаем указатель стека аргументов на единицу и снова извлекаем первый аргумент. И так далее:
#!/bin/bash
#...
printstr(){
echo $1
shift
echo $1
shift
echo $1
shift
echo $1
}
#..
printstr "arg1" "arg2" "arg3" "arg4"

Возврат результата функции
Вы можете не только использовать функции с параметрами bash, но и получить от нее результат работы. Для этого используется команда return. Она завершает функцию и возвращает числовое значение кода возврата. Он может быть от 0 до 255:
#!/bin/bash
#...
printstr(){
return 134;
}
#...
printstr echo $?

Если вам нужно применить возврат значения функции bash, а не статус код, используйте echo. Строка не сразу выводится в терминал, а возвращается в качестве результата функции и ее можно записать в переменную, а затем использовать:
#!/bin/bash
#...
printstr(){
echo "test"
}
#...
VAR=$(printstr)
echo $VAR

Экспорт функций
Вы можете сделать функцию доступной вне скрипта с помощью команды declare:
#!/bin/bash
#...
printstr(){
echo "hello world"
}
declare -x -f printstr
Затем запустите скрипт с помощью команды source:
source function.sh
printstr

Рекурсия
Вы можете вызвать функцию из нее же самой, чтобы сделать рекурсию:
#!/bin/bash
#...
printstr(){
echo "hello world"
printstr
}
printstr

Вы можете поэкспериментировать с использованием рекурсии, во многих случаях это может быть полезным, только не забывайте делать первый вызов функции Bash.
Локальные переменные в функции
Если вы объявите обычную переменную в функции, то она будет доступной во всем скрипте, это удобно для возврата значения функции, но иногда может понадобиться сделать локальную переменную. Для этого существует команда local:
#!/bin/bash
#...
printstr(){
local VAR=$1
echo ${VAR}
}
printstr "Hello World"

Библиотеки функций
Мы можем взять некоторые функции bash и объединить их в одну библиотеку, чтобы иметь возможность одной командой импортировать эти функции. Это делается похожим образом на экспорт функций. Сначала создадим файл библиотеки:
vi lib.sh
#!/bin/bash
#...
test1(){
echo "Hello World from 1";
}
test2(){
echo "Hello World from 2";
}
test3(){
echo "Hello World from 3";
}
Теперь создадим скрипт, который будет использовать наши функции. Импортировать библиотеку можно с помощью команды source или просто указав имя скрипта:
vi function.sh
#!/bin/bash
source lib.sh test1 test2 test3
Выводы
В этой статье мы рассмотрели функции bash, как их писать, применять и объединять в библиотеки. Если вы часто пишете скрипты на Bash, то эта информация будет для вас полезной. Вы можете создать свой набор функций, для использования их в каждом скрипте и тем самым облегчить себе работу.
продолжение в студию)