Функции bash в скриптах

Наверное, всем известно, что у оболочки 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, то эта информация будет для вас полезной. Вы можете создать свой набор функций, для использования их в каждом скрипте и тем самым облегчить себе работу.


Добавить комментарий

Автору будет очень приятно получить обратную связь.

Комментариев 0