Функции оболочки (Shell Functions)

ShellShellBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) мы рассмотрим функции оболочки (shell functions) в Linux. Функции оболочки - это повторно используемые блоки кода, выполняющие определенные задачи, что делает наши скрипты более организованными и эффективными. Мы научимся создавать, вызывать и использовать функции с параметрами в скриптах оболочки. Эта лабораторная работа предназначена для начинающих, поэтому мы будем действовать постепенно и подробно объяснять каждую концепцию.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 94%. Он получил 99% положительных отзывов от учащихся.

Создание вашей первой функции оболочки (shell function)

Начнем с создания простой функции оболочки. Функции оболочки похожи на мини-скрипты внутри более крупного скрипта и позволяют группировать команды, выполняющие определенную задачу.

Сначала нам нужно создать новый файл. Откройте терминал и введите:

cd ~/project
touch functions.sh

Эта команда переходит в каталог project и создает новый файл с именем functions.sh. В этом файле будут храниться наши функции оболочки.

Теперь добавим нашу первую функцию:

#!/bin/bash

## Это простая функция
greet() {
  echo "Hello, World!"
}

## Эта строка вызывает (запускает) функцию
greet

Разберем это на части:

  • Первая строка #!/bin/bash называется шебанг (shebang). Она сообщает системе, что для интерпретации этого скрипта нужно использовать bash.
  • Мы определяем нашу функцию с помощью greet() { }. Все, что находится между фигурными скобками, является частью функции.
  • Внутри функции у нас есть простая команда echo, которая выводит "Hello, World!".
  • Последняя строка greet вызывает (запускает) нашу функцию.

Теперь сделаем наш скрипт исполняемым и запустим его:

chmod +x functions.sh
./functions.sh

Вы должны увидеть:

Hello, World!

Если вы не видите такой вывод, перепроверьте, что вы правильно ввели все в файле functions.sh.

Функции с параметрами

Теперь, когда мы создали базовую функцию, сделаем ее более гибкой, добавив параметры. Параметры позволяют передавать информацию в наши функции.

Откройте снова файл functions.sh и замените его содержимое следующим кодом:

#!/bin/bash

## Функция с параметром
greet() {
  echo "Hello, $1!"
}

## Функция с несколькими параметрами
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## Вызов функций с аргументами
greet "Alice"
calculate 5 3

Рассмотрим этот код:

  • В функции greet $1 ссылается на первый аргумент, переданный в функцию.
  • В функции calculate $1 и $2 ссылаются соответственно на первый и второй аргументы.
  • $(($1 + $2)) выполняет арифметическое сложение двух параметров.
./functions.sh

Вы должны увидеть:

Hello, Alice!
The sum of 5 and 3 is 8

Если вы не видите такой вывод, убедитесь, что вы правильно сохранили изменения в файле.

Возвращаемые значения из функций

В скриптинге оболочки (shell scripting) функции не возвращают значения так же, как в других языках программирования. Вместо этого они могут либо вывести результат с помощью команды echo, который можно перехватить, либо изменить глобальную переменную. Исследуем оба метода.

Откройте снова файл functions.sh и обновите его содержимое следующим кодом:

#!/bin/bash

## Функция, которая выводит результат с помощью echo
get_square() {
  echo $(($1 * $1))
}

## Функция, которая изменяет глобальную переменную
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## Перехват вывода, полученного с помощью echo
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## Использование функции для изменения глобальной переменной
set_global_result 6
echo "The square of 6 is $RESULT"

Разберем это на части:

  • Функция get_square использует echo для вывода результата, который мы перехватываем с помощью синтаксиса $().
  • Функция set_global_result изменяет глобальную переменную RESULT.
  • Мы используем $() для перехвата вывода функции get_square в переменную.
  • Мы вызываем функцию set_global_result, которая изменяет переменную RESULT, а затем выводим значение RESULT.

Сохраните файл и запустите его:

./functions.sh

Вы должны увидеть:

The square of 5 is 25
The square of 6 is 36

Если вы не видите такой вывод, перепроверьте файл functions.sh на наличие опечаток.

Понимание области видимости переменных

В скриптах оболочки (shell scripts) переменные по умолчанию являются глобальными. Это означает, что к ним можно обращаться из любого места в скрипте. Однако вы можете использовать ключевое слово local для создания переменных, доступных только внутри функции. Это называется локальной областью видимости (local scope).

Давайте изменим наш файл functions.sh, чтобы продемонстрировать этот концепт.

Обновите содержимое следующим кодом:

#!/bin/bash

## Глобальная переменная
GLOBAL_VAR="I'm global"

## Функция с локальной переменной
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## Вызов функции
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

Вот что происходит в этом скрипте:

  • Мы определяем глобальную переменную GLOBAL_VAR.
  • Внутри функции demonstrate_scope мы определяем локальную переменную LOCAL_VAR с использованием ключевого слова local.
  • Мы выводим обе переменные внутри функции.
  • После вызова функции мы пытаемся снова вывести обе переменные вне функции.

Сохраните файл и запустите его:

./functions.sh

Вы должны увидеть вывод, похожий на следующий:

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

Обратите внимание, что LOCAL_VAR пуста, когда к ней обращаются вне функции. Это потому, что локальные переменные доступны только внутри функции, где они определены.

Продвинутая функция - ENGLISH_CALC

Теперь, когда мы изучили основы функций оболочки (shell functions), давайте создадим более продвинутую функцию под названием ENGLISH_CALC. Эта функция будет принимать три аргумента: два числа и операцию (plus - сложение, minus - вычитание или times - умножение).

Замените содержимое следующим кодом:

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## Тестирование функции
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## Эта строка должна показать сообщение об ошибке

Разберем эту функцию на части:

  • Мы используем локальные (local) переменные для хранения входных данных и результатов. Это хорошая практика, чтобы избежать конфликтов с глобальными переменными.
  • Мы используем оператор case для обработки различных операций. Это похоже на оператор switch в других языках.
  • Для каждой допустимой операции мы выполняем вычисление и выводим результат с помощью echo.
  • Если указана недопустимая операция, мы выводим сообщение об ошибке и возвращаем 1 (в скриптах оболочки ненулевое возвращаемое значение указывает на ошибку).
  • В конце мы тестируем нашу функцию с различными входными данными, включая недопустимую операцию.

Сохраните файл и запустите его:

./functions.sh

Вы должны увидеть следующий вывод:

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

Если вы не видите такой вывод, перепроверьте файл functions.sh на наличие опечаток.

Резюме

В этом практическом занятии (lab) мы изучили функции оболочки (shell functions) в Linux, начиная с основ и переходя к более продвинутым концепциям. Мы научились:

  1. Создавать и вызывать простые функции
  2. Работать с параметрами функций
  3. Возвращать значения из функций с использованием echo и глобальных переменных
  4. Понимать область видимости переменных и использовать локальные переменные
  5. Создавать более сложные функции, обрабатывающие арифметические операции

Функции оболочки - это мощные инструменты, которые помогут вам писать более организованный, эффективный и повторно используемый код. Они позволяют разбить сложные скрипты на более мелкие, управляемые части, что делает ваши скрипты легче для понимания и поддержки.

Освоив функции оболочки, вы сможете писать более сложные скрипты оболочки и автоматизировать сложные задачи более эффективно в среде Linux. Помните, что практика - ключ к мастерству в скриптинге оболочки. Попробуйте изменить функции, которые мы создали, или создайте свои собственные, чтобы решить конкретные проблемы, с которыми вы сталкиваетесь при работе с Linux.