Как определять и использовать функции в Linux Shell Script

Как определять и использовать функции в 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.

Заключение

В этой статье мы обсудили несколько полезных рецептов, которые повысят вашу продуктивность. Надеюсь, эта статья вдохновит вас на создание собственных рецептов.