Функции в bash

 

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

Первый способ:

function имя_функции

{

тело функции

}

 

Второй способ:

имя_функции ()

{

тело функции

}

 

Вызывается функция по имени в любом месте скрипта, но только после описания самой функции. Функции также можно передавать параметры, которые задаются через пробел после вызова (имени) функции. Рассмотрим пример скрипта bash:

#!/bin/bash

function primer

{

if [ $# -ne 0 ]

then

local a=1

echo "Количество переданных параметров - $#"

for i in $@

do

echo "$a-й параметр - $i"

let a++

done

return 0

else

echo "Параметры не передавались"

return 1

fi

}

echo "Вызываем функцию с параметрами:"

primer a b c

echo $?

echo "Вызываем функцию без параметров:"

primer

echo $?

 

В данном примере задана функция с именем primer. Вызов функции с параметрами: primer a b c и без параметров: primer. В теле функции все конструкции вам должны быть знакомы, за исключением $#, $i и $@.

$# - возвращает количество параметров переданных функции. В нашем примере это будет число 3.

$@ -возвращает все параметры одной строкой. В примере это будет a b c.

А через $1, $2, $3 и т.д. можно обращаться к каждому параметру персонально.

$? - содержит код выполнения последней команды. В нашем примере код выполнения функции.

Функция может также возвращать числовое значение через ключевое слово return. Как правило возвращают 0, если функция выполнена без ошибок или отличное от нуля значение, если что-то пошло не так. В примере, в случае вызова функции с параметрами, идет возврат значения 0, а если функция вызывалась без параметров, то будет возврат кода 1.

Все, что касается передачи параметров в функцию, работает точно так же и для скрипта. Скрипту точно также можно передавать параметры и точно также манипулировать ими при помощи $#, $@, $N. Из этой же категории и вариант - $0 - который возвращает имя команды запустившей скрипт. Если скрипт запускался по команде ./script.sh, то echo $0 вернет значение ./script.sh, а если по команде /home/igor/linux/script.sh, то будет возвращено значение /home/igor/linux/script.sh.