Как определять и использовать функции в Linux Shell Script
Функция — это многократно используемый блок кода. Часто мы помещаем повторяющийся код в функцию и вызываем эту функцию из разных мест. Библиотека — это набор функций. Мы можем определить часто используемую функцию в библиотеке, а другие сценарии могут использовать их без дублирования кода.
В этой статье мы подробнее поговорим о функциях и рецептах. В демонстрационных целях я буду использовать Bourne Again SHell (Bash) на машине Ubuntu.
Вызов функции
В оболочке функция вызова точно такая же, как и при вызове любой другой команды. Например, если имя вашей функции my_func, то ее можно выполнить следующим образом:
$ my_func
Если какая-либо функция принимает аргументы, они могут быть предоставлены из командной строки следующим образом:
$ my_func arg1 arg2 arg3
Определение функции
Мы можем использовать приведенный ниже синтаксис для определения функции:
function function_name { Body of function }
Тело функции может содержать любую допустимую команду, ограничение цикла, другую функцию или скрипт. Теперь давайте создадим простую функцию, которая выводит сообщение на экран.
function print_msg { echo "Hello, World" }
Теперь давайте выполним эту функцию:
$ print_msg
Hello, World
Как и ожидалось, эта функция отображает сообщение на экране.
В приведенном выше примере мы создали функцию прямо на терминале. Мы также можем сохранить эту функцию в файле. Пример ниже демонстрирует это.
#! /bin/bash function print_msg { echo "Hello, World" } print_msg
Мы определили эту функцию внутри файла function.sh . Теперь давайте выполним этот скрипт:
$ chmod +x function.sh $ ./function.sh Hello, World
Если вы заметили, вышеприведенный вывод точно идентичен предыдущему.
Подробнее о функциях
В предыдущем разделе мы определили очень простую функцию. Однако во время разработки программного обеспечения нам нужны более продвинутые функции, которые могут принимать различные параметры и возвращаемые значения. В этом разделе мы обсудим такие функции.
Передача аргументов функции
Мы можем предоставить аргументы для работы так же, как и другие команды. Мы можем получить доступ к этим аргументам из функции, используя символ доллара ($). Например, $ 1 представляет первый аргумент, $ 2 представляет второй аргумент и так далее.
Давайте изменим вышеуказанную функцию, чтобы принять сообщение в качестве аргумента. Наша модифицированная функция будет выглядеть так:
function print_msg { echo "Hello $1" }
В приведенной выше функции мы получаем доступ к первому аргументу, используя $ 1. Выполним эту функцию:
$ print_msg "Infoit"
Когда вы выполняете эту функцию, она генерирует следующий вывод:
Hello Infoit
Возврат значения из функции
Как и другие языки программирования, Bash предоставляет оператор return, с помощью которого мы можем возвращать значение вызывающей стороне. Давайте разберемся с этим на примере:
function func_return_value { return 10 }
Вышеупомянутая функция возвращает вызывающей стороне значение 10. Выполним эту функцию:
$ func_return_value $ echo "Value returned by function is: $?"
Когда вы выполняете указанную выше функцию, она генерирует следующий вывод:
Value returned by function is: 10
ПРИМЕЧАНИЕ. В bash мы должны использовать $? для захвата возвращаемого значения функции
Функциональные рецепты
Пока что мы получили хорошее представление о функциях bash. Теперь давайте создадим несколько полезных функций bash, которые могут облегчить нам жизнь.
Журналы
Давайте создадим функцию регистратора, которая будет печатать дату и время вместе с сообщением журнала.
function log_msg { echo "[`date '+ %F %T'` ]: $@" }
Выполним эту функцию:
$ log_msg "This is sample log message"
Когда вы выполняете эту функцию, она генерирует следующий вывод:
[ 2018-08-16 19:56:34 ]: This is sample log message
Отображение системной информации
Давайте создадим функцию для отображения информации о системе GNU / Linux
function system_info { echo "### OS information ###" lsb_release -a echo echo "### Processor information ###" processor=`grep -wc "processor" /proc/cpuinfo` model=`grep -w "model name" /proc/cpuinfo | awk -F: '{print $2}'` echo "Processor = $processor" echo "Model = $model" echo echo "### Memory information ###" total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'` free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'` echo "Total memory: $total kB" echo "Free memory : $free kB" }
Когда вы выполняете указанную выше функцию, она генерирует следующий вывод:
### OS information ### No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.1 LTS Release: 18.04 Codename: bionic ### Processor information ### Processor = 1 Model = Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz ### Memory information ### Total memory: 4015648 kB Free memory : 2915428 kB
Найти файл или каталог из текущего каталога
Ниже функция ищет файл или каталог из текущего каталога:
function search { find . -name $1 }
Давайте найдем каталог, а именно dir4, используя следующую команду:
$ search dir4
Когда вы выполните указанную выше команду, она выдаст следующий вывод:
./dir1/dir2/dir3/dir4
Цифровые часы
Функция ниже создает простые цифровые часы на терминале.
function digital_clock { clear while [ 1 ] do date +'%T' sleep 1 clear done }
Создание библиотеки
Библиотека — это набор функций. Чтобы создать библиотеку — определите функции в файле и импортируйте этот файл в текущую среду.
Предположим, мы определили все функции в файле utils.sh, а затем используем команду ниже для импорта функций в текущую среду:
$ source utils.sh
В дальнейшем вы можете выполнять любую функцию из библиотеки так же, как любую другую команду bash.
Заключение
В этой статье мы обсудили несколько полезных рецептов, которые повысят вашу продуктивность. Надеюсь, эта статья вдохновит вас на создание собственных рецептов.