Bash-скрипты, часть 6: функции и разработка библиотек
catg () { cat $1 | grep --color=auto root } type catg
К моменту вызова функции она должна быть определена
#!/bin/bash catg () { cat $1 | grep --color=auto root } catg /etc/passwd
Команда return позволяет задавать возвращаемый функцией целочисленный код завершения. Максимальное число, которое может вернуть команда return — 255
#!/bin/bash function myfunc { read -p "Enter a value: " value echo "adding value" return $(( $value + 10 )) } myfunc echo "The new value is $?"
То, что возвратила функция, выводится командой echo с использованием переменной $?. Если вы выполните любую другую команду до извлечения из переменной $? значения, возвращённого функцией, это значение будет утеряно. Дело в том, что данная переменная хранит код возврата последней выполненной команды.
#!/bin/bash function myfunc { read -p "Enter a value: " value echo $(( $value + 10 )) } result=$( myfunc) echo "The value is $result"
Количество переданных функции аргументов можно узнать, обратившись к переменной $#
myfunc $val1 10 20
#!/bin/bash function addnum { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo -1 elif [ $# -eq 1 ] then echo $(( $1 + $1 )) else echo $(( $1 + $2 )) fi } echo -n "Adding 10 and 15: " value=$(addnum 10 15) echo $value echo -n "Adding one number: " value=$(addnum 10) echo $value echo -n "Adding no numbers: " value=$(addnum) echo $value echo -n "Adding three numbers: " value=$(addnum 10 15 20) echo $value
Функция не может напрямую работать с параметрами, которые переданы скрипту при его запуске из командной строки
#!/bin/bash function myfunc { echo $(( $1 + $2 )) } if [ $# -eq 2 ] then value=$( myfunc) echo "The result is $value" else echo "Usage: myfunc a b" fi
При запуске, а точнее, при вызове объявленной в нём функции, будет выведено сообщение об ошибке.
Надо так
#!/bin/bash function myfunc { echo $(( $1 + $2 )) } if [ $# -eq 2 ] then value=$(myfunc $1 $2) echo "The result is $value" else echo "Usage: myfunc a b" fi
Когда переменной присваивается новое значение в функции, это новое значение не теряется когда скрипт обращается к ней после завершения работы функции. Именно это можно видеть в предыдущем примере.
Что если такое поведение нас не устраивает? Ответ прост — надо использовать локальные переменные.
Переменные, которые объявляют и используют внутри функции, могут быть объявлены локальными. Для того, чтобы это сделать, используется ключевое слово local перед именем переменной:
local temp=$(( $value + 5 ))
#!/bin/bash function myfunc { local temp=$[ $value + 5 ] echo "The Temp from inside function is $temp" } temp=4 myfunc echo "The temp from outside is $temp"
Для того, чтобы получить доступ ко всем элементам массива в функции, из массива надо извлечь имеющиеся в нём данные и передать их функции как самостоятельные аргументы. Если надо, внутри функции полученные ей аргументы можно снова собрать в массив.
#!/bin/bash function myfunc { local newarray newarray=("$@") echo "The new array value is: ${newarray[*]}" } myarray=(1 2 3 4 5) echo "The original array is ${myarray[*]}" myfunc ${myarray[*]}
У команды source есть псевдоним — оператор «точка». Для того, чтобы подключить файл в скрипте, в скрипт надо добавить конструкцию такого вида:
. ./myscript
Предположим, что у нас имеется файл myfuncs, который содержит следующее:
function addnum { echo $(( $1 + $2 )) }
Это — библиотека. Воспользуемся ей в сценарии:
#!/bin/bash . ./myfuncs result=$(addnum 10 20) echo "The result is: $result"
Отредактируйте .bashrc, добавив в него такую строку (путь к файлу библиотеки в вашей системе, естественно, будет другим):
. /home/likegeeks/Desktop/myfuncs
Теперь функцию можно вызывать прямо из командной строки:
addnum 10 20
declare -f zzgrep